From 64639dccdee1801b4107c4d0d9132dee46ea6bfb Mon Sep 17 00:00:00 2001 From: Jeffrey Angenent <1571879+devfrey@users.noreply.github.com> Date: Tue, 1 Mar 2022 14:31:35 +0100 Subject: [PATCH] Add PHPStan-specific tags to improve analysis --- .../Database/Eloquent/Factories/Factory.php | 13 +++ types/Database/Eloquent/Factories/Factory.php | 97 ++++++------------- 2 files changed, 41 insertions(+), 69 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Factories/Factory.php b/src/Illuminate/Database/Eloquent/Factories/Factory.php index 43d37719dfda..a06867d98943 100644 --- a/src/Illuminate/Database/Eloquent/Factories/Factory.php +++ b/src/Illuminate/Database/Eloquent/Factories/Factory.php @@ -200,6 +200,7 @@ public function raw($attributes = [], ?Model $parent = null) * * @param (callable(array): array)|array $attributes * @return \Illuminate\Database\Eloquent\Model|TModel + * @phpstan-return TModel */ public function createOne($attributes = []) { @@ -211,6 +212,7 @@ public function createOne($attributes = []) * * @param (callable(array): array)|array $attributes * @return \Illuminate\Database\Eloquent\Model|TModel + * @phpstan-return TModel */ public function createOneQuietly($attributes = []) { @@ -222,6 +224,7 @@ public function createOneQuietly($attributes = []) * * @param iterable> $records * @return \Illuminate\Database\Eloquent\Collection + * @phpstan-return \Illuminate\Database\Eloquent\Collection */ public function createMany(iterable $records) { @@ -237,6 +240,7 @@ public function createMany(iterable $records) * * @param iterable> $records * @return \Illuminate\Database\Eloquent\Collection + * @phpstan-return \Illuminate\Database\Eloquent\Collection */ public function createManyQuietly(iterable $records) { @@ -251,6 +255,7 @@ public function createManyQuietly(iterable $records) * @param (callable(array): array)|array $attributes * @param \Illuminate\Database\Eloquent\Model|null $parent * @return \Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|TModel + * @phpstan-return \Illuminate\Database\Eloquent\Collection|TModel */ public function create($attributes = [], ?Model $parent = null) { @@ -279,6 +284,7 @@ public function create($attributes = [], ?Model $parent = null) * @param array $attributes * @param \Illuminate\Database\Eloquent\Model|null $parent * @return \Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|TModel + * @phpstan-return \Illuminate\Database\Eloquent\Collection|TModel */ public function createQuietly($attributes = [], ?Model $parent = null) { @@ -293,6 +299,7 @@ public function createQuietly($attributes = [], ?Model $parent = null) * @param array $attributes * @param \Illuminate\Database\Eloquent\Model|null $parent * @return \Closure(): (\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|TModel) + * @phpstan-return \Closure(): (\Illuminate\Database\Eloquent\Collection|TModel) */ public function lazy(array $attributes = [], ?Model $parent = null) { @@ -340,6 +347,7 @@ protected function createChildren(Model $model) * * @param (callable(array): array)|array $attributes * @return \Illuminate\Database\Eloquent\Model|TModel + * @phpstan-return TModel */ public function makeOne($attributes = []) { @@ -352,6 +360,7 @@ public function makeOne($attributes = []) * @param (callable(array): array)|array $attributes * @param \Illuminate\Database\Eloquent\Model|null $parent * @return \Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Model|TModel + * @phpstan-return \Illuminate\Database\Eloquent\Collection|TModel */ public function make($attributes = [], ?Model $parent = null) { @@ -578,6 +587,7 @@ public function for($factory, $relationship = null) * Add a new "after making" callback to the model definition. * * @param \Closure(\Illuminate\Database\Eloquent\Model|TModel): mixed $callback + * @phpstan-param \Closure(TModel): mixed $callback * @return static */ public function afterMaking(Closure $callback) @@ -589,6 +599,7 @@ public function afterMaking(Closure $callback) * Add a new "after creating" callback to the model definition. * * @param \Closure(\Illuminate\Database\Eloquent\Model|TModel): mixed $callback + * @phpstan-param \Closure(TModel): mixed $callback * @return static */ public function afterCreating(Closure $callback) @@ -673,6 +684,7 @@ protected function newInstance(array $arguments = []) * * @param array $attributes * @return \Illuminate\Database\Eloquent\Model|TModel + * @phpstan-return TModel */ public function newModel(array $attributes = []) { @@ -685,6 +697,7 @@ public function newModel(array $attributes = []) * Get the name of the model that is generated by the factory. * * @return class-string<\Illuminate\Database\Eloquent\Model|TModel> + * @phpstan-return class-string */ public function modelName() { diff --git a/types/Database/Eloquent/Factories/Factory.php b/types/Database/Eloquent/Factories/Factory.php index 8ddbcb5a2490..75e543bf50cc 100644 --- a/types/Database/Eloquent/Factories/Factory.php +++ b/types/Database/Eloquent/Factories/Factory.php @@ -48,87 +48,55 @@ public function definition() return ['string' => 'string']; })); -// assertType('User', $factory->createOne()); -// assertType('User', $factory->createOne(['string' => 'string'])); -assertType('Illuminate\Database\Eloquent\Model', $factory->createOne()); -assertType('Illuminate\Database\Eloquent\Model', $factory->createOne(['string' => 'string'])); -assertType('Illuminate\Database\Eloquent\Model', $factory->createOne(function ($attributes) { +assertType('User', $factory->createOne()); +assertType('User', $factory->createOne(['string' => 'string'])); +assertType('User', $factory->createOne(function ($attributes) { // assertType('array', $attributes); return ['string' => 'string']; })); -// assertType('User', $factory->createOneQuietly()); -// assertType('User', $factory->createOneQuietly(['string' => 'string'])); -assertType('Illuminate\Database\Eloquent\Model', $factory->createOneQuietly()); -assertType('Illuminate\Database\Eloquent\Model', $factory->createOneQuietly(['string' => 'string'])); -assertType('Illuminate\Database\Eloquent\Model', $factory->createOneQuietly(function ($attributes) { +assertType('User', $factory->createOneQuietly()); +assertType('User', $factory->createOneQuietly(['string' => 'string'])); +assertType('User', $factory->createOneQuietly(function ($attributes) { // assertType('array', $attributes); return ['string' => 'string']; })); -// assertType('Illuminate\Database\Eloquent\Collection', $factory->createMany([['string' => 'string']])); -assertType('Illuminate\Database\Eloquent\Collection', $factory->createMany( - [['string' => 'string']] -)); - -// assertType('Illuminate\Database\Eloquent\Collection', $factory->createManyQuietly([['string' => 'string']])); -assertType('Illuminate\Database\Eloquent\Collection', $factory->createManyQuietly( - [['string' => 'string']] -)); - -// assertType('Illuminate\Database\Eloquent\Collection|User', $factory->create()); -// assertType('Illuminate\Database\Eloquent\Collection|User', $factory->create([ -// 'string' => 'string', -// ])); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->create()); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->create([ - 'string' => 'string', -])); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->create(function ($attributes) { +assertType('Illuminate\Database\Eloquent\Collection', $factory->createMany([['string' => 'string']])); + +assertType('Illuminate\Database\Eloquent\Collection', $factory->createManyQuietly([['string' => 'string']])); + +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->create()); +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->create(['string' => 'string'])); +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->create(function ($attributes) { // assertType('array', $attributes); return ['string' => 'string']; })); -// assertType('Illuminate\Database\Eloquent\Collection|User', $factory->createQuietly()); -// assertType('Illuminate\Database\Eloquent\Collection|User', $factory->createQuietly([ -// 'string' => 'string', -// ])); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->createQuietly()); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->createQuietly([ +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->createQuietly()); +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->createQuietly([ 'string' => 'string', ])); -// assertType('Closure(): Illuminate\Database\Eloquent\Collection|User', $factory->lazy()); -// assertType('Closure(): Illuminate\Database\Eloquent\Collection|User', $factory->lazy([ -// 'string' => 'string', -// ])); -assertType('Closure(): Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->lazy()); -assertType('Closure(): Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->lazy([ +assertType('Closure(): Illuminate\Database\Eloquent\Collection|User', $factory->lazy()); +assertType('Closure(): Illuminate\Database\Eloquent\Collection|User', $factory->lazy([ 'string' => 'string', ])); -// assertType('User', $factory->makeOne()); -// assertType('User', $factory->makeOne([ -// 'string' => 'string', -// ])); -assertType('Illuminate\Database\Eloquent\Model', $factory->makeOne()); -assertType('Illuminate\Database\Eloquent\Model', $factory->makeOne([ +assertType('User', $factory->makeOne()); +assertType('User', $factory->makeOne([ 'string' => 'string', ])); -assertType('Illuminate\Database\Eloquent\Model', $factory->makeOne(function ($attributes) { +assertType('User', $factory->makeOne(function ($attributes) { // assert('array', $attributes); return ['string' => 'string']; })); -// assertType('Illuminate\Database\Eloquent\Collection|User', $factory->make()); -// assertType('Illuminate\Database\Eloquent\Collection|User', $factory->make([ -// 'string' => 'string', -// ])); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->make()); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->make([ +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->make()); +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->make([ 'string' => 'string', ])); -assertType('Illuminate\Database\Eloquent\Collection|Illuminate\Database\Eloquent\Model', $factory->make(function ($attributes) { +assertType('Illuminate\Database\Eloquent\Collection|User', $factory->make(function ($attributes) { // assert('array', $attributes); return ['string' => 'string']; })); @@ -151,21 +119,15 @@ public function definition() assertType('UserFactory', $factory->for($factory)); assertType('UserFactory', $factory->for($factory->createOne())); -// assertType('UserFactory', $factory->afterMaking(function ($user) { -// assertType('User', $user); -// })); assertType('UserFactory', $factory->afterMaking(function ($user) { - assertType('Illuminate\Database\Eloquent\Model', $user); + assertType('User', $user); })); assertType('UserFactory', $factory->afterMaking(function ($user) { return 'string'; })); -// assertType('UserFactory', $factory->afterCreating(function ($user) { -// assertType('User', $user); -// })); assertType('UserFactory', $factory->afterCreating(function ($user) { - assertType('Illuminate\Database\Eloquent\Model', $user); + assertType('User', $user); })); assertType('UserFactory', $factory->afterCreating(function ($user) { return 'string'; @@ -175,13 +137,10 @@ public function definition() assertType('UserFactory', $factory->connection('string')); -// assertType('User', $factory->newModel()); -// assertType('User', $factory->newModel(['string' => 'string'])); -assertType('Illuminate\Database\Eloquent\Model', $factory->newModel()); -assertType('Illuminate\Database\Eloquent\Model', $factory->newModel(['string' => 'string'])); +assertType('User', $factory->newModel()); +assertType('User', $factory->newModel(['string' => 'string'])); -// assertType('class-string', $factory->modelName()); -assertType('class-string', $factory->modelName()); +assertType('class-string', $factory->modelName()); Factory::guessModelNamesUsing(function (Factory $factory) { return match (true) {