diff --git a/rules-tests/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector/Fixture/skip_mocks.php.inc b/rules-tests/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector/Fixture/skip_mocks.php.inc new file mode 100644 index 00000000000..7832cdff7a3 --- /dev/null +++ b/rules-tests/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector/Fixture/skip_mocks.php.inc @@ -0,0 +1,16 @@ +createMock(SomeSetterClass::class) + ->expects($this->once()) + ->method('some'); + } +} diff --git a/rules-tests/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector/Source/SomeSetterClass.php b/rules-tests/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector/Source/SomeSetterClass.php index 7b0ff3a3afa..36abfd51b98 100644 --- a/rules-tests/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector/Source/SomeSetterClass.php +++ b/rules-tests/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector/Source/SomeSetterClass.php @@ -2,7 +2,7 @@ namespace Rector\Tests\Unambiguous\Rector\Expression\FluentSettersToStandaloneCallMethodRector\Source; -final class SomeSetterClass +class SomeSetterClass { private ?string $name = null; diff --git a/rules/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector.php b/rules/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector.php index cd53d7ccce9..8c8907e11f9 100644 --- a/rules/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector.php +++ b/rules/Unambiguous/Rector/Expression/FluentSettersToStandaloneCallMethodRector.php @@ -4,6 +4,7 @@ namespace Rector\Unambiguous\Rector\Expression; +use PHPStan\Type\ObjectType; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; @@ -13,6 +14,7 @@ use PhpParser\Node\Name; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; +use PHPStan\Reflection\ClassReflection; use Rector\Naming\Naming\PropertyNaming; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Rector\AbstractRector; @@ -107,6 +109,10 @@ public function refactor(Node $node): ?array $rootExpr = $currentMethodCall; + if ($this->shouldSkipForVendorOrInternal($firstMethodCall)) { + return null; + } + $variableName = $this->resolveVariableName($rootExpr); $someVariable = new Variable($variableName); @@ -137,4 +143,22 @@ private function resolveVariableName(Expr $expr): string return 'someVariable'; } + + private function shouldSkipForVendorOrInternal(MethodCall $firstMethodCall): bool + { + $callerType = $this->getType($firstMethodCall); + if ($callerType instanceof ObjectType) { + $classReflection = $callerType->getClassReflection(); + if (! $classReflection instanceof ClassReflection) { + return false; + } + + $fileName = $classReflection->getFileName(); + if ($fileName === null || str_contains($fileName, 'vendor')) { + return true; + } + } + + return false; + } }