From ed8458d917e5444f21b4780a73b152cde42b76fb Mon Sep 17 00:00:00 2001 From: Mohammad Mortazavi Date: Tue, 14 Jan 2025 16:11:36 +0330 Subject: [PATCH 1/4] Create RemoveNamedArgsInDataProviderRector.php --- .../RemoveNamedArgsInDataProviderRector.php | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php diff --git a/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php b/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php new file mode 100644 index 00000000..d2056315 --- /dev/null +++ b/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php @@ -0,0 +1,140 @@ + 100]; + } +} +CODE_SAMPLE + + , + <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +final class SomeTest extends TestCase +{ + /** + * @dataProvider provideData() + */ + public function test() + { + } + + public static function provideData() + { + yield [100]; + } +} +CODE_SAMPLE + ), + ]); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [Class_::class]; + } + + /** + * @param Class_ $node + */ + public function refactor(Node $node): ?Node + { + if (! $this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + + $hasChanged = false; + + $dataProviders = $this->dataProviderClassMethodFinder->find($node); + foreach ($dataProviders as $dataProvider) { + /** @var Node\Stmt\Expression $stmt */ + foreach ($dataProvider->getStmts() ?? [] as $stmt) { + $expr = $stmt->expr; + if ($expr instanceof Node\Expr\Yield_) { + $this->handleYieldStmt($expr); + $hasChanged = true; + } elseif ($expr instanceof Node\Expr\Array_) { + $this->handleReturnStmt($expr); + $hasChanged = true; + } + } + } + + if ($hasChanged) { + return $node; + } + + return null; + } + + private function handleYieldStmt(Node\Expr\Yield_ $expr): void + { + /** @var Node\Expr\Array_ $value */ + $value = $expr->value; + foreach ($value->items as $item) { + if (! $item instanceof ArrayItem) { + continue; + } + if (! $item->key instanceof Node\Scalar\Int_) { + $item->key = null; + } + } + } + + private function handleReturnStmt(Node\Expr\Array_ $expr): void + { + foreach ($expr->items as $item) { + if (! $item instanceof ArrayItem) { + continue; + } + if (! $item->key instanceof Node\Scalar\Int_) { + $item->key = null; + } + } + } +} From 55cbe06a02496f8d2aca9bfc93c9a9a375ce81f5 Mon Sep 17 00:00:00 2001 From: Mohammad Mortazavi Date: Tue, 14 Jan 2025 16:12:06 +0330 Subject: [PATCH 2/4] Add tests; --- .../provide_data_with_multiple_yields.php.inc | 49 +++++++++++++++ ...data_with_named_and_not_named_args.php.inc | 45 +++++++++++++ .../provide_data_with_named_args.php.inc | 45 +++++++++++++ .../provide_data_with_no_named_args.php.inc | 45 +++++++++++++ .../Fixture/provide_data_with_return.php.inc | 45 +++++++++++++ ...h_several_named_and_not_named_args.php.inc | 63 +++++++++++++++++++ ...emoveNamedArgsInDataProviderRectorTest.php | 28 +++++++++ .../config/configured_rule.php | 10 +++ 8 files changed, 330 insertions(+) create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_multiple_yields.php.inc create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_and_not_named_args.php.inc create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_args.php.inc create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_no_named_args.php.inc create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_return.php.inc create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_several_named_and_not_named_args.php.inc create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/RemoveNamedArgsInDataProviderRectorTest.php create mode 100644 rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/config/configured_rule.php diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_multiple_yields.php.inc b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_multiple_yields.php.inc new file mode 100644 index 00000000..868ca845 --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_multiple_yields.php.inc @@ -0,0 +1,49 @@ + 100, 'another' => 'arg1']; + yield ['secondNamedArg' => 27, 'theOther' => 'arg2']; + yield [3.2 => 32, 'nonOfOne' => 3]; + } +} + +?> +----- + diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_and_not_named_args.php.inc b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_and_not_named_args.php.inc new file mode 100644 index 00000000..5a7e5586 --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_and_not_named_args.php.inc @@ -0,0 +1,45 @@ + 100, null]; + } +} + +?> +----- + diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_args.php.inc b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_args.php.inc new file mode 100644 index 00000000..048ccbe1 --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_named_args.php.inc @@ -0,0 +1,45 @@ + 100, 'another' => 'arg1']; + } +} + +?> +----- + diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_no_named_args.php.inc b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_no_named_args.php.inc new file mode 100644 index 00000000..dc24ec41 --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_no_named_args.php.inc @@ -0,0 +1,45 @@ + +----- + diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_return.php.inc b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_return.php.inc new file mode 100644 index 00000000..7be2287a --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_return.php.inc @@ -0,0 +1,45 @@ + 100, 'another' => 'arg1']; + } +} + +?> +----- + diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_several_named_and_not_named_args.php.inc b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_several_named_and_not_named_args.php.inc new file mode 100644 index 00000000..224fb178 --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/Fixture/provide_data_with_several_named_and_not_named_args.php.inc @@ -0,0 +1,63 @@ + 100, + null, + fn() => 'G-EAZY', + 'Key' => fn() => 'Post Malone', + 'another' => 'arg1', + new \Exception(), + true, + 'false' => false + ]; + } +} + +?> +----- + 'G-EAZY', + fn() => 'Post Malone', + 'arg1', + new \Exception(), + true, + false + ]; + } +} + +?> diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/RemoveNamedArgsInDataProviderRectorTest.php b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/RemoveNamedArgsInDataProviderRectorTest.php new file mode 100644 index 00000000..f88f5947 --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/RemoveNamedArgsInDataProviderRectorTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/config/configured_rule.php b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/config/configured_rule.php new file mode 100644 index 00000000..ca8cce71 --- /dev/null +++ b/rules-tests/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(RemoveNamedArgsInDataProviderRector::class); +}; From f1db613461c2fc4271f64938f444ec23b06ce203 Mon Sep 17 00:00:00 2001 From: Mohammad Mortazavi Date: Tue, 14 Jan 2025 16:16:56 +0330 Subject: [PATCH 3/4] Merge two private methods; --- .../RemoveNamedArgsInDataProviderRector.php | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php b/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php index d2056315..8635ca19 100644 --- a/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php +++ b/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php @@ -96,10 +96,10 @@ public function refactor(Node $node): ?Node foreach ($dataProvider->getStmts() ?? [] as $stmt) { $expr = $stmt->expr; if ($expr instanceof Node\Expr\Yield_) { - $this->handleYieldStmt($expr); + $this->handleStmt($expr->value); $hasChanged = true; } elseif ($expr instanceof Node\Expr\Array_) { - $this->handleReturnStmt($expr); + $this->handleStmt($expr); $hasChanged = true; } } @@ -112,21 +112,7 @@ public function refactor(Node $node): ?Node return null; } - private function handleYieldStmt(Node\Expr\Yield_ $expr): void - { - /** @var Node\Expr\Array_ $value */ - $value = $expr->value; - foreach ($value->items as $item) { - if (! $item instanceof ArrayItem) { - continue; - } - if (! $item->key instanceof Node\Scalar\Int_) { - $item->key = null; - } - } - } - - private function handleReturnStmt(Node\Expr\Array_ $expr): void + private function handleStmt(Node\Expr\Array_ $expr): void { foreach ($expr->items as $item) { if (! $item instanceof ArrayItem) { From a1a3b4a08f68292884088541e509a7b3abdf27f2 Mon Sep 17 00:00:00 2001 From: Mohammad Mortazavi Date: Sat, 18 Jan 2025 10:04:08 +0330 Subject: [PATCH 4/4] Fix workflow; --- .../RemoveNamedArgsInDataProviderRector.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php b/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php index 8635ca19..125fcc7f 100644 --- a/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php +++ b/rules/PHPUnit100/Rector/Class_/RemoveNamedArgsInDataProviderRector.php @@ -4,6 +4,10 @@ namespace Rector\PHPUnit\PHPUnit100\Rector\Class_; +use PhpParser\Node\Expr\Yield_; +use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Scalar\Int_; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node; use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Stmt\Class_; @@ -92,13 +96,13 @@ public function refactor(Node $node): ?Node $dataProviders = $this->dataProviderClassMethodFinder->find($node); foreach ($dataProviders as $dataProvider) { - /** @var Node\Stmt\Expression $stmt */ + /** @var Expression $stmt */ foreach ($dataProvider->getStmts() ?? [] as $stmt) { $expr = $stmt->expr; - if ($expr instanceof Node\Expr\Yield_) { + if ($expr instanceof Yield_) { $this->handleStmt($expr->value); $hasChanged = true; - } elseif ($expr instanceof Node\Expr\Array_) { + } elseif ($expr instanceof Array_) { $this->handleStmt($expr); $hasChanged = true; } @@ -112,13 +116,14 @@ public function refactor(Node $node): ?Node return null; } - private function handleStmt(Node\Expr\Array_ $expr): void + private function handleStmt(Array_ $array): void { - foreach ($expr->items as $item) { + foreach ($array->items as $item) { if (! $item instanceof ArrayItem) { continue; } - if (! $item->key instanceof Node\Scalar\Int_) { + + if (! $item->key instanceof Int_) { $item->key = null; } }