Skip to content

Commit 760070c

Browse files
committed
extract ConsoleOptionAndArgumentMethodCallVariableReplacer
1 parent 64b7d8c commit 760070c

File tree

5 files changed

+118
-55
lines changed

5 files changed

+118
-55
lines changed

rules-tests/Configs/Rector/Closure/ServiceSettersToSettersAutodiscoveryRector/MinimalSharedStringSolverTest.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,31 +17,31 @@ final class MinimalSharedStringSolverTest extends TestCase
1717

1818
public static function setUpBeforeClass(): void
1919
{
20-
static::$minimalSharedStringSolver = new MinimalSharedStringSolver();
20+
self::$minimalSharedStringSolver = new MinimalSharedStringSolver();
2121
}
2222

2323
#[DataProvider('twoStringsSymmetricValuesProvider')]
2424
public function testTwoStringsSymmetric(string $stringLeft, string $stringRight, string $expected): void
2525
{
26-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringLeft, $stringRight));
27-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringRight, $stringLeft));
26+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringLeft, $stringRight));
27+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringRight, $stringLeft));
2828
}
2929

3030
#[DataProvider('twoStringsOrderedValuesProvider')]
3131
public function testTwoStringsOrdered(string $stringLeft, string $stringRight, string $expected): void
3232
{
33-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringLeft, $stringRight));
33+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringLeft, $stringRight));
3434
}
3535

3636
#[DataProvider('threeStringsSymmetricValuesProvider')]
3737
public function testThreeStringsSymmetric(string $stringA, string $stringB, string $stringC, string $expected): void
3838
{
39-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringA, $stringB, $stringC));
40-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringA, $stringC, $stringB));
41-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringB, $stringA, $stringC));
42-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringB, $stringC, $stringA));
43-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringC, $stringA, $stringB));
44-
$this->assertSame($expected, static::$minimalSharedStringSolver->solve($stringC, $stringB, $stringA));
39+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringA, $stringB, $stringC));
40+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringA, $stringC, $stringB));
41+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringB, $stringA, $stringC));
42+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringB, $stringC, $stringA));
43+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringC, $stringA, $stringB));
44+
$this->assertSame($expected, self::$minimalSharedStringSolver->solve($stringC, $stringB, $stringA));
4545
}
4646

4747
/**
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Symfony\Symfony73\NodeTransformer;
6+
7+
use PhpParser\Node;
8+
use PhpParser\Node\Expr\ClassConstFetch;
9+
use PhpParser\Node\Expr\ConstFetch;
10+
use PhpParser\Node\Expr\MethodCall;
11+
use PhpParser\Node\Expr\Variable;
12+
use PhpParser\Node\Scalar\String_;
13+
use PhpParser\Node\Stmt\ClassMethod;
14+
use Rector\Exception\ShouldNotHappenException;
15+
use Rector\NodeNameResolver\NodeNameResolver;
16+
use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser;
17+
use Rector\PhpParser\Node\Value\ValueResolver;
18+
19+
final readonly class ConsoleOptionAndArgumentMethodCallVariableReplacer
20+
{
21+
public function __construct(
22+
private NodeNameResolver $nodeNameResolver,
23+
private SimpleCallableNodeTraverser $simpleCallableNodeTraverser,
24+
private ValueResolver $valueResolver,
25+
) {
26+
27+
}
28+
29+
public function replace(ClassMethod $executeClassMethod): void
30+
{
31+
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($executeClassMethod->stmts, function (
32+
Node $node
33+
): ?Variable {
34+
if (! $node instanceof MethodCall) {
35+
return null;
36+
}
37+
38+
if (! $this->nodeNameResolver->isName($node->var, 'input')) {
39+
return null;
40+
}
41+
42+
if (! $this->nodeNameResolver->isNames($node->name, ['getOption', 'getArgument'])) {
43+
return null;
44+
}
45+
46+
$firstArgValue = $node->getArgs()[0]
47+
->value;
48+
49+
if ($firstArgValue instanceof ClassConstFetch || $firstArgValue instanceof ConstFetch) {
50+
$variableName = $this->valueResolver->getValue($firstArgValue);
51+
return new Variable(str_replace('-', '_', $variableName));
52+
}
53+
54+
if (! $firstArgValue instanceof String_) {
55+
// unable to resolve argument/option name
56+
throw new ShouldNotHappenException();
57+
}
58+
59+
$variableName = $firstArgValue->value;
60+
return new Variable(str_replace('-', '_', $variableName));
61+
});
62+
}
63+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Symfony\Symfony73\NodeTransformer;
6+
7+
use PhpParser\Node\Stmt\ClassMethod;
8+
use Rector\NodeNameResolver\NodeNameResolver;
9+
use Rector\PhpParser\Node\Value\ValueResolver;
10+
11+
final readonly class OutputInputSymfonyStyleReplacer
12+
{
13+
public function __construct(
14+
private NodeNameResolver $nodeNameResolver,
15+
private ValueResolver $valueResolver,
16+
) {
17+
}
18+
19+
public function replace(ClassMethod $executeClassMethod): void
20+
{
21+
dump(123);
22+
die;
23+
}
24+
}

rules/Symfony73/Rector/Class_/ConstraintOptionsToNamedArgumentsRector.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
use PhpParser\Node;
88
use PhpParser\Node\Arg;
9+
<<<<<<< HEAD
910
use PhpParser\Node\ArrayItem;
11+
=======
12+
>>>>>>> cf6f011c (fixup! fixup! apply rector)
1013
use PhpParser\Node\Expr;
1114
use PhpParser\Node\Expr\Array_;
1215
use PhpParser\Node\Expr\New_;
@@ -88,6 +91,8 @@ public function refactor(Node $node): ?Node
8891
$namedArgs = [];
8992

9093
foreach ($array->items as $item) {
94+
<<<<<<< HEAD
95+
<<<<<<< HEAD
9196
if (! $item instanceof ArrayItem) {
9297
continue;
9398
}
@@ -98,6 +103,12 @@ public function refactor(Node $node): ?Node
98103
return null;
99104
}
100105

106+
=======
107+
if (! $item instanceof ArrayItem || !$item->key instanceof Expr) {
108+
>>>>>>> 80213bcd (apply rector)
109+
=======
110+
if (! $item instanceof ArrayItem || ! $item->key instanceof Expr) {
111+
>>>>>>> cf6f011c (fixup! fixup! apply rector)
101112
continue;
102113
}
103114

rules/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector.php

Lines changed: 10 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,23 @@
55
namespace Rector\Symfony\Symfony73\Rector\Class_;
66

77
use PhpParser\Node;
8-
use PhpParser\Node\Attribute;
9-
use PhpParser\Node\Expr\ClassConstFetch;
10-
use PhpParser\Node\Expr\ConstFetch;
118
use PhpParser\Node\Expr\MethodCall;
129
use PhpParser\Node\Expr\Variable;
1310
use PhpParser\Node\Identifier;
1411
use PhpParser\Node\Name;
15-
use PhpParser\Node\Scalar\String_;
1612
use PhpParser\Node\Stmt\Class_;
1713
use PhpParser\Node\Stmt\ClassMethod;
1814
use PhpParser\Node\Stmt\Expression;
1915
use Rector\Doctrine\NodeAnalyzer\AttributeFinder;
20-
use Rector\Exception\ShouldNotHappenException;
21-
use Rector\PhpParser\Node\Value\ValueResolver;
2216
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
2317
use Rector\Rector\AbstractRector;
2418
use Rector\Symfony\Enum\CommandMethodName;
2519
use Rector\Symfony\Enum\SymfonyAttribute;
2620
use Rector\Symfony\Enum\SymfonyClass;
2721
use Rector\Symfony\Symfony73\NodeAnalyzer\CommandArgumentsAndOptionsResolver;
2822
use Rector\Symfony\Symfony73\NodeFactory\CommandInvokeParamsFactory;
23+
use Rector\Symfony\Symfony73\NodeTransformer\ConsoleOptionAndArgumentMethodCallVariableReplacer;
24+
use Rector\Symfony\Symfony73\NodeTransformer\OutputInputSymfonyStyleReplacer;
2925
use Rector\ValueObject\MethodName;
3026
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
3127
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@@ -46,8 +42,9 @@ public function __construct(
4642
private readonly AttributeFinder $attributeFinder,
4743
private readonly CommandArgumentsAndOptionsResolver $commandArgumentsAndOptionsResolver,
4844
private readonly CommandInvokeParamsFactory $commandInvokeParamsFactory,
49-
private readonly ValueResolver $valueResolver,
45+
private readonly ConsoleOptionAndArgumentMethodCallVariableReplacer $consoleOptionAndArgumentMethodCallVariableReplacer,
5046
private readonly VisibilityManipulator $visibilityManipulator,
47+
private readonly OutputInputSymfonyStyleReplacer $outputInputSymfonyStyleReplacer
5148
) {
5249
}
5350

@@ -162,7 +159,7 @@ public function refactor(Node $node): ?Class_
162159
$commandOptions = $this->commandArgumentsAndOptionsResolver->collectCommandOptions($configureClassMethod);
163160

164161
// 4. remove configure() method
165-
$this->removeConfigureClassMethod($node);
162+
$this->removeConfigureClassMethodIfNotUseful($node);
166163

167164
// 5. decorate __invoke method with attributes
168165
$invokeParams = $this->commandInvokeParamsFactory->createParams($commandArguments, $commandOptions);
@@ -189,7 +186,7 @@ public function refactor(Node $node): ?Class_
189186

190187
if ($configureClassMethod instanceof ClassMethod) {
191188
// 7. replace input->getArgument() and input->getOption() calls with direct variable access
192-
$this->replaceInputArgumentOptionFetchWithVariables($executeClassMethod);
189+
$this->consoleOptionAndArgumentMethodCallVariableReplacer->replace($executeClassMethod);
193190
}
194191

195192
return $node;
@@ -207,7 +204,7 @@ private function isComplexCommand(Class_ $class): bool
207204
return $class->getMethod(CommandMethodName::INITIALIZE) instanceof ClassMethod;
208205
}
209206

210-
private function removeConfigureClassMethod(Class_ $class): void
207+
private function removeConfigureClassMethodIfNotUseful(Class_ $class): void
211208
{
212209
foreach ($class->stmts as $key => $stmt) {
213210
if (! $stmt instanceof ClassMethod) {
@@ -239,7 +236,7 @@ private function removeConfigureClassMethod(Class_ $class): void
239236
}
240237
}
241238

242-
// 2. if configure() has become empty → remove the method itself
239+
// 2. if configure() has became empty → remove the method itself
243240
if ($stmt->stmts === [] || $stmt->stmts === null) {
244241
unset($class->stmts[$key]);
245242
}
@@ -248,39 +245,6 @@ private function removeConfigureClassMethod(Class_ $class): void
248245
}
249246
}
250247

251-
private function replaceInputArgumentOptionFetchWithVariables(ClassMethod $executeClassMethod): void
252-
{
253-
$this->traverseNodesWithCallable($executeClassMethod->stmts, function (Node $node): ?Variable {
254-
if (! $node instanceof MethodCall) {
255-
return null;
256-
}
257-
258-
if (! $this->isName($node->var, 'input')) {
259-
return null;
260-
}
261-
262-
if (! $this->isNames($node->name, ['getOption', 'getArgument'])) {
263-
return null;
264-
}
265-
266-
$firstArgValue = $node->getArgs()[0]
267-
->value;
268-
269-
if ($firstArgValue instanceof ClassConstFetch || $firstArgValue instanceof ConstFetch) {
270-
$variableName = $this->valueResolver->getValue($firstArgValue);
271-
return new Variable(str_replace('-', '_', $variableName));
272-
}
273-
274-
if (! $firstArgValue instanceof String_) {
275-
// unable to resolve argument/option name
276-
throw new ShouldNotHappenException();
277-
}
278-
279-
$variableName = $firstArgValue->value;
280-
return new Variable(str_replace('-', '_', $variableName));
281-
});
282-
}
283-
284248
private function isFluentArgumentOptionChain(MethodCall $methodCall): bool
285249
{
286250
$current = $methodCall;
@@ -291,7 +255,8 @@ private function isFluentArgumentOptionChain(MethodCall $methodCall): bool
291255
return false;
292256
}
293257

294-
$current = $current->var; // go one step left
258+
// go one step left
259+
$current = $current->var;
295260
}
296261

297262
// the left-most var must be $this

0 commit comments

Comments
 (0)