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 new file mode 100644 index 00000000..ba99b780 --- /dev/null +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php.inc @@ -0,0 +1,27 @@ +clock?->now()->format('U.u'); + } +} + +?> +----- +clock) ? $nullsafeVariable1->now()->format('U.u') : null; + } +} + +?> diff --git a/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php2.inc b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php2.inc new file mode 100644 index 00000000..bd59fe73 --- /dev/null +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit.php2.inc @@ -0,0 +1,27 @@ +clock?->now()->format; + } +} + +?> +----- +clock) ? $nullsafeVariable1->now()->format : 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 new file mode 100644 index 00000000..6e092e8f --- /dev/null +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit3.php.inc @@ -0,0 +1,27 @@ +clock?->now->format; + } +} + +?> +----- +clock) ? $nullsafeVariable1->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 new file mode 100644 index 00000000..3b6bcf05 --- /dev/null +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit4.php.inc @@ -0,0 +1,27 @@ +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 new file mode 100644 index 00000000..ac3b63b6 --- /dev/null +++ b/rules-tests/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector/Fixture/short_circuit5.php.inc @@ -0,0 +1,27 @@ +clock?->now()->format; + } +} + +?> +----- +clock) ? $nullsafeVariable1->now()->format : null; + } +} + +?> diff --git a/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php b/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php index 03236ed5..9d8a456d 100644 --- a/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php +++ b/rules/DowngradePhp80/Rector/NullsafeMethodCall/DowngradeNullsafeToTernaryOperatorRector.php @@ -55,18 +55,59 @@ public function getRuleDefinition(): RuleDefinition */ public function getNodeTypes(): array { - return [NullsafeMethodCall::class, NullsafePropertyFetch::class]; + return [MethodCall::class, PropertyFetch::class, NullsafeMethodCall::class, NullsafePropertyFetch::class]; } /** - * @param NullsafeMethodCall|NullsafePropertyFetch $node + * @param MethodCall|NullsafeMethodCall|NullsafePropertyFetch $node */ - public function refactor(Node $node): Ternary + public function refactor(Node $node): ?Ternary { + if ($node instanceof MethodCall || $node instanceof PropertyFetch) { + if ($node->var instanceof NullsafeMethodCall || $node->var instanceof NullsafePropertyFetch) { + $nullsafeVariable = $this->createNullsafeVariable(); + + $assign = new Assign($nullsafeVariable, $node->var->var); + if ($node instanceof MethodCall) { + if ($node->var instanceof NullsafeMethodCall) { + $methodCallOrPropertyFetch = new MethodCall(new MethodCall( + $nullsafeVariable, + $node->var->name, + $node->var->args + ), $node->name, $node->args); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + + $methodCallOrPropertyFetch = new MethodCall(new PropertyFetch( + $nullsafeVariable, + $node->var->name + ), $node->name, $node->args); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + + if ($node->var instanceof NullsafeMethodCall) { + $methodCallOrPropertyFetch = new PropertyFetch(new MethodCall( + $nullsafeVariable, + $node->var->name, + $node->var->args + ), $node->name); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + + $methodCallOrPropertyFetch = new PropertyFetch(new PropertyFetch( + $nullsafeVariable, + $node->var->name + ), $node->name); + return new Ternary($assign, $methodCallOrPropertyFetch, $this->nodeFactory->createNull()); + } + + return null; + } + $nullsafeVariable = $this->createNullsafeVariable(); $methodCallOrPropertyFetch = $node instanceof NullsafeMethodCall - ? new MethodCall($nullsafeVariable, $node->name, $node->getArgs()) + ? new MethodCall($nullsafeVariable, $node->name, $node->args) : new PropertyFetch($nullsafeVariable, $node->name); $assign = new Assign($nullsafeVariable, $node->var);