From 869385b928e8d9d4000a2dd226368f5127bc6cf4 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 7 Dec 2025 01:53:59 +0100 Subject: [PATCH] remove beforeTraverse() from nullsafe method call; counter is not relevant as output is already ternary nesting --- composer.json | 2 +- phpstan.neon | 12 +-------- .../Fixture/get_nullable.php.inc | 2 +- .../Fixture/get_nullable_in_trait.php.inc | 2 +- .../Fixture/multiple_call.php.inc | 4 +-- .../Fixture/short_circuit.php.inc | 2 +- .../Fixture/short_circuit3.php.inc | 2 +- .../Fixture/short_circuit4.php.inc | 27 ------------------- .../Fixture/short_circuit5.php.inc | 27 ------------------- .../DowngradePipeOperatorRectorTest.php | 0 .../Fixture/complex_pipe_chain.php.inc | 0 .../Fixture/multiple_pipes.php.inc | 0 .../Fixture/pipe_in_assignment.php.inc | 0 .../Fixture/pipe_with_closure.php.inc | 0 .../Fixture/pipe_with_method_call.php.inc | 0 .../pipe_with_variable_function.php.inc | 0 .../Fixture/simple_pipe.php.inc | 0 .../Fixture/skip_invalid_pipe.php.inc | 0 .../Fixture/skip_no_pipe.php.inc | 0 .../config/configured_rule.php | 0 ...wngradeNullsafeToTernaryOperatorRector.php | 13 +-------- 21 files changed, 9 insertions(+), 84 deletions(-) delete mode 100644 rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit4.php.inc delete mode 100644 rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit5.php.inc rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/DowngradePipeOperatorRectorTest.php (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/complex_pipe_chain.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/multiple_pipes.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/pipe_in_assignment.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/pipe_with_closure.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/pipe_with_method_call.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/pipe_with_variable_function.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/simple_pipe.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/skip_invalid_pipe.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/Fixture/skip_no_pipe.php.inc (100%) rename rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/{DowngradePipeOperatorRectorTest => DowngradePipeOperatorRector}/config/configured_rule.php (100%) diff --git a/composer.json b/composer.json index 198461ff..f1249e50 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ "phpstan/phpstan": "^2.1.32", "phpstan/phpstan-webmozart-assert": "^2.0", "phpunit/phpunit": "^11.5", - "rector/rector-src": "dev-main", + "rector/rector-src": "dev-tv-rector-avoid-before-traverser", "rector/type-perfect": "^2.1", "symplify/easy-coding-standard": "^12.3", "symplify/phpstan-extensions": "^12.0", diff --git a/phpstan.neon b/phpstan.neon index 5b28341a..ffb467eb 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -9,7 +9,7 @@ parameters: # see https://phpstan.org/writing-php-code/phpdoc-types#global-type-aliases typeAliases: - StmtsAware: \PhpParser\Node\Stmt\Block | \PhpParser\Node\Expr\Closure | \PhpParser\Node\Stmt\Case_ | \PhpParser\Node\Stmt\Catch_ | \PhpParser\Node\Stmt\ClassMethod | \PhpParser\Node\Stmt\Do_ | \PhpParser\Node\Stmt\Else_ | \PhpParser\Node\Stmt\ElseIf_ | \PhpParser\Node\Stmt\Finally_ | \PhpParser\Node\Stmt\For_ | \PhpParser\Node\Stmt\Foreach_ | \PhpParser\Node\Stmt\Function_ | \PhpParser\Node\Stmt\If_ | \PhpParser\Node\Stmt\Namespace_ | \PhpParser\Node\Stmt\TryCatch | \PhpParser\Node\Stmt\While_ | \Rector\PhpParser\Node\CustomNode\FileWithoutNamespace + StmtsAware: \PhpParser\Node\Stmt\Block | \PhpParser\Node\Expr\Closure | \PhpParser\Node\Stmt\Case_ | \PhpParser\Node\Stmt\Catch_ | \PhpParser\Node\Stmt\ClassMethod | \PhpParser\Node\Stmt\Do_ | \PhpParser\Node\Stmt\Else_ | \PhpParser\Node\Stmt\ElseIf_ | \PhpParser\Node\Stmt\Finally_ | \PhpParser\Node\Stmt\For_ | \PhpParser\Node\Stmt\Foreach_ | \PhpParser\Node\Stmt\Function_ | \PhpParser\Node\Stmt\If_ | \PhpParser\Node\Stmt\Namespace_ | \PhpParser\Node\Stmt\TryCatch | \PhpParser\Node\Stmt\While_ | \Rector\PhpParser\Node\FileNode # requires exact closure types checkMissingCallableSignature: true @@ -92,13 +92,3 @@ parameters: - identifier: symplify.forbiddenFuncCall path: rules/DowngradePhp73/Rector/FuncCall/DowngradeArrayKeyFirstLastRector.php - - # false positive - - - identifier: symplify.seeAnnotationToTest - path: rules/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector.php - - # handle next - - - identifier: method.parentMethodFinalByPhpDoc - path: rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable.php.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable.php.inc index bc3cb379..3ea90707 100644 --- a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable.php.inc +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable.php.inc @@ -27,7 +27,7 @@ final class GetNullable { public function run($value) { - return ($nullsafeVariable1 = $this->extractArrayItemByKey($value)) ? $nullsafeVariable1->value : null; + return ($nullsafeVariable6 = $this->extractArrayItemByKey($value)) ? $nullsafeVariable6->value : null; } protected function extractArrayItemByKey($value): ?ArrayItem diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable_in_trait.php.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable_in_trait.php.inc index 1f58f938..dbc18abe 100644 --- a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable_in_trait.php.inc +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/get_nullable_in_trait.php.inc @@ -29,7 +29,7 @@ trait GetNullableInTrait { public function run($value) { - return ($nullsafeVariable1 = $this->extractArrayItemByKey($value)) ? $nullsafeVariable1->value : null; + return ($nullsafeVariable7 = $this->extractArrayItemByKey($value)) ? $nullsafeVariable7->value : null; } protected function extractArrayItemByKey($value): ?ArrayItem diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/multiple_call.php.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/multiple_call.php.inc index 949babb7..96178c90 100644 --- a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/multiple_call.php.inc +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/multiple_call.php.inc @@ -21,8 +21,8 @@ class MultipleCall { public function run($object) { - $result = ($nullsafeVariable1 = ($nullsafeVariable2 = $object->multiple($args1)) ? $nullsafeVariable2->call($args2) : null) ? $nullsafeVariable1->otherCall($args3) : null; - $result = ($nullsafeVariable3 = ($nullsafeVariable4 = ($nullsafeVariable5 = $object->multiple($args1)) ? $nullsafeVariable5->call($args2) : null) ? $nullsafeVariable4->otherCall($args3) : null) ? $nullsafeVariable3->anotherCall($args4) : null; + $result = ($nullsafeVariable8 = ($nullsafeVariable9 = $object->multiple($args1)) ? $nullsafeVariable9->call($args2) : null) ? $nullsafeVariable8->otherCall($args3) : null; + $result = ($nullsafeVariable10 = ($nullsafeVariable11 = ($nullsafeVariable12 = $object->multiple($args1)) ? $nullsafeVariable12->call($args2) : null) ? $nullsafeVariable11->otherCall($args3) : null) ? $nullsafeVariable10->anotherCall($args4) : null; } } diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php.inc index ba99b780..e4040587 100644 --- a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php.inc +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php.inc @@ -20,7 +20,7 @@ final class ShortCircuit { public function run(bool $param) { - return ($nullsafeVariable1 = $this->clock) ? $nullsafeVariable1->now()->format('U.u') : null; + return ($nullsafeVariable13 = $this->clock) ? $nullsafeVariable13->now()->format('U.u') : null; } } diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit3.php.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit3.php.inc index 6e092e8f..77b60e08 100644 --- a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit3.php.inc +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit3.php.inc @@ -20,7 +20,7 @@ final class ShortCircuit3 { public function run(bool $param) { - return ($nullsafeVariable1 = $this->clock) ? $nullsafeVariable1->now->format : null; + return ($nullsafeVariable14 = $this->clock) ? $nullsafeVariable14->now->format : null; } } diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit4.php.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit4.php.inc deleted file mode 100644 index 3b6bcf05..00000000 --- a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit4.php.inc +++ /dev/null @@ -1,27 +0,0 @@ -clock?->now->format('U.u'); - } -} - -?> ------ -clock) ? $nullsafeVariable1->now->format('U.u') : null; - } -} - -?> diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit5.php.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit5.php.inc deleted file mode 100644 index ac3b63b6..00000000 --- a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit5.php.inc +++ /dev/null @@ -1,27 +0,0 @@ -clock?->now()->format; - } -} - -?> ------ -clock) ? $nullsafeVariable1->now()->format : null; - } -} - -?> diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/DowngradePipeOperatorRectorTest.php b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/DowngradePipeOperatorRectorTest.php similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/DowngradePipeOperatorRectorTest.php rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/DowngradePipeOperatorRectorTest.php diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/complex_pipe_chain.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/complex_pipe_chain.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/complex_pipe_chain.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/complex_pipe_chain.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/multiple_pipes.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/multiple_pipes.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/multiple_pipes.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/multiple_pipes.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_in_assignment.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_in_assignment.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_in_assignment.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_in_assignment.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_with_closure.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_with_closure.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_with_closure.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_with_closure.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_with_method_call.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_with_method_call.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_with_method_call.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_with_method_call.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_with_variable_function.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_with_variable_function.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/pipe_with_variable_function.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/pipe_with_variable_function.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/simple_pipe.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/simple_pipe.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/simple_pipe.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/simple_pipe.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/skip_invalid_pipe.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/skip_invalid_pipe.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/skip_invalid_pipe.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/skip_invalid_pipe.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/skip_no_pipe.php.inc b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/skip_no_pipe.php.inc similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/Fixture/skip_no_pipe.php.inc rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/Fixture/skip_no_pipe.php.inc diff --git a/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/config/configured_rule.php b/rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/config/configured_rule.php similarity index 100% rename from rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRectorTest/config/configured_rule.php rename to rules-tests/DowngradePhp85/Rector/StmtsAwareInterface/DowngradePipeOperatorRector/config/configured_rule.php diff --git a/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php b/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php index 9d8a456d..b58e848e 100644 --- a/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php +++ b/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php @@ -23,18 +23,6 @@ final class DowngradeNullsafeToTernaryOperatorRector extends AbstractRector { private int $counter = 0; - /** - * Hack-ish way to reset counter for a new file, to avoid rising counter for each file - * - * @param Node[] $nodes - * @return array|Node[]|null - */ - public function beforeTraverse(array $nodes): ?array - { - $this->counter = 0; - return parent::beforeTraverse($nodes); - } - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Change nullsafe operator to ternary operator rector', [ @@ -75,6 +63,7 @@ public function refactor(Node $node): ?Ternary $node->var->name, $node->var->args ), $node->name, $node->args); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); }