Skip to content

Commit 044a026

Browse files
committed
Updated Rector to commit eac1efd2ac2c2fce0ee6ed758d52f57acbf08a27
rectorphp/rector-src@eac1efd [DeadCode] Allow remove @var on expression assign on RemoveUselessVarTagRector (#7871)
1 parent 431401a commit 044a026

File tree

8 files changed

+210
-9
lines changed

8 files changed

+210
-9
lines changed

vendor/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,6 +1971,7 @@
19711971
'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TypeWillReturnCallableArrowFunctionRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php',
19721972
'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\YieldDataProviderRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php',
19731973
'Rector\\PHPUnit\\CodeQuality\\Rector\\Expression\\AssertArrayCastedObjectToAssertSameRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Expression/AssertArrayCastedObjectToAssertSameRector.php',
1974+
'Rector\\PHPUnit\\CodeQuality\\Rector\\Expression\\ConfiguredMockEntityToSetterObjectRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Expression/ConfiguredMockEntityToSetterObjectRector.php',
19741975
'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php',
19751976
'Rector\\PHPUnit\\CodeQuality\\Rector\\FuncCall\\AssertFuncCallToPHPUnitAssertRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php',
19761977
'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareOnCountableWithMethodToAssertCountRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.php',

vendor/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2231,6 +2231,7 @@ class ComposerStaticInit43920ef660f86182970f9c36338f7965
22312231
'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\TypeWillReturnCallableArrowFunctionRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/TypeWillReturnCallableArrowFunctionRector.php',
22322232
'Rector\\PHPUnit\\CodeQuality\\Rector\\Class_\\YieldDataProviderRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php',
22332233
'Rector\\PHPUnit\\CodeQuality\\Rector\\Expression\\AssertArrayCastedObjectToAssertSameRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Expression/AssertArrayCastedObjectToAssertSameRector.php',
2234+
'Rector\\PHPUnit\\CodeQuality\\Rector\\Expression\\ConfiguredMockEntityToSetterObjectRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Expression/ConfiguredMockEntityToSetterObjectRector.php',
22342235
'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php',
22352236
'Rector\\PHPUnit\\CodeQuality\\Rector\\FuncCall\\AssertFuncCallToPHPUnitAssertRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/FuncCall/AssertFuncCallToPHPUnitAssertRector.php',
22362237
'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareOnCountableWithMethodToAssertCountRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareOnCountableWithMethodToAssertCountRector.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": "16c787fce88dfb76308a435960e621709cba569f"
1821+
"reference": "edebbb1b1f3a4faef4440cf6afeabfed809c9451"
18221822
},
18231823
"dist": {
18241824
"type": "zip",
1825-
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/16c787fce88dfb76308a435960e621709cba569f",
1826-
"reference": "16c787fce88dfb76308a435960e621709cba569f",
1825+
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/edebbb1b1f3a4faef4440cf6afeabfed809c9451",
1826+
"reference": "edebbb1b1f3a4faef4440cf6afeabfed809c9451",
18271827
"shasum": ""
18281828
},
18291829
"require": {
@@ -1850,7 +1850,7 @@
18501850
"tomasvotruba\/unused-public": "^2.2",
18511851
"tracy\/tracy": "^2.11"
18521852
},
1853-
"time": "2026-02-01T22:01:51+00:00",
1853+
"time": "2026-02-02T12:11:03+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 16c787f'), '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 edebbb1'), '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/phpunit-code-quality.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@
113113
SingleMockPropertyTypeRector::class,
114114
SimplerWithIsInstanceOfRector::class,
115115
DirectInstanceOverMockArgRector::class,
116+
// @test first, enable later
117+
// \Rector\PHPUnit\CodeQuality\Rector\Expression\ConfiguredMockEntityToSetterObjectRector::class,
116118
FinalizeTestCaseClassRector::class,
117119
DeclareStrictTypesTestsRector::class,
118120
WithCallbackIdenticalToStandaloneAssertsRector::class,
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\PHPUnit\CodeQuality\Rector\Expression;
5+
6+
use PhpParser\Node\Stmt\Class_;
7+
use PhpParser\Node;
8+
use PhpParser\Node\Arg;
9+
use PhpParser\Node\Expr;
10+
use PhpParser\Node\Expr\Array_;
11+
use PhpParser\Node\Expr\Assign;
12+
use PhpParser\Node\Expr\MethodCall;
13+
use PhpParser\Node\Expr\New_;
14+
use PhpParser\Node\Name\FullyQualified;
15+
use PhpParser\Node\Stmt\Expression;
16+
use PHPStan\Reflection\ReflectionProvider;
17+
use Rector\Doctrine\NodeAnalyzer\DoctrineEntityDetector;
18+
use Rector\PhpParser\AstResolver;
19+
use Rector\PhpParser\Node\Value\ValueResolver;
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\CodeQuality\Rector\Expression\ConfiguredMockEntityToSetterObjectRector\ConfiguredMockEntityToSetterObjectRectorTest
26+
*/
27+
final class ConfiguredMockEntityToSetterObjectRector extends AbstractRector
28+
{
29+
/**
30+
* @readonly
31+
*/
32+
private ReflectionProvider $reflectionProvider;
33+
/**
34+
* @readonly
35+
*/
36+
private TestsNodeAnalyzer $testsNodeAnalyzer;
37+
/**
38+
* @readonly
39+
*/
40+
private ValueResolver $valueResolver;
41+
/**
42+
* @readonly
43+
*/
44+
private AstResolver $astResolver;
45+
/**
46+
* @readonly
47+
*/
48+
private DoctrineEntityDetector $doctrineEntityDetector;
49+
public function __construct(ReflectionProvider $reflectionProvider, TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver, AstResolver $astResolver, DoctrineEntityDetector $doctrineEntityDetector)
50+
{
51+
$this->reflectionProvider = $reflectionProvider;
52+
$this->testsNodeAnalyzer = $testsNodeAnalyzer;
53+
$this->valueResolver = $valueResolver;
54+
$this->astResolver = $astResolver;
55+
$this->doctrineEntityDetector = $doctrineEntityDetector;
56+
}
57+
public function getRuleDefinition(): RuleDefinition
58+
{
59+
return new RuleDefinition('Change createConfigureMock() on Entity/Document object to direct new instance with setters', [new CodeSample(<<<'CODE_SAMPLE'
60+
use PHPUnit\Framework\TestCase;
61+
62+
final class SomeTest extends TestClass
63+
{
64+
public function test()
65+
{
66+
$someObject = $this->createConfiguredMock(SomeObject::class, [
67+
'name' => 'John',
68+
'surname' => 'Doe',
69+
]);
70+
}
71+
}
72+
CODE_SAMPLE
73+
, <<<'CODE_SAMPLE'
74+
use PHPUnit\Framework\TestCase;
75+
76+
final class SomeTest extends TestClass
77+
{
78+
public function test()
79+
{
80+
$someObject = new SomeObject();
81+
$someObject->setName('John');
82+
$someObject->setSurname('Doe');
83+
}
84+
}
85+
CODE_SAMPLE
86+
)]);
87+
}
88+
/**
89+
* @return array<class-string<Node>>
90+
*/
91+
public function getNodeTypes(): array
92+
{
93+
return [Expression::class];
94+
}
95+
/**
96+
* @param Expression $node
97+
* @return Expression[]|null
98+
*/
99+
public function refactor(Node $node): ?array
100+
{
101+
if (!$this->testsNodeAnalyzer->isInTestClass($node)) {
102+
return null;
103+
}
104+
if (!$node->expr instanceof Assign) {
105+
return null;
106+
}
107+
$assign = $node->expr;
108+
if (!$assign->expr instanceof MethodCall) {
109+
return null;
110+
}
111+
$objectVariable = $assign->var;
112+
$methodCall = $assign->expr;
113+
if (!$this->isName($methodCall->name, 'createConfiguredMock')) {
114+
return null;
115+
}
116+
if ($methodCall->isFirstClassCallable()) {
117+
return null;
118+
}
119+
$mockedClassArg = $methodCall->getArgs()[0];
120+
$doctrineClass = $this->matchDoctrineClassName($mockedClassArg->value);
121+
if (!is_string($doctrineClass)) {
122+
return null;
123+
}
124+
$definedGettersArg = $methodCall->getArgs()[1];
125+
if (!$definedGettersArg->value instanceof Array_) {
126+
return null;
127+
}
128+
$assign->expr = new New_(new FullyQualified($doctrineClass));
129+
$setterExpressions = $this->createEntitySetterExpressions($definedGettersArg->value, $objectVariable);
130+
return array_merge([$node], $setterExpressions);
131+
}
132+
/**
133+
* @return Expression[]
134+
*/
135+
private function createEntitySetterExpressions(Array_ $definedGettersArray, Expr $expr): array
136+
{
137+
$setterExpressions = [];
138+
foreach ($definedGettersArray->items as $arrayItem) {
139+
if (!$arrayItem->key instanceof Expr) {
140+
continue;
141+
}
142+
$getterName = $this->valueResolver->getValue($arrayItem->key);
143+
if (!is_string($getterName)) {
144+
continue;
145+
}
146+
// remove "get" prefix
147+
if (strncmp($getterName, 'get', strlen('get')) !== 0) {
148+
continue;
149+
}
150+
$setterName = 'set' . substr($getterName, 3);
151+
$setterMethodCall = new MethodCall($expr, $setterName, [new Arg($arrayItem->value)]);
152+
$setterExpressions[] = new Expression($setterMethodCall);
153+
}
154+
return $setterExpressions;
155+
}
156+
private function matchDoctrineClassName(Expr $expr): ?string
157+
{
158+
$mockedClassValue = $this->valueResolver->getValue($expr);
159+
if (!is_string($mockedClassValue)) {
160+
return null;
161+
}
162+
if (!$this->reflectionProvider->hasClass($mockedClassValue)) {
163+
return null;
164+
}
165+
$mockedClass = $this->astResolver->resolveClassFromName($mockedClassValue);
166+
if (!$mockedClass instanceof Class_) {
167+
return null;
168+
}
169+
if (!$this->doctrineEntityDetector->detect($mockedClass)) {
170+
return null;
171+
}
172+
return $mockedClassValue;
173+
}
174+
}

vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertThatToDirectAssertRector.php

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PhpParser\Node;
77
use PhpParser\Node\Expr\MethodCall;
88
use PhpParser\Node\Identifier;
9+
use Rector\PhpParser\Node\Value\ValueResolver;
910
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
1011
use Rector\Rector\AbstractRector;
1112
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
@@ -19,9 +20,18 @@ final class AssertThatToDirectAssertRector extends AbstractRector
1920
* @readonly
2021
*/
2122
private TestsNodeAnalyzer $testsNodeAnalyzer;
22-
public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer)
23+
/**
24+
* @readonly
25+
*/
26+
private ValueResolver $valueResolver;
27+
/**
28+
* @var array<string, string>
29+
*/
30+
private const IS_TO_ASSERT_METHOD_MAP = ['isTrue' => 'assertTrue', 'isFalse' => 'assertFalse', 'isNull' => 'assertNull', 'isEmpty' => 'assertEmpty', 'isCountable' => 'assertIsCountable', 'isArray' => 'assertIsArray', 'isString' => 'assertIsString', 'isInt' => 'assertIsInt', 'isFloat' => 'assertIsFloat', 'isBool' => 'assertIsBool'];
31+
public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver)
2332
{
2433
$this->testsNodeAnalyzer = $testsNodeAnalyzer;
34+
$this->valueResolver = $valueResolver;
2535
}
2636
public function getRuleDefinition(): RuleDefinition
2737
{
@@ -79,8 +89,21 @@ public function refactor(Node $node): ?Node
7989
$node->args[0] = $exactAssertMethodCall->args[0];
8090
return $node;
8191
}
82-
if ($exactAssertName === 'isTrue') {
83-
$node->name = new Identifier('assertTrue');
92+
foreach (self::IS_TO_ASSERT_METHOD_MAP as $isName => $assertName) {
93+
if (!$this->isName($exactAssertMethodCall->name, $isName)) {
94+
continue;
95+
}
96+
$node->name = new Identifier($assertName);
97+
unset($node->args[1]);
98+
return $node;
99+
}
100+
if ($this->isName($exactAssertMethodCall->name, 'isType')) {
101+
$exactFirstArg = $exactAssertMethodCall->getArgs()[0];
102+
$expectedType = $this->valueResolver->getValue($exactFirstArg->value);
103+
if (!is_string($expectedType)) {
104+
return null;
105+
}
106+
$node->name = new Identifier('assertIs' . ucfirst($expectedType));
84107
unset($node->args[1]);
85108
return $node;
86109
}

0 commit comments

Comments
 (0)