Skip to content

Commit 4aeddd5

Browse files
committed
Updated Rector to commit 5b90a0c85412597d283e34bfbf472f276a34b357
rectorphp/rector-src@5b90a0c Fix fixture source warning on AddOverrideAttributeToOverriddenMethodsRector (missing TestCase suffix) (#7869)
1 parent 94586d4 commit 4aeddd5

7 files changed

Lines changed: 176 additions & 6 deletions

File tree

vendor/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2044,6 +2044,7 @@
20442044
'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php',
20452045
'Rector\\PHPUnit\\PHPUnit110\\Rector\\Class_\\NamedArgumentForDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php',
20462046
'Rector\\PHPUnit\\PHPUnit120\\Rector\\CallLike\\CreateStubOverCreateMockArgRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit120/Rector/CallLike/CreateStubOverCreateMockArgRector.php',
2047+
'Rector\\PHPUnit\\PHPUnit120\\Rector\\ClassMethod\\ExpressionCreateMockToCreateStubRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit120/Rector/ClassMethod/ExpressionCreateMockToCreateStubRector.php',
20472048
'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\AllowMockObjectsWithoutExpectationsAttributeRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWithoutExpectationsAttributeRector.php',
20482049
'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\AssertIsTypeMethodCallRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/AssertIsTypeMethodCallRector.php',
20492050
'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\RemoveOverrideFinalConstructTestCaseRector' => $vendorDir . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php',

vendor/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,6 +2304,7 @@ class ComposerStaticInit43920ef660f86182970f9c36338f7965
23042304
'Rector\\PHPUnit\\PHPUnit100\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit100/Rector/StmtsAwareInterface/WithConsecutiveRector.php',
23052305
'Rector\\PHPUnit\\PHPUnit110\\Rector\\Class_\\NamedArgumentForDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit110/Rector/Class_/NamedArgumentForDataProviderRector.php',
23062306
'Rector\\PHPUnit\\PHPUnit120\\Rector\\CallLike\\CreateStubOverCreateMockArgRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit120/Rector/CallLike/CreateStubOverCreateMockArgRector.php',
2307+
'Rector\\PHPUnit\\PHPUnit120\\Rector\\ClassMethod\\ExpressionCreateMockToCreateStubRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit120/Rector/ClassMethod/ExpressionCreateMockToCreateStubRector.php',
23072308
'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\AllowMockObjectsWithoutExpectationsAttributeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWithoutExpectationsAttributeRector.php',
23082309
'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\AssertIsTypeMethodCallRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/AssertIsTypeMethodCallRector.php',
23092310
'Rector\\PHPUnit\\PHPUnit120\\Rector\\Class_\\RemoveOverrideFinalConstructTestCaseRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/PHPUnit120/Rector/Class_/RemoveOverrideFinalConstructTestCaseRector.php',

vendor/composer/installed.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,12 +1818,12 @@
18181818
"source": {
18191819
"type": "git",
18201820
"url": "https:\/\/github.com\/rectorphp\/rector-phpunit.git",
1821-
"reference": "74914f2dc57a083c5d12c3d4010abc33ec455a97"
1821+
"reference": "7ca99bc048602641181c81ca7057dddb308b5ac3"
18221822
},
18231823
"dist": {
18241824
"type": "zip",
1825-
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/74914f2dc57a083c5d12c3d4010abc33ec455a97",
1826-
"reference": "74914f2dc57a083c5d12c3d4010abc33ec455a97",
1825+
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/7ca99bc048602641181c81ca7057dddb308b5ac3",
1826+
"reference": "7ca99bc048602641181c81ca7057dddb308b5ac3",
18271827
"shasum": ""
18281828
},
18291829
"require": {
@@ -1850,7 +1850,7 @@
18501850
"tomasvotruba\/unused-public": "^2.2",
18511851
"tracy\/tracy": "^2.11"
18521852
},
1853-
"time": "2026-01-29T16:50:30+00:00",
1853+
"time": "2026-01-31T08:46:44+00:00",
18541854
"default-branch": true,
18551855
"type": "rector-extension",
18561856
"extra": {

vendor/composer/installed.php

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

vendor/rector/extension-installer/src/GeneratedConfig.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*/
1010
final class GeneratedConfig
1111
{
12-
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main 46e4f77'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main a110e2f'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 74914f2'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 582fc7c'));
12+
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main 46e4f77'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main a110e2f'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 7ca99bc'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 582fc7c'));
1313
private function __construct()
1414
{
1515
}

vendor/rector/rector-phpunit/config/sets/phpunit120.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
use Rector\PHPUnit\PHPUnit120\Rector\CallLike\CreateStubOverCreateMockArgRector;
88
use Rector\PHPUnit\PHPUnit120\Rector\Class_\AssertIsTypeMethodCallRector;
99
use Rector\PHPUnit\PHPUnit120\Rector\Class_\RemoveOverrideFinalConstructTestCaseRector;
10+
use Rector\PHPUnit\PHPUnit120\Rector\ClassMethod\ExpressionCreateMockToCreateStubRector;
1011
return static function (RectorConfig $rectorConfig): void {
1112
$rectorConfig->rules([
1213
RemoveOverrideFinalConstructTestCaseRector::class,
1314
AssertIsTypeMethodCallRector::class,
1415
// stubs over mocks
1516
CreateStubOverCreateMockArgRector::class,
17+
ExpressionCreateMockToCreateStubRector::class,
1618
]);
1719
};
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\PHPUnit\PHPUnit120\Rector\ClassMethod;
5+
6+
use PhpParser\Node;
7+
use PhpParser\Node\Arg;
8+
use PhpParser\Node\Expr\Assign;
9+
use PhpParser\Node\Expr\CallLike;
10+
use PhpParser\Node\Expr\MethodCall;
11+
use PhpParser\Node\Expr\New_;
12+
use PhpParser\Node\Expr\StaticCall;
13+
use PhpParser\Node\Expr\Variable;
14+
use PhpParser\Node\Identifier;
15+
use PhpParser\Node\Stmt\ClassMethod;
16+
use PhpParser\Node\Stmt\Expression;
17+
use Rector\PhpParser\Node\BetterNodeFinder;
18+
use Rector\PHPUnit\CodeQuality\NodeAnalyser\AssignedMocksCollector;
19+
use Rector\PHPUnit\CodeQuality\NodeFinder\VariableFinder;
20+
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
21+
use Rector\Rector\AbstractRector;
22+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
23+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
24+
/**
25+
* @see \Rector\PHPUnit\Tests\PHPUnit120\Rector\ClassMethod\ExpressionCreateMockToCreateStubRector\ExpressionCreateMockToCreateStubRectorTest
26+
*/
27+
final class ExpressionCreateMockToCreateStubRector extends AbstractRector
28+
{
29+
/**
30+
* @readonly
31+
*/
32+
private AssignedMocksCollector $assignedMocksCollector;
33+
/**
34+
* @readonly
35+
*/
36+
private TestsNodeAnalyzer $testsNodeAnalyzer;
37+
/**
38+
* @readonly
39+
*/
40+
private VariableFinder $variableFinder;
41+
/**
42+
* @readonly
43+
*/
44+
private BetterNodeFinder $betterNodeFinder;
45+
public function __construct(AssignedMocksCollector $assignedMocksCollector, TestsNodeAnalyzer $testsNodeAnalyzer, VariableFinder $variableFinder, BetterNodeFinder $betterNodeFinder)
46+
{
47+
$this->assignedMocksCollector = $assignedMocksCollector;
48+
$this->testsNodeAnalyzer = $testsNodeAnalyzer;
49+
$this->variableFinder = $variableFinder;
50+
$this->betterNodeFinder = $betterNodeFinder;
51+
}
52+
public function getRuleDefinition(): RuleDefinition
53+
{
54+
return new RuleDefinition('Replace createMock() assigned to variable that is only used as arg with no expectations, to createStub()', [new CodeSample(<<<'CODE_SAMPLE'
55+
use PHPUnit\Framework\TestCase;
56+
57+
final class SomeTest extends TestCase
58+
{
59+
public function test(): void
60+
{
61+
$mock = $this->createMock(SomeClass::class);
62+
63+
$someObject = new SomeClass($mock);
64+
$this->assertSame($mock, $someObject->getDependency());
65+
}
66+
}
67+
CODE_SAMPLE
68+
, <<<'CODE_SAMPLE'
69+
use PHPUnit\Framework\TestCase;
70+
71+
final class SomeTest extends TestCase
72+
{
73+
public function test(): void
74+
{
75+
$mock = $this->createStub(SomeClass::class);
76+
77+
$someObject = new SomeClass($mock);
78+
$this->assertSame($mock, $someObject->getDependency());
79+
}
80+
}
81+
CODE_SAMPLE
82+
)]);
83+
}
84+
public function getNodeTypes(): array
85+
{
86+
return [ClassMethod::class];
87+
}
88+
/**
89+
* @param ClassMethod $node
90+
*/
91+
public function refactor(Node $node): ?ClassMethod
92+
{
93+
if (!$this->testsNodeAnalyzer->isTestClassMethod($node)) {
94+
return null;
95+
}
96+
if ($node->stmts === null || count($node->stmts) < 2) {
97+
return null;
98+
}
99+
$hasChanged = \false;
100+
foreach ($node->stmts as $stmt) {
101+
if (!$stmt instanceof Expression) {
102+
continue;
103+
}
104+
if (!$stmt->expr instanceof Assign) {
105+
continue;
106+
}
107+
$typeArg = $this->assignedMocksCollector->matchCreateMockArgAssignedToVariable($stmt->expr);
108+
if (!$typeArg instanceof Arg) {
109+
continue;
110+
}
111+
/** @var Assign $assign */
112+
$assign = $stmt->expr;
113+
if (!$assign->var instanceof Variable) {
114+
continue;
115+
}
116+
$assignedVariable = $assign->var;
117+
$variableName = $this->getName($assignedVariable);
118+
if ($variableName === null) {
119+
continue;
120+
}
121+
// find variable usages outside call like and inside it
122+
$usedVariables = $this->variableFinder->find($node, $variableName);
123+
// used variable in calls
124+
/** @var array<StaticCall|MethodCall|New_> $callLikes */
125+
$callLikes = $this->betterNodeFinder->findInstancesOfScoped($node->stmts, [CallLike::class]);
126+
$callLikeUsedVariables = $this->collectVariableInCallLikeArg($callLikes, $variableName);
127+
if (count($usedVariables) - 1 !== count($callLikeUsedVariables)) {
128+
continue;
129+
}
130+
// here we can flip the createMock() to createStub()
131+
if (!$assign->expr instanceof MethodCall) {
132+
continue;
133+
}
134+
$methodCall = $assign->expr;
135+
$methodCall->name = new Identifier('createStub');
136+
$hasChanged = \true;
137+
}
138+
if ($hasChanged) {
139+
return $node;
140+
}
141+
return null;
142+
}
143+
/**
144+
* @param CallLike[] $callLikes
145+
* @return Variable[]
146+
*/
147+
private function collectVariableInCallLikeArg(array $callLikes, string $variableName): array
148+
{
149+
$callLikeUsedVariables = [];
150+
foreach ($callLikes as $callLike) {
151+
if ($callLike->isFirstClassCallable()) {
152+
continue;
153+
}
154+
foreach ($callLike->getArgs() as $arg) {
155+
if (!$arg->value instanceof Variable) {
156+
continue;
157+
}
158+
if (!$this->isName($arg->value, $variableName)) {
159+
continue;
160+
}
161+
$callLikeUsedVariables[] = $arg->value;
162+
}
163+
}
164+
return $callLikeUsedVariables;
165+
}
166+
}

0 commit comments

Comments
 (0)