From e8044dc9201cd7a237ce96f278cc303cc441600b Mon Sep 17 00:00:00 2001 From: Gabriel Langer Date: Fri, 17 Jul 2020 08:07:09 +0200 Subject: [PATCH] [Models] Fixed wrong imported name (#993) * Fixes 992 (class names in phpdoc where using imported names incorrectly when writing to external file). Disabled using imported name in external file, except for the models own name. * Added missing declare strict types --- src/Console/ModelsCommand.php | 65 ++++--- .../Builders/EMaterialQueryBuilder.php | 10 ++ .../Models/Post.php | 14 ++ .../Test.php | 54 ++++++ .../__snapshots__/Test__test__1.php | 169 ++++++++++++++++++ 5 files changed, 286 insertions(+), 26 deletions(-) create mode 100644 tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/Builders/EMaterialQueryBuilder.php create mode 100644 tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/Models/Post.php create mode 100644 tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/Test.php create mode 100644 tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/__snapshots__/Test__test__1.php diff --git a/src/Console/ModelsCommand.php b/src/Console/ModelsCommand.php index 95a7b2f..e0514b9 100644 --- a/src/Console/ModelsCommand.php +++ b/src/Console/ModelsCommand.php @@ -446,9 +446,9 @@ class ModelsCommand extends Command if ($this->write_model_magic_where) { $this->setMethod( Str::camel("where_" . $name), - $this->getClassNameInModel($model, \Illuminate\Database\Eloquent\Builder::class) + $this->getClassNameInDestinationFile($model, \Illuminate\Database\Eloquent\Builder::class) . '|' - . $this->getClassNameInModel($model, get_class($model)), + . $this->getClassNameInDestinationFile($model, get_class($model)), array('$value') ); } @@ -498,20 +498,23 @@ class ModelsCommand extends Command $args = $this->getParameters($reflection); //Remove the first ($query) argument array_shift($args); - $builder = $this->getClassNameInModel( + $builder = $this->getClassNameInDestinationFile( $reflection->getDeclaringClass(), \Illuminate\Database\Eloquent\Builder::class ); - $modelName = $this->getClassNameInModel( + $modelName = $this->getClassNameInDestinationFile( $reflection->getDeclaringClass(), $reflection->getDeclaringClass()->getName() ); $this->setMethod($name, $builder . '|' . $modelName, $args); } } elseif (in_array($method, ['query', 'newQuery', 'newModelQuery'])) { - $builder = $this->getClassNameInModel($model, get_class($model->newModelQuery())); + $builder = $this->getClassNameInDestinationFile($model, get_class($model->newModelQuery())); - $this->setMethod($method, $builder . "|" . $this->getClassNameInModel($model, get_class($model))); + $this->setMethod( + $method, + $builder . "|" . $this->getClassNameInDestinationFile($model, get_class($model)) + ); } elseif ( !method_exists('Illuminate\Database\Eloquent\Model', $method) && !Str::startsWith($method, 'get') @@ -571,7 +574,7 @@ class ModelsCommand extends Command }); if ($relationObj instanceof Relation) { - $relatedModel = $this->getClassNameInModel( + $relatedModel = $this->getClassNameInDestinationFile( $model, get_class($relationObj->getRelated()) ); @@ -588,7 +591,10 @@ class ModelsCommand extends Command //Collection or array of models (because Collection is Arrayable) $relatedClass = '\\' . get_class($relationObj->getRelated()); $collectionClass = $this->getCollectionClass($relatedClass); - $collectionClassNameInModel = $this->getClassNameInModel($model, $collectionClass); + $collectionClassNameInModel = $this->getClassNameInDestinationFile( + $model, + $collectionClass + ); $this->setProperty( $method, $collectionClassNameInModel . '|' . $relatedModel . '[]', @@ -607,7 +613,7 @@ class ModelsCommand extends Command // Model isn't specified because relation is polymorphic $this->setProperty( $method, - $this->getClassNameInModel($model, Model::class) . '|\Eloquent', + $this->getClassNameInDestinationFile($model, Model::class) . '|\Eloquent', true, null ); @@ -780,7 +786,7 @@ class ModelsCommand extends Command } if ($this->write && ! $phpdoc->getTagsByName('mixin')) { - $eloquentClassNameInModel = $this->getClassNameInModel($reflection, 'Eloquent'); + $eloquentClassNameInModel = $this->getClassNameInDestinationFile($reflection, 'Eloquent'); $phpdoc->appendTag(Tag::createInstance("@mixin " . $eloquentClassNameInModel, $phpdoc)); } if ($this->phpstorm_noinspections) { @@ -959,8 +965,8 @@ class ModelsCommand extends Command { $traits = class_uses(get_class($model), true); if (in_array('Illuminate\\Database\\Eloquent\\SoftDeletes', $traits)) { - $modelName = $this->getClassNameInModel($model, get_class($model)); - $builder = $this->getClassNameInModel($model, \Illuminate\Database\Query\Builder::class); + $modelName = $this->getClassNameInDestinationFile($model, get_class($model)); + $builder = $this->getClassNameInDestinationFile($model, \Illuminate\Database\Query\Builder::class); $this->setMethod('withTrashed', $builder . '|' . $modelName, []); $this->setMethod('withoutTrashed', $builder . '|' . $modelName, []); $this->setMethod('onlyTrashed', $builder . '|' . $modelName, []); @@ -976,7 +982,7 @@ class ModelsCommand extends Command $collectionClass = $this->getCollectionClass(get_class($model)); if ($collectionClass !== '\\' . \Illuminate\Database\Eloquent\Collection::class) { - $collectionClassInModel = $this->getClassNameInModel($model, $collectionClass); + $collectionClassInModel = $this->getClassNameInDestinationFile($model, $collectionClass); $this->setMethod('get', $collectionClassInModel . '|static[]', ['$columns = [\'*\']']); $this->setMethod('all', $collectionClassInModel . '|static[]', ['$columns = [\'*\']']); @@ -1040,7 +1046,7 @@ class ModelsCommand extends Command } if (class_exists($type)) { - $type = $this->getClassNameInModel($model, $type); + $type = $this->getClassNameInDestinationFile($model, $type); } return $type; @@ -1051,24 +1057,31 @@ class ModelsCommand extends Command * @param string $className * @return string */ - protected function getClassNameInModel(object $model, string $className): string - { - $className = trim($className, '\\'); - $usedClassNames = $this->getUsedClassNames($model); - return $usedClassNames[$className] ?? ('\\' . $className); - } - - /** - * @param object|ReflectionClass $model - * @return string[] - */ - protected function getUsedClassNames(object $model): array + protected function getClassNameInDestinationFile(object $model, string $className): string { $reflection = $model instanceof ReflectionClass ? $model : new ReflectionObject($model) ; + $className = trim($className, '\\'); + $writingToExternalFile = !$this->write; + $classIsNotInExternalFile = $reflection->getName() !== $className; + + if ($writingToExternalFile && $classIsNotInExternalFile) { + return '\\' . $className; + } + + $usedClassNames = $this->getUsedClassNames($reflection); + return $usedClassNames[$className] ?? ('\\' . $className); + } + + /** + * @param ReflectionClass $reflection + * @return string[] + */ + protected function getUsedClassNames(ReflectionClass $reflection): array + { $namespaceAliases = array_flip((new ContextFactory())->createFromReflector($reflection)->getNamespaceAliases()); $namespaceAliases[$reflection->getName()] = $reflection->getShortName(); diff --git a/tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/Builders/EMaterialQueryBuilder.php b/tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/Builders/EMaterialQueryBuilder.php new file mode 100644 index 0000000..e041467 --- /dev/null +++ b/tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/Builders/EMaterialQueryBuilder.php @@ -0,0 +1,10 @@ +set('ide-helper', [ + 'model_locations' => [ + // This is calculated from the base_path() which points to + // vendor/orchestra/testbench-core/laravel + '/../../../../tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/Models', + ], + ]); + } + + public function test(): void + { + $actualContent = null; + $mockFilesystem = Mockery::mock(Filesystem::class); + $mockFilesystem + ->shouldReceive('put') + ->with( + Mockery::any(), + Mockery::capture($actualContent) + ) + ->andReturn(1) // Simulate we wrote _something_ to the file + ->once(); + + $this->instance(Filesystem::class, $mockFilesystem); + + $command = $this->app->make(ModelsCommand::class); + + $tester = $this->runCommand($command, [ + '--nowrite' => true, + ]); + + $this->assertSame(0, $tester->getStatusCode()); + $this->assertEmpty($tester->getDisplay()); + $this->assertMatchesPhpSnapshot($actualContent); + } +} diff --git a/tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/__snapshots__/Test__test__1.php b/tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/__snapshots__/Test__test__1.php new file mode 100644 index 0000000..8a4679f --- /dev/null +++ b/tests/Console/ModelsCommand/GeneratePhpdocWithFqnInExternalFile/__snapshots__/Test__test__1.php @@ -0,0 +1,169 @@ + + */ + + +namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithFqnInExternalFile\Models{ +/** + * Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithFqnInExternalFile\Models\Post + * + * @property integer $id + * @property string|null $char_nullable + * @property string $char_not_nullable + * @property string|null $string_nullable + * @property string $string_not_nullable + * @property string|null $text_nullable + * @property string $text_not_nullable + * @property string|null $medium_text_nullable + * @property string $medium_text_not_nullable + * @property string|null $long_text_nullable + * @property string $long_text_not_nullable + * @property integer|null $integer_nullable + * @property integer $integer_not_nullable + * @property integer|null $tiny_integer_nullable + * @property integer $tiny_integer_not_nullable + * @property integer|null $small_integer_nullable + * @property integer $small_integer_not_nullable + * @property integer|null $medium_integer_nullable + * @property integer $medium_integer_not_nullable + * @property integer|null $big_integer_nullable + * @property integer $big_integer_not_nullable + * @property integer|null $unsigned_integer_nullable + * @property integer $unsigned_integer_not_nullable + * @property integer|null $unsigned_tiny_integer_nullable + * @property integer $unsigned_tiny_integer_not_nullable + * @property integer|null $unsigned_small_integer_nullable + * @property integer $unsigned_small_integer_not_nullable + * @property integer|null $unsigned_medium_integer_nullable + * @property integer $unsigned_medium_integer_not_nullable + * @property integer|null $unsigned_big_integer_nullable + * @property integer $unsigned_big_integer_not_nullable + * @property float|null $float_nullable + * @property float $float_not_nullable + * @property float|null $double_nullable + * @property float $double_not_nullable + * @property string|null $decimal_nullable + * @property string $decimal_not_nullable + * @property string|null $unsigned_decimal_nullable + * @property string $unsigned_decimal_not_nullable + * @property integer|null $boolean_nullable + * @property integer $boolean_not_nullable + * @property string|null $enum_nullable + * @property string $enum_not_nullable + * @property string|null $json_nullable + * @property string $json_not_nullable + * @property string|null $jsonb_nullable + * @property string $jsonb_not_nullable + * @property string|null $date_nullable + * @property string $date_not_nullable + * @property string|null $datetime_nullable + * @property string $datetime_not_nullable + * @property string|null $datetimetz_nullable + * @property string $datetimetz_not_nullable + * @property string|null $time_nullable + * @property string $time_not_nullable + * @property string|null $timetz_nullable + * @property string $timetz_not_nullable + * @property string|null $timestamp_nullable + * @property string $timestamp_not_nullable + * @property string|null $timestamptz_nullable + * @property string $timestamptz_not_nullable + * @property integer|null $year_nullable + * @property integer $year_not_nullable + * @property mixed|null $binary_nullable + * @property mixed $binary_not_nullable + * @property string|null $uuid_nullable + * @property string $uuid_not_nullable + * @property string|null $ipaddress_nullable + * @property string $ipaddress_not_nullable + * @property string|null $macaddress_nullable + * @property string $macaddress_not_nullable + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithFqnInExternalFile\Builders\EMaterialQueryBuilder|Post newModelQuery() + * @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithFqnInExternalFile\Builders\EMaterialQueryBuilder|Post newQuery() + * @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWithFqnInExternalFile\Builders\EMaterialQueryBuilder|Post query() + * @method static \Illuminate\Database\Eloquent\Builder|Post whereBigIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereBigIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereBinaryNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereBinaryNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereBooleanNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereBooleanNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereCharNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereCharNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDateNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDateNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDatetimeNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDatetimeNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDatetimetzNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDatetimetzNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDecimalNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDecimalNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDoubleNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereDoubleNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereEnumNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereEnumNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereFloatNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereFloatNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereIpaddressNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereIpaddressNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereJsonNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereJsonNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereJsonbNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereJsonbNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereLongTextNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereLongTextNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereMacaddressNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereMacaddressNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereMediumIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereMediumIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereMediumTextNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereMediumTextNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereSmallIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereSmallIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereStringNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereStringNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTextNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTextNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimeNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimeNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimestampNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimestampNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimestamptzNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimestamptzNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimetzNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTimetzNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTinyIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereTinyIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedBigIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedBigIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedDecimalNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedDecimalNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedMediumIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedMediumIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedSmallIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedSmallIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedTinyIntegerNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUnsignedTinyIntegerNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUpdatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUuidNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereUuidNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereYearNotNullable($value) + * @method static \Illuminate\Database\Eloquent\Builder|Post whereYearNullable($value) + */ + class Post extends \Eloquent {} +} +