From 2ccac3e3e232c77202a8478b9c48dd870b329413 Mon Sep 17 00:00:00 2001 From: Niels Vanpachtenbeke <10651054+Nielsvanpach@users.noreply.github.com> Date: Wed, 19 Jan 2022 10:01:32 +0100 Subject: [PATCH 1/2] use PSR12 instead of PSR2 PSR2 is deprecated in favor of PSR12 --- .github/workflows/lint.yml | 7 +-- phpcs.xml | 2 +- src/Fakes/FakeModelsCommand.php | 3 +- src/Handlers/Application/ContainerHandler.php | 3 +- src/Handlers/Application/OffsetHandler.php | 1 + src/Handlers/Eloquent/ModelMethodHandler.php | 10 ++-- .../Eloquent/ModelPropertyAccessorHandler.php | 1 + .../ModelRelationshipPropertyHandler.php | 9 ++-- .../Eloquent/RelationsMethodHandler.php | 9 ++-- .../Eloquent/Schema/SchemaAggregator.php | 51 ++++++++++++------- src/Handlers/Eloquent/Schema/SchemaTable.php | 6 +-- src/Handlers/Helpers/PathHandler.php | 9 ++-- src/Handlers/Helpers/RedirectHandler.php | 7 +-- src/Handlers/Helpers/TransHandler.php | 4 +- src/Handlers/Helpers/UrlHandler.php | 6 ++- src/Handlers/Helpers/ViewHandler.php | 4 +- src/Handlers/SuppressHandler.php | 1 + src/Plugin.php | 7 +-- src/Providers/ApplicationProvider.php | 11 ++-- src/Providers/FacadeStubProvider.php | 1 + src/Providers/ModelStubProvider.php | 2 +- src/Providers/ViewFactoryProvider.php | 3 +- src/Util/ContainerResolver.php | 5 +- src/Util/ProxyMethodReturnTypeProvider.php | 17 ++++--- 24 files changed, 112 insertions(+), 67 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 14c7536d..07a5637f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -3,15 +3,16 @@ name: PHPCS check on: push: pull_request: - schedule: - - cron: '0 0 * * *' jobs: phpcs: name: PHPCS runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/phpcs.xml b/phpcs.xml index 8641ed6a..64e31b95 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -1,7 +1,7 @@ - + diff --git a/src/Fakes/FakeModelsCommand.php b/src/Fakes/FakeModelsCommand.php index 6dcc7315..1350608e 100644 --- a/src/Fakes/FakeModelsCommand.php +++ b/src/Fakes/FakeModelsCommand.php @@ -7,6 +7,7 @@ use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Str; use Psalm\LaravelPlugin\Handlers\Eloquent\Schema\SchemaAggregator; + use function config; use function get_class; use function implode; @@ -37,7 +38,7 @@ public function getModels() * * @param Model $model */ - protected function getPropertiesFromTable($model) : void + protected function getPropertiesFromTable($model): void { $table_name = $model->getTable(); diff --git a/src/Handlers/Application/ContainerHandler.php b/src/Handlers/Application/ContainerHandler.php index b91382ee..61427796 100644 --- a/src/Handlers/Application/ContainerHandler.php +++ b/src/Handlers/Application/ContainerHandler.php @@ -17,6 +17,7 @@ use Psalm\Type\Union; use ReflectionClass; use Throwable; + use function array_filter; use function array_keys; use function get_class; @@ -54,7 +55,7 @@ public static function getClassLikeNames(): array return [get_class(ApplicationProvider::getApp())]; } - public static function getMethodReturnType(MethodReturnTypeProviderEvent $event) : ?Type\Union + public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Type\Union { // lumen doesn't have the likes of makeWith, so we will ensure these methods actually exist on the underlying // app contract diff --git a/src/Handlers/Application/OffsetHandler.php b/src/Handlers/Application/OffsetHandler.php index f4fbb332..3902a92a 100644 --- a/src/Handlers/Application/OffsetHandler.php +++ b/src/Handlers/Application/OffsetHandler.php @@ -14,6 +14,7 @@ use Psalm\Plugin\EventHandler\MethodReturnTypeProviderInterface; use Psalm\Plugin\EventHandler\MethodVisibilityProviderInterface; use Psalm\Type; + use function in_array; final class OffsetHandler implements diff --git a/src/Handlers/Eloquent/ModelMethodHandler.php b/src/Handlers/Eloquent/ModelMethodHandler.php index 9ca41043..aa9629af 100644 --- a/src/Handlers/Eloquent/ModelMethodHandler.php +++ b/src/Handlers/Eloquent/ModelMethodHandler.php @@ -1,4 +1,6 @@ -getSource(); @@ -73,7 +76,8 @@ public static function getMethodReturnType(MethodReturnTypeProviderEvent $event) public static function afterClassLikeVisit(AfterClassLikeVisitEvent $event) { $storage = $event->getStorage(); - if ($event->getStmt() instanceof Class_ + if ( + $event->getStmt() instanceof Class_ && !$storage->abstract && isset($storage->parent_classes[strtolower(Model::class)]) ) { diff --git a/src/Handlers/Eloquent/ModelPropertyAccessorHandler.php b/src/Handlers/Eloquent/ModelPropertyAccessorHandler.php index 71c9814b..33fb48b1 100644 --- a/src/Handlers/Eloquent/ModelPropertyAccessorHandler.php +++ b/src/Handlers/Eloquent/ModelPropertyAccessorHandler.php @@ -11,6 +11,7 @@ use Psalm\Plugin\EventHandler\PropertyTypeProviderInterface; use Psalm\Plugin\EventHandler\PropertyVisibilityProviderInterface; use Psalm\Type; + use function str_replace; final class ModelPropertyAccessorHandler implements PropertyExistenceProviderInterface, PropertyVisibilityProviderInterface, PropertyTypeProviderInterface diff --git a/src/Handlers/Eloquent/ModelRelationshipPropertyHandler.php b/src/Handlers/Eloquent/ModelRelationshipPropertyHandler.php index 229078cd..6ab89b16 100644 --- a/src/Handlers/Eloquent/ModelRelationshipPropertyHandler.php +++ b/src/Handlers/Eloquent/ModelRelationshipPropertyHandler.php @@ -20,6 +20,7 @@ use Psalm\Type; use Psalm\Type\Atomic\TGenericObject; use Psalm\Type\Union; + use function in_array; class ModelRelationshipPropertyHandler implements @@ -28,12 +29,12 @@ class ModelRelationshipPropertyHandler implements PropertyTypeProviderInterface { /** @return array */ - public static function getClassLikeNames() : array + public static function getClassLikeNames(): array { return ModelStubProvider::getModelClasses(); } - public static function doesPropertyExist(PropertyExistenceProviderEvent $event) : ?bool + public static function doesPropertyExist(PropertyExistenceProviderEvent $event): ?bool { $source = $event->getSource(); @@ -58,7 +59,7 @@ public static function doesPropertyExist(PropertyExistenceProviderEvent $event) return null; } - public static function isPropertyVisible(PropertyVisibilityProviderEvent $event) : ?bool + public static function isPropertyVisible(PropertyVisibilityProviderEvent $event): ?bool { if (!$event->isReadMode()) { return null; @@ -86,7 +87,7 @@ public static function isPropertyVisible(PropertyVisibilityProviderEvent $event) * * @return ?Union */ - public static function getPropertyType(PropertyTypeProviderEvent $event) : ?Union + public static function getPropertyType(PropertyTypeProviderEvent $event): ?Union { $source = $event->getSource(); diff --git a/src/Handlers/Eloquent/RelationsMethodHandler.php b/src/Handlers/Eloquent/RelationsMethodHandler.php index 32c7cbd6..7ea0b6c4 100644 --- a/src/Handlers/Eloquent/RelationsMethodHandler.php +++ b/src/Handlers/Eloquent/RelationsMethodHandler.php @@ -1,4 +1,6 @@ -getSource(); @@ -57,7 +59,8 @@ public static function getMethodReturnType(MethodReturnTypeProviderEvent $event) // If this method name is on the builder object, proxy it over there - if ($source->getCodebase()->methods->methodExists(new MethodIdentifier(Builder::class, $method_name_lowercase)) || + if ( + $source->getCodebase()->methods->methodExists(new MethodIdentifier(Builder::class, $method_name_lowercase)) || $source->getCodebase()->methods->methodExists(new MethodIdentifier(QueryBuilder::class, $method_name_lowercase)) ) { $template_type_parameters = $event->getTemplateTypeParameters(); diff --git a/src/Handlers/Eloquent/Schema/SchemaAggregator.php b/src/Handlers/Eloquent/Schema/SchemaAggregator.php index 17436691..58996564 100644 --- a/src/Handlers/Eloquent/Schema/SchemaAggregator.php +++ b/src/Handlers/Eloquent/Schema/SchemaAggregator.php @@ -5,6 +5,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; use PhpParser; + use function count; use function is_string; use function strtolower; @@ -17,7 +18,7 @@ class SchemaAggregator /** * @param array $stmts */ - public function addStatements(array $stmts) : void + public function addStatements(array $stmts): void { foreach ($stmts as $stmt) { if ($stmt instanceof PhpParser\Node\Stmt\Class_) { @@ -29,10 +30,11 @@ public function addStatements(array $stmts) : void /** * @param array $stmts */ - private function addClassStatements(array $stmts) : void + private function addClassStatements(array $stmts): void { foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\ClassMethod + if ( + $stmt instanceof PhpParser\Node\Stmt\ClassMethod && $stmt->name->name === 'up' && $stmt->stmts ) { @@ -44,10 +46,11 @@ private function addClassStatements(array $stmts) : void /** * @param array $stmts */ - private function addUpMethodStatements(array $stmts) : void + private function addUpMethodStatements(array $stmts): void { foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Expression + if ( + $stmt instanceof PhpParser\Node\Stmt\Expression && $stmt->expr instanceof PhpParser\Node\Expr\StaticCall && $stmt->expr->class instanceof PhpParser\Node\Name && $stmt->expr->name instanceof PhpParser\Node\Identifier @@ -74,9 +77,10 @@ private function addUpMethodStatements(array $stmts) : void } } - private function alterTable(PhpParser\Node\Expr\StaticCall $call, bool $creating) : void + private function alterTable(PhpParser\Node\Expr\StaticCall $call, bool $creating): void { - if (!isset($call->args[0]) + if ( + !isset($call->args[0]) || !$call->args[0] instanceof PhpParser\Node\Arg || !$call->args[0]->value instanceof PhpParser\Node\Scalar\String_ ) { @@ -89,7 +93,8 @@ private function alterTable(PhpParser\Node\Expr\StaticCall $call, bool $creating $this->tables[$table_name] = new SchemaTable($table_name); } - if (!isset($call->args[1]) + if ( + !isset($call->args[1]) || !$call->args[1] instanceof PhpParser\Node\Arg || !$call->args[1]->value instanceof PhpParser\Node\Expr\Closure || count($call->args[1]->value->params) < 1 @@ -102,7 +107,8 @@ private function alterTable(PhpParser\Node\Expr\StaticCall $call, bool $creating $update_closure = $call->args[1]->value; - if ($call->args[1]->value->params[0]->var instanceof PhpParser\Node\Expr\Variable + if ( + $call->args[1]->value->params[0]->var instanceof PhpParser\Node\Expr\Variable && is_string($call->args[1]->value->params[0]->var->name) ) { $call_arg_name = $call->args[1]->value->params[0]->var->name; @@ -111,9 +117,10 @@ private function alterTable(PhpParser\Node\Expr\StaticCall $call, bool $creating } } - private function dropTable(PhpParser\Node\Expr\StaticCall $call) : void + private function dropTable(PhpParser\Node\Expr\StaticCall $call): void { - if (!isset($call->args[0]) + if ( + !isset($call->args[0]) || !$call->args[0] instanceof PhpParser\Node\Arg || !$call->args[0]->value instanceof PhpParser\Node\Scalar\String_ ) { @@ -125,9 +132,10 @@ private function dropTable(PhpParser\Node\Expr\StaticCall $call) : void unset($this->tables[$table_name]); } - private function renameTable(PhpParser\Node\Expr\StaticCall $call) : void + private function renameTable(PhpParser\Node\Expr\StaticCall $call): void { - if (!isset($call->args[0], $call->args[1]) + if ( + !isset($call->args[0], $call->args[1]) || !$call->args[0] instanceof PhpParser\Node\Arg || !$call->args[0]->value instanceof PhpParser\Node\Scalar\String_ || !$call->args[1] instanceof PhpParser\Node\Arg @@ -152,7 +160,7 @@ private function renameTable(PhpParser\Node\Expr\StaticCall $call) : void $this->tables[$new_table_name] = $table; } - private function processColumnUpdates(string $table_name, string $call_arg_name, array $stmts) : void + private function processColumnUpdates(string $table_name, string $call_arg_name, array $stmts): void { if (!isset($this->tables[$table_name])) { return; @@ -161,7 +169,8 @@ private function processColumnUpdates(string $table_name, string $call_arg_name, $table = $this->tables[$table_name]; foreach ($stmts as $stmt) { - if ($stmt instanceof PhpParser\Node\Stmt\Expression + if ( + $stmt instanceof PhpParser\Node\Stmt\Expression && $stmt->expr instanceof PhpParser\Node\Expr\MethodCall && $stmt->expr->name instanceof PhpParser\Node\Identifier ) { @@ -172,7 +181,8 @@ private function processColumnUpdates(string $table_name, string $call_arg_name, $nullable = false; while ($root_var instanceof PhpParser\Node\Expr\MethodCall) { - if ($root_var->name instanceof PhpParser\Node\Identifier + if ( + $root_var->name instanceof PhpParser\Node\Identifier && $root_var->name->name === 'nullable' ) { $nullable = true; @@ -182,7 +192,8 @@ private function processColumnUpdates(string $table_name, string $call_arg_name, $root_var = $root_var->var; } - if ($root_var instanceof PhpParser\Node\Expr\Variable + if ( + $root_var instanceof PhpParser\Node\Expr\Variable && $root_var->name === $call_arg_name && $first_method_call->name instanceof PhpParser\Node\Identifier ) { @@ -190,7 +201,8 @@ private function processColumnUpdates(string $table_name, string $call_arg_name, $second_arg = $first_method_call->args[1]->value ?? null; if (!$first_arg instanceof PhpParser\Node\Scalar\String_) { - if ($first_method_call->name->name === 'timestamps' + if ( + $first_method_call->name->name === 'timestamps' || $first_method_call->name->name === 'timestampsTz' || $first_method_call->name->name === 'nullableTimestamps' || $first_method_call->name->name === 'nullableTimestampsTz' @@ -228,7 +240,8 @@ private function processColumnUpdates(string $table_name, string $call_arg_name, } continue; - } elseif ($first_method_call->name->name === 'softDeletes' + } elseif ( + $first_method_call->name->name === 'softDeletes' || $first_method_call->name->name === 'softDeletesTz' || $first_method_call->name->name === 'dropSoftDeletes' || $first_method_call->name->name === 'dropSoftDeletesTz' diff --git a/src/Handlers/Eloquent/Schema/SchemaTable.php b/src/Handlers/Eloquent/Schema/SchemaTable.php index 5bc4d006..fce73dd2 100644 --- a/src/Handlers/Eloquent/Schema/SchemaTable.php +++ b/src/Handlers/Eloquent/Schema/SchemaTable.php @@ -15,12 +15,12 @@ public function __construct(string $name) $this->name = $name; } - public function setColumn(SchemaColumn $column) : void + public function setColumn(SchemaColumn $column): void { $this->columns[$column->name] = $column; } - public function renameColumn(string $old_name, string $new_name) : void + public function renameColumn(string $old_name, string $new_name): void { if (!isset($this->columns[$old_name])) { return; @@ -35,7 +35,7 @@ public function renameColumn(string $old_name, string $new_name) : void $this->columns[$new_name] = $old_column; } - public function dropColumn(string $column_name) : void + public function dropColumn(string $column_name): void { unset($this->columns[$column_name]); } diff --git a/src/Handlers/Helpers/PathHandler.php b/src/Handlers/Helpers/PathHandler.php index 6b5d6f31..ac6ffb13 100644 --- a/src/Handlers/Helpers/PathHandler.php +++ b/src/Handlers/Helpers/PathHandler.php @@ -1,4 +1,6 @@ -getFunctionId(); @@ -40,7 +43,7 @@ public static function getClassLikeNames(): array ]; } - public static function getMethodReturnType(MethodReturnTypeProviderEvent $event) : ?Union + public static function getMethodReturnType(MethodReturnTypeProviderEvent $event): ?Union { $methods = ['path', 'basepath', 'configpath', 'databasepath', 'resourcepath']; diff --git a/src/Handlers/Helpers/RedirectHandler.php b/src/Handlers/Helpers/RedirectHandler.php index 7aa5f7f8..e35b645b 100644 --- a/src/Handlers/Helpers/RedirectHandler.php +++ b/src/Handlers/Helpers/RedirectHandler.php @@ -1,4 +1,6 @@ - */ @@ -25,7 +26,7 @@ public static function getFunctionIds(): array * * @return ?Type\Union */ - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event) : ?Type\Union + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Type\Union { if (!$event->getCallArgs()) { return new Type\Union([ diff --git a/src/Handlers/Helpers/TransHandler.php b/src/Handlers/Helpers/TransHandler.php index 2d6b34f0..0c5f61cd 100644 --- a/src/Handlers/Helpers/TransHandler.php +++ b/src/Handlers/Helpers/TransHandler.php @@ -8,12 +8,12 @@ class TransHandler implements FunctionReturnTypeProviderInterface { - public static function getFunctionIds() : array + public static function getFunctionIds(): array { return ['trans']; } - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event) : Type\Union + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Type\Union { $call_args = $event->getCallArgs(); diff --git a/src/Handlers/Helpers/UrlHandler.php b/src/Handlers/Helpers/UrlHandler.php index 9427786b..530be40b 100644 --- a/src/Handlers/Helpers/UrlHandler.php +++ b/src/Handlers/Helpers/UrlHandler.php @@ -1,4 +1,6 @@ -getCallArgs()) { return new Union([ diff --git a/src/Handlers/Helpers/ViewHandler.php b/src/Handlers/Helpers/ViewHandler.php index a5ab1530..933ad9d8 100644 --- a/src/Handlers/Helpers/ViewHandler.php +++ b/src/Handlers/Helpers/ViewHandler.php @@ -11,12 +11,12 @@ class ViewHandler implements FunctionReturnTypeProviderInterface { - public static function getFunctionIds() : array + public static function getFunctionIds(): array { return ['view']; } - public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event) : Type\Union + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): Type\Union { if ($event->getCallArgs()) { return new Type\Union([ diff --git a/src/Handlers/SuppressHandler.php b/src/Handlers/SuppressHandler.php index f15895ef..98f72e60 100644 --- a/src/Handlers/SuppressHandler.php +++ b/src/Handlers/SuppressHandler.php @@ -7,6 +7,7 @@ use Psalm\Storage\ClassLikeStorage; use Psalm\Storage\MethodStorage; use Psalm\Storage\PropertyStorage; + use function array_intersect; use function in_array; use function strpos; diff --git a/src/Plugin.php b/src/Plugin.php index 29fa34cb..c28bc1b5 100644 --- a/src/Plugin.php +++ b/src/Plugin.php @@ -1,4 +1,5 @@ createApplication(); + $app = (new self())->createApplication(); } self::$app = $app; diff --git a/src/Providers/FacadeStubProvider.php b/src/Providers/FacadeStubProvider.php index 1e37003a..2a0cce4c 100644 --- a/src/Providers/FacadeStubProvider.php +++ b/src/Providers/FacadeStubProvider.php @@ -7,6 +7,7 @@ use Psalm\LaravelPlugin\Fakes\FakeFilesystem; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\NullOutput; + use function unlink; final class FacadeStubProvider implements GeneratesStubs diff --git a/src/Providers/ModelStubProvider.php b/src/Providers/ModelStubProvider.php index 62a2a259..6375aa38 100644 --- a/src/Providers/ModelStubProvider.php +++ b/src/Providers/ModelStubProvider.php @@ -8,13 +8,13 @@ use Psalm\LaravelPlugin\Handlers\Eloquent\Schema\SchemaAggregator; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\NullOutput; + use function dirname; use function glob; use function unlink; final class ModelStubProvider implements GeneratesStubs { - /** * @var array */ diff --git a/src/Providers/ViewFactoryProvider.php b/src/Providers/ViewFactoryProvider.php index 27682190..8f453743 100644 --- a/src/Providers/ViewFactoryProvider.php +++ b/src/Providers/ViewFactoryProvider.php @@ -11,6 +11,7 @@ use Psalm\LaravelPlugin\Fakes\FakeFilesystem; use ReflectionClass; use UnexpectedValueException; + use function dirname; final class ViewFactoryProvider @@ -27,7 +28,7 @@ public static function get(): Factory $resolver = new EngineResolver(); $fake_filesystem = new FakeFilesystem(); - $resolver->register('php', function () use ($fake_filesystem) : PhpEngine { + $resolver->register('php', function () use ($fake_filesystem): PhpEngine { return new PhpEngine($fake_filesystem); }); $finder = new FileViewFinder($fake_filesystem, [dirname($file_path) . '/../resources/views']); diff --git a/src/Util/ContainerResolver.php b/src/Util/ContainerResolver.php index 53ea41a3..16c8577f 100644 --- a/src/Util/ContainerResolver.php +++ b/src/Util/ContainerResolver.php @@ -1,4 +1,6 @@ -node_data; $statements_analyzer->node_data = clone $statements_analyzer->node_data; @@ -40,12 +41,14 @@ public static function executeFakeCall( $statements_analyzer->addSuppressedIssues(['PossiblyInvalidMethodCall']); } - if (MethodCallAnalyzer::analyze( - $statements_analyzer, - $fake_method_call, - $context, - false - ) === false) { + if ( + MethodCallAnalyzer::analyze( + $statements_analyzer, + $fake_method_call, + $context, + false + ) === false + ) { return null; } From b1f7516304bf4988a2f9f1fa383dfec240b66a87 Mon Sep 17 00:00:00 2001 From: Niels Vanpachtenbeke <10651054+Nielsvanpach@users.noreply.github.com> Date: Wed, 19 Jan 2022 10:04:30 +0100 Subject: [PATCH 2/2] run on PHP 8.0 --- .github/workflows/lint.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 07a5637f..6e87ef88 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,12 +1,10 @@ -name: PHPCS check +name: PHP CS check -on: - push: - pull_request: +on: [push] jobs: phpcs: - name: PHPCS + name: PHP CS runs-on: ubuntu-latest steps: - name: Checkout code @@ -22,7 +20,5 @@ jobs: - name: Install dependencies run: export COMPOSER_ROOT_VERSION=dev-master && composer install --prefer-dist --no-progress --no-suggest - - name: PHPCS check - uses: chekalsky/phpcs-action@v1 - with: - phpcs_bin_path: './vendor/bin/phpcs' + - name: PHP CS check + run: 'composer lint'