From 0032e1f4a255ec48b66e2e3c783e6ef075e02d62 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sat, 6 Nov 2021 01:12:24 +0100 Subject: [PATCH] use BetterNodeFinder over attribute approach; current node tree is more reliable and will update after node refresh --- .phpstorm.meta.php | 2 -- build/target-repository/docs/how_it_works.md | 2 +- .../NodeTypeResolver/Node/AttributeKey.php | 9 ++++++ .../NodeTypeResolver/NodeTypeResolver.php | 8 ++++-- .../ClassMethodOrClassConstTypeResolver.php | 9 ++++-- .../PropertyFetchTypeResolver.php | 12 +++++--- .../FunctionMethodAndClassNodeVisitor.php | 1 - .../TypeAnalyzer/ArrayTypeAnalyzer.php | 13 ++++----- .../LocalPropertyFetchReadNodeAnalyzer.php | 7 +++-- .../Naming/NameScopeFactory.php | 14 +++++++--- .../Fixture/skip_array_pop.php.inc | 28 ------------------- .../ClassMethod/ArgumentAdderRector.php | 3 +- ...aysTrueConditionSetInConstructorRector.php | 3 +- .../Rector/New_/NewStaticToNewSelfRector.php | 3 +- ...itedMethodVisibilitySameAsParentRector.php | 3 +- .../ExprUsedInNextNodeAnalyzer.php | 14 ---------- .../IsClassMethodUsedAnalyzer.php | 2 +- .../ControllerClassMethodManipulator.php | 11 ++++---- .../PhpDoc/DeadReturnTagValueNodeAnalyzer.php | 8 ++++-- .../RemoveDeadConstructorRector.php | 3 +- .../RemoveDelegatingParentCallRector.php | 3 +- .../RemoveEmptyClassMethodRector.php | 5 ++-- .../RemoveUnusedConstructorParamRector.php | 7 ++--- .../RemoveUnusedPrivateMethodRector.php | 2 +- .../RemoveUnusedPromotedPropertyRector.php | 3 +- .../Rector/If_/RemoveDeadInstanceOfRector.php | 4 +-- ...FutureCompatibleIfFunctionExistsRector.php | 3 +- .../RemoveEmptyMethodCallRector.php | 5 ++-- .../RemoveParentCallWithoutParentRector.php | 2 +- ...ropertyConstructorInjectionManipulator.php | 11 ++++---- .../ClassMethod/AddMethodParentCallRector.php | 2 +- .../DowngradeParameterTypeWideningRector.php | 6 ++-- .../PropertyRenameFactory.php | 17 +++++------ .../ClassMethod/Php4ConstructorRector.php | 2 +- ...isCallOnStaticMethodToStaticCallRector.php | 2 +- .../Rector/FuncCall/CountOnNullRector.php | 4 +-- .../Rector/FuncCall/GetClassOnNullRector.php | 2 +- ...efaultNullToNullableTypePropertyRector.php | 3 +- .../Rector/AbstractPhpSpecToPHPUnitRector.php | 3 +- .../PhpSpecMocksToPHPUnitMocksRector.php | 2 +- .../PhpSpecPromisesToPHPUnitAssertRector.php | 5 ++-- ...hangeGlobalVariablesToPropertiesRector.php | 3 +- .../PrivatizeLocalGetterToPropertyRector.php | 3 +- ...opertyWithDefaultValueToConstantRector.php | 5 ++-- .../PrivatizeFinalClassPropertyRector.php | 2 +- .../NodeManipulator/ComplexNodeRemover.php | 2 +- ...llyCalledStaticMethodToNonStaticRector.php | 6 ++-- ...StaticPropertyFetchTypeToDynamicRector.php | 2 +- .../ClassMethod/RenameAnnotationRector.php | 3 +- .../Rector/MethodCall/RenameMethodRector.php | 3 +- .../PropertyFetch/RenamePropertyRector.php | 9 ++++-- ...keTypedPropertyNullableIfCheckedRector.php | 3 +- .../ClassMethod/SingleToManyMethodRector.php | 3 +- .../ArgumentFuncCallToMethodCallRector.php | 2 +- .../FuncCall/FuncCallToMethodCallRector.php | 2 +- .../MethodCallToMethodCallRector.php | 7 +++-- ...viceGetterToConstructorInjectionRector.php | 3 +- .../New_/NewToConstructorInjectionRector.php | 3 +- .../Rector/New_/NewToMethodCallRector.php | 2 +- .../StaticCallToMethodCallRector.php | 2 +- .../AddParamTypeDeclarationRector.php | 5 ++-- .../ReturnTypeDeclarationRector.php | 2 +- .../GetterNodeParamTypeInferer.php | 10 ++++--- .../KnownArrayParamTypeInferer.php | 11 ++++---- .../PHPUnitDataProviderParamTypeInferer.php | 6 ++-- .../PropertyNodeParamTypeInferer.php | 6 ++-- .../AllAssignNodePropertyTypeInferer.php | 13 +++++---- .../GetterPropertyTypeInferer.php | 11 ++++---- .../ReturnedNodesReturnTypeInferer.php | 12 ++++---- .../SetterNodeReturnTypeInferer.php | 7 +++-- .../TypeInferer/SilentVoidResolver.php | 12 ++------ src/NodeAnalyzer/EnumAnalyzer.php | 13 +++++---- src/NodeAnalyzer/PropertyFetchAnalyzer.php | 9 +++--- src/NodeManipulator/ClassConstManipulator.php | 5 ++-- .../ClassMethodManipulator.php | 6 ++-- src/NodeManipulator/PropertyManipulator.php | 6 ++-- .../NodeFinder/LocalConstantFinder.php | 5 ++-- .../NodeFinder/LocalMethodCallFinder.php | 3 +- src/Rector/AbstractRector.php | 1 - .../Issues/Issue6675/Fixture/fixture.php.inc | 8 ------ 80 files changed, 217 insertions(+), 247 deletions(-) delete mode 100644 rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_array_pop.php.inc diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php index 5f4982ad3f4..a85fd2cd632 100644 --- a/.phpstorm.meta.php +++ b/.phpstorm.meta.php @@ -47,7 +47,6 @@ \PhpParser\Node::getAttribute(), 0, \Rector\NodeTypeResolver\Node\AttributeKey::SCOPE, - \Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NODE, \Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NAME, \Rector\NodeTypeResolver\Node\AttributeKey::METHOD_NODE, \Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE, @@ -73,7 +72,6 @@ \PhpParser\Node::setAttribute(), 0, \Rector\NodeTypeResolver\Node\AttributeKey::SCOPE, - \Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NODE, \Rector\NodeTypeResolver\Node\AttributeKey::CLASS_NAME, \Rector\NodeTypeResolver\Node\AttributeKey::METHOD_NODE, \Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE, diff --git a/build/target-repository/docs/how_it_works.md b/build/target-repository/docs/how_it_works.md index 02702dfc4ce..ecb1156771a 100644 --- a/build/target-repository/docs/how_it_works.md +++ b/build/target-repository/docs/how_it_works.md @@ -43,7 +43,7 @@ foreach ($fileInfos as $fileInfo) { ### 2.1 Prepare Phase - Files are parsed by [`nikic/php-parser`](https://github.com/nikic/PHP-Parser), 4.0 that supports writing modified tree back to a file -- Then nodes (array of objects by parser) are traversed by `StandaloneTraverseNodeTraverser` to prepare their metadata, e.g. the class name, the method node the node is in, the namespace name etc. added by `$node->setAttribute(Attribute::CLASS_NODE, 'value')`. +- Then nodes (array of objects by parser) are traversed by `StandaloneTraverseNodeTraverser` to prepare their metadata, e.g. the class name, the method node the node is in, the namespace name etc. added by `$node->setAttribute('key', 'value')`. ### 2.2 Rectify Phase diff --git a/packages/NodeTypeResolver/Node/AttributeKey.php b/packages/NodeTypeResolver/Node/AttributeKey.php index b0726cbcfb8..13400e36326 100644 --- a/packages/NodeTypeResolver/Node/AttributeKey.php +++ b/packages/NodeTypeResolver/Node/AttributeKey.php @@ -4,6 +4,8 @@ namespace Rector\NodeTypeResolver\Node; +use Rector\Core\PhpParser\Node\BetterNodeFinder; +use Rector\NodeNameResolver\NodeNameResolver; use Symplify\SmartFileSystem\SmartFileInfo; /** @@ -28,11 +30,18 @@ final class AttributeKey public const USE_NODES = 'useNodes'; /** + * @deprecated Use + * @see BetterNodeFinder and + * @see NodeNameResolver to find your parent nodes. + * * @var string */ public const CLASS_NAME = 'className'; /** + * @deprecated Use + * @see BetterNodeFinder to find your parent nodes. + * * @var string */ public const CLASS_NODE = 'class_node'; diff --git a/packages/NodeTypeResolver/NodeTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver.php index 09a1d4a8857..0174991b4a7 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver.php @@ -39,6 +39,7 @@ use PHPStan\Type\UnionType; use Rector\Core\Configuration\RenamedClassesDataCollector; use Rector\Core\NodeAnalyzer\ClassAnalyzer; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeCorrector\AccessoryNonEmptyStringTypeCorrector; @@ -71,6 +72,7 @@ public function __construct( private AccessoryNonEmptyStringTypeCorrector $accessoryNonEmptyStringTypeCorrector, private IdentifierTypeResolver $identifierTypeResolver, private RenamedClassesDataCollector $renamedClassesDataCollector, + private BetterNodeFinder $betterNodeFinder, array $nodeTypeResolvers ) { foreach ($nodeTypeResolvers as $nodeTypeResolver) { @@ -324,12 +326,12 @@ public function isMethodStaticCallOrClassMethodObjectType(Node $node, ObjectType return $this->isObjectType($node->class, $objectType); } - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($node, Class_::class); + if (! $class instanceof Class_) { return false; } - return $this->isObjectType($classLike, $objectType); + return $this->isObjectType($class, $objectType); } private function isUnionTypeable(Type $first, Type $second): bool diff --git a/packages/NodeTypeResolver/NodeTypeResolver/ClassMethodOrClassConstTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver/ClassMethodOrClassConstTypeResolver.php index 30d75834826..d21a89f0cd2 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver/ClassMethodOrClassConstTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver/ClassMethodOrClassConstTypeResolver.php @@ -11,8 +11,8 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Type\ObjectWithoutClassType; use PHPStan\Type\Type; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Symfony\Contracts\Service\Attribute\Required; @@ -20,6 +20,11 @@ final class ClassMethodOrClassConstTypeResolver implements NodeTypeResolverInter { private NodeTypeResolver $nodeTypeResolver; + public function __construct( + private BetterNodeFinder $betterNodeFinder + ) { + } + #[Required] public function autowireClassMethodOrClassConstTypeResolver(NodeTypeResolver $nodeTypeResolver): void { @@ -39,7 +44,7 @@ public function getNodeClasses(): array */ public function resolve(Node $node): Type { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class); if (! $classLike instanceof ClassLike) { // anonymous class return new ObjectWithoutClassType(); diff --git a/packages/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php index 3f42ba8a68b..7a159bea438 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver/PropertyFetchTypeResolver.php @@ -6,12 +6,14 @@ use PhpParser\Node; use PhpParser\Node\Expr\PropertyFetch; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassLike; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -27,7 +29,8 @@ final class PropertyFetchTypeResolver implements NodeTypeResolverInterface public function __construct( private NodeNameResolver $nodeNameResolver, - private ReflectionProvider $reflectionProvider + private ReflectionProvider $reflectionProvider, + private BetterNodeFinder $betterNodeFinder ) { } @@ -59,10 +62,11 @@ public function resolve(Node $node): Type /** @var Scope|null $scope */ $scope = $node->getAttribute(AttributeKey::SCOPE); if (! $scope instanceof Scope) { - $classNode = $node->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($node, Class_::class); + // fallback to class, since property fetches are not scoped by PHPStan - if ($classNode instanceof ClassLike) { - $scope = $classNode->getAttribute(AttributeKey::SCOPE); + if ($class instanceof ClassLike) { + $scope = $class->getAttribute(AttributeKey::SCOPE); } if (! $scope instanceof Scope) { diff --git a/packages/NodeTypeResolver/NodeVisitor/FunctionMethodAndClassNodeVisitor.php b/packages/NodeTypeResolver/NodeVisitor/FunctionMethodAndClassNodeVisitor.php index b1806d37a3a..83f326e9ac3 100644 --- a/packages/NodeTypeResolver/NodeVisitor/FunctionMethodAndClassNodeVisitor.php +++ b/packages/NodeTypeResolver/NodeVisitor/FunctionMethodAndClassNodeVisitor.php @@ -70,7 +70,6 @@ private function processClass(Node $node): void $this->setClassNodeAndName($node); } - $node->setAttribute(AttributeKey::CLASS_NODE, $this->classLike); $node->setAttribute(AttributeKey::CLASS_NAME, $this->className); } diff --git a/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php b/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php index 208f9f6749d..ee90de76c5a 100644 --- a/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php +++ b/packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php @@ -8,9 +8,8 @@ use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; -use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Interface_; -use PhpParser\Node\Stmt\Trait_; use PHPStan\Type\Accessory\HasOffsetType; use PHPStan\Type\Accessory\NonEmptyArrayType; use PHPStan\Type\ArrayType; @@ -19,8 +18,8 @@ use PHPStan\Type\ThisType; use PHPStan\Type\Type; use PHPStan\Type\TypeWithClassName; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeCorrector\PregMatchTypeCorrector; use Rector\NodeTypeResolver\NodeTypeResolver; @@ -29,7 +28,8 @@ final class ArrayTypeAnalyzer public function __construct( private NodeNameResolver $nodeNameResolver, private NodeTypeResolver $nodeTypeResolver, - private PregMatchTypeCorrector $pregMatchTypeCorrector + private PregMatchTypeCorrector $pregMatchTypeCorrector, + private BetterNodeFinder $betterNodeFinder, ) { } @@ -96,13 +96,12 @@ private function isPropertyFetchWithArrayDefault(Node $node): bool return false; } - /** @var Class_|Trait_|Interface_|null $classLike */ - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class); if ($classLike instanceof Interface_) { return false; } - if ($classLike === null) { + if (! $classLike instanceof ClassLike) { return false; } diff --git a/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php b/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php index 5b35af97142..7085c9121a8 100644 --- a/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php +++ b/packages/ReadWrite/ReadNodeAnalyzer/LocalPropertyFetchReadNodeAnalyzer.php @@ -8,9 +8,9 @@ use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt\Class_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\NodeFinder\PropertyFetchFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\ReadWrite\Contract\ReadNodeAnalyzerInterface; final class LocalPropertyFetchReadNodeAnalyzer implements ReadNodeAnalyzerInterface @@ -18,7 +18,8 @@ final class LocalPropertyFetchReadNodeAnalyzer implements ReadNodeAnalyzerInterf public function __construct( private JustReadExprAnalyzer $justReadExprAnalyzer, private PropertyFetchFinder $propertyFetchFinder, - private NodeNameResolver $nodeNameResolver + private NodeNameResolver $nodeNameResolver, + private BetterNodeFinder $betterNodeFinder ) { } @@ -32,7 +33,7 @@ public function supports(Node $node): bool */ public function isRead(Node $node): bool { - $class = $node->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $class instanceof Class_) { // assume worse to keep node protected return true; diff --git a/packages/StaticTypeMapper/Naming/NameScopeFactory.php b/packages/StaticTypeMapper/Naming/NameScopeFactory.php index ff784eb1619..9afa86805d9 100644 --- a/packages/StaticTypeMapper/Naming/NameScopeFactory.php +++ b/packages/StaticTypeMapper/Naming/NameScopeFactory.php @@ -14,6 +14,7 @@ use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\StaticTypeMapper\StaticTypeMapper; use Symfony\Contracts\Service\Attribute\Required; @@ -27,15 +28,19 @@ final class NameScopeFactory private PhpDocInfoFactory $phpDocInfoFactory; + private BetterNodeFinder $betterNodeFinder; + // This is needed to avoid circular references #[Required] public function autowireNameScopeFactory( PhpDocInfoFactory $phpDocInfoFactory, - StaticTypeMapper $staticTypeMapper + StaticTypeMapper $staticTypeMapper, + BetterNodeFinder $betterNodeFinder, ): void { $this->phpDocInfoFactory = $phpDocInfoFactory; $this->staticTypeMapper = $staticTypeMapper; + $this->betterNodeFinder = $betterNodeFinder; } public function createNameScopeFromNodeWithoutTemplateTypes(Node $node): NameScope @@ -104,10 +109,11 @@ private function templateTemplateTypeMap(Node $node): TemplateTypeMap { $nodeTemplateTypes = $this->resolveTemplateTypesFromNode($node); - $class = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class); + $classTemplateTypes = []; - if ($class instanceof ClassLike) { - $classTemplateTypes = $this->resolveTemplateTypesFromNode($class); + if ($classLike instanceof ClassLike) { + $classTemplateTypes = $this->resolveTemplateTypesFromNode($classLike); } $templateTypes = array_merge($nodeTemplateTypes, $classTemplateTypes); diff --git a/rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_array_pop.php.inc b/rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_array_pop.php.inc deleted file mode 100644 index 2ba819380c5..00000000000 --- a/rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_array_pop.php.inc +++ /dev/null @@ -1,28 +0,0 @@ -classStack); - $node->setAttribute(AttributeKey::CLASS_NODE, $classLike); - } - - public function processClass(Node $node): void - { - $this->classStack[] = $this->classLike; - } -} diff --git a/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php b/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php index 8a02eb5c434..66ee4e40175 100644 --- a/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php +++ b/rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php @@ -23,7 +23,6 @@ use Rector\Core\Enum\ObjectReference; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -152,7 +151,7 @@ private function isObjectTypeMatch(MethodCall | StaticCall | ClassMethod $node, // ClassMethod /** @var Class_|null $classLike */ - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); // anonymous class if (! $classLike instanceof Class_) { diff --git a/rules/CodeQuality/Rector/FunctionLike/RemoveAlwaysTrueConditionSetInConstructorRector.php b/rules/CodeQuality/Rector/FunctionLike/RemoveAlwaysTrueConditionSetInConstructorRector.php index e2ccd05d26b..7ecf8bf4151 100644 --- a/rules/CodeQuality/Rector/FunctionLike/RemoveAlwaysTrueConditionSetInConstructorRector.php +++ b/rules/CodeQuality/Rector/FunctionLike/RemoveAlwaysTrueConditionSetInConstructorRector.php @@ -21,7 +21,6 @@ use PHPStan\Type\Type; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Type\StaticTypeAnalyzer; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -170,7 +169,7 @@ private function matchTruableIf(Expr|Stmt $node): If_|null private function resolvePropertyFetchType(PropertyFetch $propertyFetch): Type { - $classLike = $propertyFetch->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($propertyFetch, Class_::class); if (! $classLike instanceof Class_) { return new MixedType(); } diff --git a/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php b/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php index 195c9d1610b..9b6753d2e3c 100644 --- a/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php +++ b/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php @@ -10,7 +10,6 @@ use PhpParser\Node\Stmt\Class_; use Rector\Core\Enum\ObjectReference; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -62,7 +61,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $class = $node->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $class instanceof Class_) { return null; } diff --git a/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php b/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php index 588f3931813..1fb171cd175 100644 --- a/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php +++ b/rules/CodingStyle/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php @@ -155,7 +155,8 @@ private function isConstructorWithStaticFactory(ClassMethod $classMethod, string return false; } - $classLike = $classMethod->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($classMethod, Class_::class); + $classLike = $this->betterNodeFinder->findParentType($classMethod, Class_::class); if (! $classLike instanceof Class_) { return false; } diff --git a/rules/DeadCode/NodeAnalyzer/ExprUsedInNextNodeAnalyzer.php b/rules/DeadCode/NodeAnalyzer/ExprUsedInNextNodeAnalyzer.php index 1624f0342a9..3fb43995f93 100644 --- a/rules/DeadCode/NodeAnalyzer/ExprUsedInNextNodeAnalyzer.php +++ b/rules/DeadCode/NodeAnalyzer/ExprUsedInNextNodeAnalyzer.php @@ -28,7 +28,6 @@ public function isUsed(Expr $expr, bool $isCheckNameScope = false): bool { return (bool) $this->betterNodeFinder->findFirstNext( $expr, -<<<<<<< HEAD function (Node $node) use ($expr, $isCheckNameScope): bool { if ($isCheckNameScope && $node instanceof Name) { $scope = $node->getAttribute(AttributeKey::SCOPE); @@ -42,19 +41,6 @@ function (Node $node) use ($expr, $isCheckNameScope): bool { return $this->exprUsedInNodeAnalyzer->isUsed($node, $expr); } -======= -<<<<<<< HEAD -<<<<<<< HEAD - fn (Node $node): bool => $this->exprUsedInNodeAnalyzer->isUsed($node, $expr) -======= - function (Node $node) use ($expr): bool { - return $this->exprUsedInNodeAnalyzer->isUsed($node, $expr); - } ->>>>>>> 939846cc0... skip dead property in unused private property -======= - fn (Node $node): bool => $this->exprUsedInNodeAnalyzer->isUsed($node, $expr) ->>>>>>> 1f3994e5b... skip rename for now, till re-traversing ->>>>>>> restore state before PHPStan 1.0 ); } } diff --git a/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php b/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php index c4931888bf8..cf337822f3e 100644 --- a/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php +++ b/rules/DeadCode/NodeAnalyzer/IsClassMethodUsedAnalyzer.php @@ -36,7 +36,7 @@ public function __construct( public function isClassMethodUsed(ClassMethod $classMethod): bool { - $class = $classMethod->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($classMethod, Class_::class); if (! $class instanceof Class_) { return true; } diff --git a/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php b/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php index 89454497a45..57dd8d9d1fd 100644 --- a/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php +++ b/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php @@ -8,14 +8,15 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; final class ControllerClassMethodManipulator { public function __construct( private NodeNameResolver $nodeNameResolver, - private PhpDocInfoFactory $phpDocInfoFactory + private PhpDocInfoFactory $phpDocInfoFactory, + private BetterNodeFinder $betterNodeFinder, ) { } @@ -35,12 +36,12 @@ private function isControllerClassMethod(ClassMethod $classMethod): bool return false; } - $classLike = $classMethod->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($classMethod, Class_::class); + if (! $class instanceof Class_) { return false; } - return $this->hasParentClassController($classLike); + return $this->hasParentClassController($class); } private function hasParentClassController(Class_ $class): bool diff --git a/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php b/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php index 54c2c178b16..ccdc9d5306c 100644 --- a/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php +++ b/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php @@ -5,6 +5,7 @@ namespace Rector\DeadCode\PhpDoc; use PhpParser\Node\FunctionLike; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Trait_; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; @@ -12,13 +13,14 @@ use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use Rector\BetterPhpDocParser\ValueObject\Type\BracketsAwareUnionTypeNode; use Rector\BetterPhpDocParser\ValueObject\Type\SpacingAwareCallableTypeNode; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; final class DeadReturnTagValueNodeAnalyzer { public function __construct( - private TypeComparator $typeComparator + private TypeComparator $typeComparator, + private BetterNodeFinder $betterNodeFinder, ) { } @@ -29,7 +31,7 @@ public function isDead(ReturnTagValueNode $returnTagValueNode, FunctionLike $fun return false; } - $classLike = $functionLike->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($functionLike, ClassLike::class); if ($classLike instanceof Trait_ && $returnTagValueNode->type instanceof ThisTypeNode) { return false; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveDeadConstructorRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveDeadConstructorRector.php index 8fb25963e88..20024d2cf12 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveDeadConstructorRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveDeadConstructorRector.php @@ -11,7 +11,6 @@ use Rector\Core\NodeManipulator\ClassMethodManipulator; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -60,7 +59,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveDelegatingParentCallRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveDelegatingParentCallRector.php index 4b866ea30ce..3f37b13e5c6 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveDelegatingParentCallRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveDelegatingParentCallRector.php @@ -14,7 +14,6 @@ use PhpParser\Node\Stmt\Return_; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\Comparator\CurrentAndParentClassMethodComparator; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -82,7 +81,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if ($this->shouldSkipClass($classLike)) { return null; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php index fcb7b112e62..8bf52f53ba3 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php @@ -12,7 +12,6 @@ use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; use Rector\DeadCode\NodeManipulator\ControllerClassMethodManipulator; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -65,7 +64,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } @@ -131,7 +130,7 @@ private function shouldSkipClassMethod(ClassMethod $classMethod): bool } if ($this->nodeNameResolver->isName($classMethod, MethodName::CONSTRUCT)) { - $class = $classMethod->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($classMethod, Class_::class); return $class instanceof Class_ && $class->extends instanceof FullyQualified; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php index e197f4034ab..d25ff2fe464 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php @@ -5,12 +5,11 @@ namespace Rector\DeadCode\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Interface_; use Rector\Core\NodeAnalyzer\ParamAnalyzer; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -81,8 +80,8 @@ public function refactor(Node $node): ?Node return null; } - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); - if ($classLike instanceof Interface_) { + $class = $this->betterNodeFinder->findParentType($node, Class_::class); + if (! $class instanceof Class_) { return null; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php index e7764c68b51..777289748b9 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php @@ -134,7 +134,7 @@ private function shouldSkip(ClassMethod $classMethod): bool private function hasDynamicMethodCallOnFetchThis(ClassMethod $classMethod): bool { - $class = $classMethod->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($classMethod, Class_::class); if (! $class instanceof Class_) { return false; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php index f55d8e2c277..48a3339b3b9 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php @@ -13,7 +13,6 @@ use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; use Rector\Core\ValueObject\PhpVersionFeature; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -87,7 +86,7 @@ public function refactor(Node $node): ?Node return null; } - $class = $node->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $class instanceof Class_) { return null; } diff --git a/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php b/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php index a856c1c634d..c4c577a9746 100644 --- a/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php +++ b/rules/DeadCode/Rector/If_/RemoveDeadInstanceOfRector.php @@ -184,7 +184,7 @@ private function isSkippedPropertyFetch(Expr $expr): bool /** @var PropertyFetch|StaticPropertyFetch $propertyFetch */ $propertyFetch = $expr; - $classLike = $propertyFetch->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($propertyFetch, Class_::class); if (! $classLike instanceof Class_) { return true; @@ -217,7 +217,7 @@ private function isInPropertyPromotedParams(Expr $expr): bool return false; } - $classLike = $expr->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($expr, Class_::class); if (! $classLike instanceof Class_) { return false; } diff --git a/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfFunctionExistsRector.php b/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfFunctionExistsRector.php index 82f1b5bae48..a06b18ea3dc 100644 --- a/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfFunctionExistsRector.php +++ b/rules/DeadCode/Rector/If_/UnwrapFutureCompatibleIfFunctionExistsRector.php @@ -14,7 +14,6 @@ use Rector\Core\NodeManipulator\IfManipulator; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\FeatureSupport\FunctionSupportResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -113,7 +112,7 @@ public function refactor(Node $node): ?array private function shouldSkip(If_ $if): bool { - $classLike = $if->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($if, ClassLike::class); if (! $classLike instanceof ClassLike) { return false; } diff --git a/rules/DeadCode/Rector/MethodCall/RemoveEmptyMethodCallRector.php b/rules/DeadCode/Rector/MethodCall/RemoveEmptyMethodCallRector.php index 715e0b32269..8888a998d91 100644 --- a/rules/DeadCode/Rector/MethodCall/RemoveEmptyMethodCallRector.php +++ b/rules/DeadCode/Rector/MethodCall/RemoveEmptyMethodCallRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; @@ -92,7 +93,7 @@ public function refactor(Node $node): ?Node } $classLike = $this->reflectionAstResolver->resolveClassFromObjectType($type); - if ($classLike === null) { + if (! $classLike instanceof ClassLike) { return null; } @@ -165,7 +166,7 @@ private function shouldSkipClassMethod( return true; } - $class = $methodCall->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($methodCall, Class_::class); if (! $class instanceof Class_) { return false; } diff --git a/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php b/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php index 0c16bf1901c..d084ea2dbdd 100644 --- a/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php +++ b/rules/DeadCode/Rector/StaticCall/RemoveParentCallWithoutParentRector.php @@ -74,7 +74,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/DependencyInjection/NodeManipulator/PropertyConstructorInjectionManipulator.php b/rules/DependencyInjection/NodeManipulator/PropertyConstructorInjectionManipulator.php index 64c1dc1fb34..820f77b538b 100644 --- a/rules/DependencyInjection/NodeManipulator/PropertyConstructorInjectionManipulator.php +++ b/rules/DependencyInjection/NodeManipulator/PropertyConstructorInjectionManipulator.php @@ -12,8 +12,8 @@ use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PostRector\Collector\PropertyToAddCollector; use Rector\PostRector\ValueObject\PropertyMetadata; @@ -24,7 +24,8 @@ public function __construct( private PhpDocInfoFactory $phpDocInfoFactory, private PhpDocTypeChanger $phpDocTypeChanger, private PhpDocTagRemover $phpDocTagRemover, - private PropertyToAddCollector $propertyToAddCollector + private PropertyToAddCollector $propertyToAddCollector, + private BetterNodeFinder $betterNodeFinder, ) { } @@ -39,12 +40,12 @@ public function refactor( $this->phpDocTypeChanger->changeVarType($phpDocInfo, $type); $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $doctrineAnnotationTagValueNode); - $classLike = $property->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($property, Class_::class); + if (! $class instanceof Class_) { throw new ShouldNotHappenException(); } $propertyMetadata = new PropertyMetadata($propertyName, $type, $property->flags); - $this->propertyToAddCollector->addPropertyToClass($classLike, $propertyMetadata); + $this->propertyToAddCollector->addPropertyToClass($class, $propertyMetadata); } } diff --git a/rules/DependencyInjection/Rector/ClassMethod/AddMethodParentCallRector.php b/rules/DependencyInjection/Rector/ClassMethod/AddMethodParentCallRector.php index 93a2ace875a..2a09b043eb2 100644 --- a/rules/DependencyInjection/Rector/ClassMethod/AddMethodParentCallRector.php +++ b/rules/DependencyInjection/Rector/ClassMethod/AddMethodParentCallRector.php @@ -84,7 +84,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class); if (! $classLike instanceof ClassLike) { return null; } diff --git a/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php b/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php index 1c7c4e184e5..14e28be391c 100644 --- a/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php +++ b/rules/DowngradePhp72/Rector/ClassMethod/DowngradeParameterTypeWideningRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Param; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; @@ -15,7 +16,6 @@ use Rector\DowngradePhp72\NodeAnalyzer\OverrideFromAnonymousClassMethodAnalyzer; use Rector\DowngradePhp72\NodeAnalyzer\SealedClassAnalyzer; use Rector\DowngradePhp72\PhpDoc\NativeParamToPhpDocDecorator; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\NodeAnalyzer\AutowiredClassMethodOrPropertyAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -115,8 +115,8 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); - if ($classLike === null) { + $classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class); + if (! $classLike instanceof ClassLike) { return null; } diff --git a/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php b/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php index 277311c1769..cc83b187e07 100644 --- a/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php +++ b/rules/Naming/ValueObjectFactory/PropertyRenameFactory.php @@ -6,9 +6,9 @@ use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Property; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Naming\ValueObject\PropertyRename; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; /** * @see \Rector\Tests\Naming\ValueObjectFactory\PropertyRenameFactory\PropertyRenameFactoryTest @@ -16,7 +16,8 @@ final class PropertyRenameFactory { public function __construct( - private NodeNameResolver $nodeNameResolver + private NodeNameResolver $nodeNameResolver, + private BetterNodeFinder $betterNodeFinder, ) { } @@ -24,13 +25,13 @@ public function createFromExpectedName(Property $property, string $expectedName) { $currentName = $this->nodeNameResolver->getName($property); - $propertyClassLike = $property->getAttribute(AttributeKey::CLASS_NODE); - if (! $propertyClassLike instanceof ClassLike) { + $classLike = $this->betterNodeFinder->findParentType($property, ClassLike::class); + if (! $classLike instanceof ClassLike) { return null; } - $propertyClassLikeName = $property->getAttribute(AttributeKey::CLASS_NAME); - if ($propertyClassLikeName === null) { + $className = $this->nodeNameResolver->getName($classLike); + if (! is_string($className)) { return null; } @@ -38,8 +39,8 @@ public function createFromExpectedName(Property $property, string $expectedName) $property, $expectedName, $currentName, - $propertyClassLike, - $propertyClassLikeName, + $classLike, + $className, $property->props[0] ); } diff --git a/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php b/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php index 5cc73e02eec..ae342bae674 100644 --- a/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php +++ b/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php @@ -87,7 +87,7 @@ public function refactor(Node $node): ?Node return null; } - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php b/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php index a83791b7c0b..597b07247fa 100644 --- a/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php +++ b/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php @@ -123,7 +123,7 @@ public function refactor(Node $node): ?Node private function resolveClassSelf(MethodCall $methodCall): ObjectReference { - $classLike = $methodCall->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($methodCall, Class_::class); if (! $classLike instanceof Class_) { return ObjectReference::STATIC(); } diff --git a/rules/Php71/Rector/FuncCall/CountOnNullRector.php b/rules/Php71/Rector/FuncCall/CountOnNullRector.php index 5dd99820e78..715fc2cc0a9 100644 --- a/rules/Php71/Rector/FuncCall/CountOnNullRector.php +++ b/rules/Php71/Rector/FuncCall/CountOnNullRector.php @@ -165,8 +165,8 @@ private function shouldSkip(FuncCall $funcCall): bool } // skip node in trait, as impossible to analyse - $classLike = $funcCall->getAttribute(AttributeKey::CLASS_NODE); - return $classLike instanceof Trait_; + $trait = $this->betterNodeFinder->findParentType($funcCall, Trait_::class); + return $trait instanceof Trait_; } private function castToArray(Expr $countedExpr, FuncCall $funcCall): FuncCall diff --git a/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php b/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php index ac6b697d851..74a75bb5c8f 100644 --- a/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php +++ b/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php @@ -122,7 +122,7 @@ private function shouldSkip(FuncCall $funcCall): bool return true; } - $classLike = $funcCall->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($funcCall, Class_::class); if (! $classLike instanceof Class_) { return true; } diff --git a/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php b/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php index dbb0a354c86..582c2c2bc9b 100644 --- a/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php +++ b/rules/Php74/Rector/Property/RestoreDefaultNullToNullableTypePropertyRector.php @@ -14,7 +14,6 @@ use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; use Rector\Core\ValueObject\PhpVersionFeature; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -99,7 +98,7 @@ private function shouldSkip(Property $property): bool private function isPropertyInitiatedInConstuctor(Property $property, string $propertyName): bool { - $classLike = $property->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($property, Class_::class); if (! $classLike instanceof Class_) { return false; } diff --git a/rules/PhpSpecToPHPUnit/Rector/AbstractPhpSpecToPHPUnitRector.php b/rules/PhpSpecToPHPUnit/Rector/AbstractPhpSpecToPHPUnitRector.php index 3df3b0c2bfe..3bd8578d639 100644 --- a/rules/PhpSpecToPHPUnit/Rector/AbstractPhpSpecToPHPUnitRector.php +++ b/rules/PhpSpecToPHPUnit/Rector/AbstractPhpSpecToPHPUnitRector.php @@ -8,7 +8,6 @@ use PhpParser\Node\Stmt\ClassLike; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -63,7 +62,7 @@ protected function setUp() public function isInPhpSpecBehavior(Node $node): bool { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class); if (! $classLike instanceof ClassLike) { return false; } diff --git a/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecMocksToPHPUnitMocksRector.php b/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecMocksToPHPUnitMocksRector.php index ab077abb113..904328233ef 100644 --- a/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecMocksToPHPUnitMocksRector.php +++ b/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecMocksToPHPUnitMocksRector.php @@ -130,7 +130,7 @@ private function processMethodCall(MethodCall $methodCall): ?MethodCall private function createCreateMockCall(Param $param, Name $name): ?Expression { /** @var Class_ $classLike */ - $classLike = $param->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($param, Class_::class); $classMocks = $this->phpSpecMockCollector->resolveClassMocksFromParam($classLike); diff --git a/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php b/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php index 8bfc36c7a4e..5bb309ca4b2 100644 --- a/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php +++ b/rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php @@ -17,7 +17,6 @@ use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; use Rector\Core\Exception\ShouldNotHappenException; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpSpecToPHPUnit\MatchersManipulator; use Rector\PhpSpecToPHPUnit\Naming\PhpSpecRenaming; use Rector\PhpSpecToPHPUnit\NodeFactory\AssertMethodCallFactory; @@ -175,7 +174,7 @@ public function refactor(Node $node): ?Node } /** @var Class_ $classLike */ - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); $classMethod = $classLike->getMethod($methodName); // it's a method call, skip if ($classMethod !== null) { @@ -203,7 +202,7 @@ private function prepareMethodCall(MethodCall $methodCall): void } /** @var Class_ $classLike */ - $classLike = $methodCall->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($methodCall, Class_::class); $this->matchersKeys = $this->matchersManipulator->resolveMatcherNamesFromClass($classLike); $this->testedClass = $this->phpSpecRenaming->resolveTestedClass($methodCall); diff --git a/rules/Privatization/Rector/ClassMethod/ChangeGlobalVariablesToPropertiesRector.php b/rules/Privatization/Rector/ClassMethod/ChangeGlobalVariablesToPropertiesRector.php index af32596c9b1..80e80fcfc77 100644 --- a/rules/Privatization/Rector/ClassMethod/ChangeGlobalVariablesToPropertiesRector.php +++ b/rules/Privatization/Rector/ClassMethod/ChangeGlobalVariablesToPropertiesRector.php @@ -12,7 +12,6 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Global_; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PostRector\Collector\PropertyToAddCollector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -91,7 +90,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php b/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php index c0a1d0c82fd..7a6635c6bb0 100644 --- a/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php +++ b/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php @@ -12,7 +12,6 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -86,7 +85,7 @@ public function refactor(Node $node): ?Node return null; } - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/Privatization/Rector/Property/ChangeReadOnlyPropertyWithDefaultValueToConstantRector.php b/rules/Privatization/Rector/Property/ChangeReadOnlyPropertyWithDefaultValueToConstantRector.php index 6e565535ae6..1a279dbe4b4 100644 --- a/rules/Privatization/Rector/Property/ChangeReadOnlyPropertyWithDefaultValueToConstantRector.php +++ b/rules/Privatization/Rector/Property/ChangeReadOnlyPropertyWithDefaultValueToConstantRector.php @@ -11,7 +11,6 @@ use PHPStan\Type\ObjectType; use Rector\Core\NodeManipulator\PropertyManipulator; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Privatization\NodeFactory\ClassConstantFactory; use Rector\Privatization\NodeReplacer\PropertyFetchWithConstFetchReplacer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -114,7 +113,7 @@ public function refactor(Node $node): ?Node } /** @var Class_ $classLike */ - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); $this->propertyFetchWithConstFetchReplacer->replace($classLike, $node); return $this->classConstantFactory->createFromProperty($node); @@ -126,7 +125,7 @@ private function shouldSkip(Property $property): bool return true; } - $classLike = $property->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($property, Class_::class); if (! $classLike instanceof Class_) { return true; } diff --git a/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php b/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php index 1591a554f97..1ac5a79f1db 100644 --- a/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php +++ b/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php @@ -53,7 +53,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/Removing/NodeManipulator/ComplexNodeRemover.php b/rules/Removing/NodeManipulator/ComplexNodeRemover.php index dab4187add6..d66d0abf537 100644 --- a/rules/Removing/NodeManipulator/ComplexNodeRemover.php +++ b/rules/Removing/NodeManipulator/ComplexNodeRemover.php @@ -120,7 +120,7 @@ private function removeConstructorDependency(Assign $assign): void return; } - $class = $assign->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($assign, Class_::class); if (! $class instanceof Class_) { return; } diff --git a/rules/RemovingStatic/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php b/rules/RemovingStatic/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php index d86760e6192..52154e7ab8a 100644 --- a/rules/RemovingStatic/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php +++ b/rules/RemovingStatic/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php @@ -116,13 +116,13 @@ private function refactorClassMethod(ClassMethod $classMethod): ?ClassMethod private function refactorStaticCall(StaticCall $staticCall): ?MethodCall { - $class = $staticCall->getAttribute(AttributeKey::CLASS_NODE); - if (! $class instanceof ClassLike) { + $classLike = $this->betterNodeFinder->findParentType($staticCall, ClassLike::class); + if (! $classLike instanceof ClassLike) { return null; } /** @var ClassMethod[] $classMethods */ - $classMethods = $this->betterNodeFinder->findInstanceOf($class, ClassMethod::class); + $classMethods = $this->betterNodeFinder->findInstanceOf($classLike, ClassMethod::class); foreach ($classMethods as $classMethod) { if (! $this->isClassMethodMatchingStaticCall($classMethod, $staticCall)) { diff --git a/rules/RemovingStatic/Rector/StaticPropertyFetch/DesiredStaticPropertyFetchTypeToDynamicRector.php b/rules/RemovingStatic/Rector/StaticPropertyFetch/DesiredStaticPropertyFetchTypeToDynamicRector.php index ae66fd97c81..5d1b9ff813a 100644 --- a/rules/RemovingStatic/Rector/StaticPropertyFetch/DesiredStaticPropertyFetchTypeToDynamicRector.php +++ b/rules/RemovingStatic/Rector/StaticPropertyFetch/DesiredStaticPropertyFetchTypeToDynamicRector.php @@ -111,7 +111,7 @@ public function refactor(Node $node): ?Node $propertyName = $this->propertyNaming->fqnToVariableName($staticObjectType); /** @var Class_ $class */ - $class = $node->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($node, Class_::class); $propertyMetadata = new PropertyMetadata($propertyName, $staticObjectType, Class_::MODIFIER_PRIVATE); $this->propertyToAddCollector->addPropertyToClass($class, $propertyMetadata); diff --git a/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php b/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php index a79a236cd01..0df328f5ab0 100644 --- a/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php +++ b/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php @@ -10,7 +10,6 @@ use PhpParser\Node\Stmt\Property; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockTagReplacer; use Rector\Renaming\ValueObject\RenameAnnotation; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -90,7 +89,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/Renaming/Rector/MethodCall/RenameMethodRector.php b/rules/Renaming/Rector/MethodCall/RenameMethodRector.php index cc210c5155e..4e72d1b2214 100644 --- a/rules/Renaming/Rector/MethodCall/RenameMethodRector.php +++ b/rules/Renaming/Rector/MethodCall/RenameMethodRector.php @@ -15,7 +15,6 @@ use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\NodeManipulator\ClassManipulator; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Renaming\Collector\MethodCallRenameCollector; use Rector\Renaming\Contract\MethodCallRenameInterface; use Rector\Renaming\ValueObject\MethodCallRename; @@ -145,7 +144,7 @@ private function shouldSkipForAlreadyExistingClassMethod( ClassMethod $classMethod, MethodCallRenameInterface $methodCallRename ): bool { - $classLike = $classMethod->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($classMethod, ClassLike::class); if (! $classLike instanceof ClassLike) { return false; } diff --git a/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php b/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php index f57f71d8f5a..bd5cbe9335b 100644 --- a/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php +++ b/rules/Renaming/Rector/PropertyFetch/RenamePropertyRector.php @@ -7,14 +7,15 @@ use PhpParser\Node; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Identifier; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Property; use PhpParser\Node\VarLikeIdentifier; use PHPStan\Type\ObjectType; use PHPStan\Type\ThisType; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; +use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Renaming\ValueObject\RenameProperty; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -120,7 +121,11 @@ private function renameProperty(ClassLike $classLike, RenameProperty $renameProp private function processFromPropertyFetch(PropertyFetch $propertyFetch): ?PropertyFetch { - $class = $propertyFetch->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($propertyFetch, Class_::class); + if (! $class instanceof Class_) { + throw new ShouldNotHappenException(); + } + foreach ($this->renamedProperties as $renamedProperty) { if (! $this->isObjectType($propertyFetch->var, $renamedProperty->getObjectType())) { continue; diff --git a/rules/Restoration/Rector/Property/MakeTypedPropertyNullableIfCheckedRector.php b/rules/Restoration/Rector/Property/MakeTypedPropertyNullableIfCheckedRector.php index 49efe57d52c..72177a0e9d2 100644 --- a/rules/Restoration/Rector/Property/MakeTypedPropertyNullableIfCheckedRector.php +++ b/rules/Restoration/Rector/Property/MakeTypedPropertyNullableIfCheckedRector.php @@ -15,7 +15,6 @@ use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\PropertyProperty; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -114,7 +113,7 @@ private function shouldSkipProperty(Property $property): bool private function isPropertyNullChecked(PropertyProperty $onlyPropertyProperty): bool { - $classLike = $onlyPropertyProperty->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($onlyPropertyProperty, Class_::class); if (! $classLike instanceof Class_) { return false; } diff --git a/rules/Transform/Rector/ClassMethod/SingleToManyMethodRector.php b/rules/Transform/Rector/ClassMethod/SingleToManyMethodRector.php index 095697c8dc0..42b3fa27015 100644 --- a/rules/Transform/Rector/ClassMethod/SingleToManyMethodRector.php +++ b/rules/Transform/Rector/ClassMethod/SingleToManyMethodRector.php @@ -14,7 +14,6 @@ use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Transform\ValueObject\SingleToManyMethod; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -88,7 +87,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class); if (! $classLike instanceof ClassLike) { return null; } diff --git a/rules/Transform/Rector/FuncCall/ArgumentFuncCallToMethodCallRector.php b/rules/Transform/Rector/FuncCall/ArgumentFuncCallToMethodCallRector.php index 65f28d0fb2c..ecd0d23752e 100644 --- a/rules/Transform/Rector/FuncCall/ArgumentFuncCallToMethodCallRector.php +++ b/rules/Transform/Rector/FuncCall/ArgumentFuncCallToMethodCallRector.php @@ -122,7 +122,7 @@ public function refactor(Node $node): ?Node } /** @var Class_ $classLike */ - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); foreach ($this->argumentFuncCallToMethodCalls as $argumentFuncCallToMethodCall) { if (! $this->isName($node, $argumentFuncCallToMethodCall->getFunction())) { diff --git a/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php b/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php index d41e6e80600..bf3795118c1 100644 --- a/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php +++ b/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php @@ -93,7 +93,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/Transform/Rector/MethodCall/MethodCallToMethodCallRector.php b/rules/Transform/Rector/MethodCall/MethodCallToMethodCallRector.php index 4138640b2a3..815e88c871f 100644 --- a/rules/Transform/Rector/MethodCall/MethodCallToMethodCallRector.php +++ b/rules/Transform/Rector/MethodCall/MethodCallToMethodCallRector.php @@ -14,7 +14,6 @@ use Rector\Core\NodeAnalyzer\PropertyPresenceChecker; use Rector\Core\Rector\AbstractRector; use Rector\Naming\Naming\PropertyNaming; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PostRector\Collector\PropertyToAddCollector; use Rector\PostRector\ValueObject\PropertyMetadata; use Rector\Transform\ValueObject\MethodCallToMethodCall; @@ -112,7 +111,11 @@ public function refactor(Node $node): ?Node $propertyFetch = $node->var; - $class = $node->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($node, Class_::class); + if (! $class instanceof Class_) { + continue; + } + $newObjectType = new ObjectType($methodCallToMethodCall->getNewType()); $newPropertyName = $this->matchNewPropertyName($methodCallToMethodCall, $class); diff --git a/rules/Transform/Rector/MethodCall/ServiceGetterToConstructorInjectionRector.php b/rules/Transform/Rector/MethodCall/ServiceGetterToConstructorInjectionRector.php index d2a9b8d8ba8..13528ae38a4 100644 --- a/rules/Transform/Rector/MethodCall/ServiceGetterToConstructorInjectionRector.php +++ b/rules/Transform/Rector/MethodCall/ServiceGetterToConstructorInjectionRector.php @@ -15,7 +15,6 @@ use Rector\Core\NodeAnalyzer\ClassAnalyzer; use Rector\Core\Rector\AbstractRector; use Rector\Naming\Naming\PropertyNaming; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PostRector\Collector\PropertyToAddCollector; use Rector\PostRector\ValueObject\PropertyMetadata; use Rector\Transform\ValueObject\ServiceGetterToConstructorInjection; @@ -137,7 +136,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/Transform/Rector/New_/NewToConstructorInjectionRector.php b/rules/Transform/Rector/New_/NewToConstructorInjectionRector.php index 7b3715eca76..a3683820da6 100644 --- a/rules/Transform/Rector/New_/NewToConstructorInjectionRector.php +++ b/rules/Transform/Rector/New_/NewToConstructorInjectionRector.php @@ -16,7 +16,6 @@ use Rector\Naming\Naming\PropertyNaming; use Rector\Naming\ValueObject\ExpectedName; use Rector\NodeRemoval\AssignRemover; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PostRector\Collector\PropertyToAddCollector; use Rector\PostRector\ValueObject\PropertyMetadata; use Rector\Transform\NodeFactory\PropertyFetchFactory; @@ -171,7 +170,7 @@ private function refactorNew(New_ $new): void continue; } - $classLike = $new->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($new, Class_::class); if (! $classLike instanceof Class_) { continue; } diff --git a/rules/Transform/Rector/New_/NewToMethodCallRector.php b/rules/Transform/Rector/New_/NewToMethodCallRector.php index fef37564772..5c9f8c882fd 100644 --- a/rules/Transform/Rector/New_/NewToMethodCallRector.php +++ b/rules/Transform/Rector/New_/NewToMethodCallRector.php @@ -102,7 +102,7 @@ public function refactor(Node $node): ?Node } /** @var Class_ $class */ - $class = $node->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($node, Class_::class); $propertyName = $this->getExistingFactoryPropertyName( $class, diff --git a/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php b/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php index 45f59a13e17..368c3cb0031 100644 --- a/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php +++ b/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php @@ -107,7 +107,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); if (! $classLike instanceof Class_) { return null; } diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php index 804c447e35f..09931844013 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php @@ -15,7 +15,6 @@ use PHPStan\Type\StringType; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\TypeComparator\TypeComparator; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\TypeDeclaration\ValueObject\AddParamTypeDeclaration; @@ -92,7 +91,7 @@ public function refactor(Node $node): ?Node } /** @var ClassLike $classLike */ - $classLike = $node->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($node, Class_::class); foreach ($this->parameterTypehints as $parameterTypehint) { if (! $this->isObjectType($classLike, $parameterTypehint->getObjectType())) { @@ -127,7 +126,7 @@ private function shouldSkip(ClassMethod $classMethod): bool return true; } - $classLike = $classMethod->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($classMethod, ClassLike::class); if (! $classLike instanceof ClassLike) { return true; } diff --git a/rules/TypeDeclaration/Rector/FunctionLike/ReturnTypeDeclarationRector.php b/rules/TypeDeclaration/Rector/FunctionLike/ReturnTypeDeclarationRector.php index 29ea73ec0ce..b7119d9d430 100644 --- a/rules/TypeDeclaration/Rector/FunctionLike/ReturnTypeDeclarationRector.php +++ b/rules/TypeDeclaration/Rector/FunctionLike/ReturnTypeDeclarationRector.php @@ -230,7 +230,7 @@ private function shouldSkipClassLike(FunctionLike $functionLike): bool return false; } - $classLike = $functionLike->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($functionLike, Class_::class); return ! $classLike instanceof Class_; } } diff --git a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/GetterNodeParamTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/GetterNodeParamTypeInferer.php index fdacba861d6..cfe9d0fb8d8 100644 --- a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/GetterNodeParamTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/GetterNodeParamTypeInferer.php @@ -15,6 +15,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Core\NodeManipulator\PropertyFetchAssignManipulator; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\Contract\TypeInferer\ParamTypeInfererInterface; @@ -27,14 +28,15 @@ public function __construct( private PropertyFetchAnalyzer $propertyFetchAnalyzer, private PhpDocInfoFactory $phpDocInfoFactory, private NodeNameResolver $nodeNameResolver, - private SimpleCallableNodeTraverser $simpleCallableNodeTraverser + private SimpleCallableNodeTraverser $simpleCallableNodeTraverser, + private BetterNodeFinder $betterNodeFinder, ) { } public function inferParam(Param $param): Type { - $classLike = $param->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($param, Class_::class); + if (! $class instanceof Class_) { return new MixedType(); } @@ -55,7 +57,7 @@ public function inferParam(Param $param): Type $returnType = new MixedType(); // resolve property assigns - $this->simpleCallableNodeTraverser->traverseNodesWithCallable($classLike, function (Node $node) use ( + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($class, function (Node $node) use ( $propertyNames, &$returnType ): ?int { diff --git a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/KnownArrayParamTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/KnownArrayParamTypeInferer.php index c54d872043d..d5537f39190 100644 --- a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/KnownArrayParamTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/KnownArrayParamTypeInferer.php @@ -11,26 +11,27 @@ use PHPStan\Type\MixedType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\Contract\TypeInferer\ParamTypeInfererInterface; final class KnownArrayParamTypeInferer implements ParamTypeInfererInterface { public function __construct( private NodeNameResolver $nodeNameResolver, - private ReflectionProvider $reflectionProvider + private ReflectionProvider $reflectionProvider, + private BetterNodeFinder $betterNodeFinder, ) { } public function inferParam(Param $param): Type { - $classLike = $param->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($param, Class_::class); + if (! $class instanceof Class_) { return new MixedType(); } - $className = $this->nodeNameResolver->getName($classLike); + $className = $this->nodeNameResolver->getName($class); if (! $className) { return new MixedType(); } diff --git a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PHPUnitDataProviderParamTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PHPUnitDataProviderParamTypeInferer.php index 19c4147ebfd..0f3bf860885 100644 --- a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PHPUnitDataProviderParamTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PHPUnitDataProviderParamTypeInferer.php @@ -85,8 +85,8 @@ private function resolveDataProviderClassMethod(Param $param): ?ClassMethod return null; } - $classLike = $param->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($param, Class_::class); + if (! $class instanceof Class_) { return null; } @@ -101,7 +101,7 @@ private function resolveDataProviderClassMethod(Param $param): ?ClassMethod } $methodName = $match['method_name']; - return $classLike->getMethod($methodName); + return $class->getMethod($methodName); } /** diff --git a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PropertyNodeParamTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PropertyNodeParamTypeInferer.php index 07d28332717..f5d8a28e9c7 100644 --- a/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PropertyNodeParamTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PropertyNodeParamTypeInferer.php @@ -12,6 +12,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; @@ -26,13 +27,14 @@ public function __construct( private NodeNameResolver $nodeNameResolver, private SimpleCallableNodeTraverser $simpleCallableNodeTraverser, private NodeTypeResolver $nodeTypeResolver, - private TypeFactory $typeFactory + private TypeFactory $typeFactory, + private BetterNodeFinder $betterNodeFinder ) { } public function inferParam(Param $param): Type { - $classLike = $param->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($param, Class_::class); if (! $classLike instanceof Class_) { return new MixedType(); } diff --git a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php index a5770c1f974..11cd85e3a58 100644 --- a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php @@ -4,10 +4,11 @@ namespace Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Property; use PHPStan\Type\Type; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\Contract\TypeInferer\PropertyTypeInfererInterface; use Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer; @@ -15,21 +16,21 @@ final class AllAssignNodePropertyTypeInferer implements PropertyTypeInfererInter { public function __construct( private AssignToPropertyTypeInferer $assignToPropertyTypeInferer, - private NodeNameResolver $nodeNameResolver + private NodeNameResolver $nodeNameResolver, + private BetterNodeFinder $betterNodeFinder ) { } public function inferProperty(Property $property): ?Type { - $classLike = $property->getAttribute(AttributeKey::CLASS_NODE); - if ($classLike === null) { - // anonymous class possibly? + $class = $this->betterNodeFinder->findParentType($property, Class_::class); + if (! $class instanceof Class_) { return null; } $propertyName = $this->nodeNameResolver->getName($property); - return $this->assignToPropertyTypeInferer->inferPropertyInClassLike($propertyName, $classLike); + return $this->assignToPropertyTypeInferer->inferPropertyInClassLike($propertyName, $class); } public function getPriority(): int diff --git a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterPropertyTypeInferer.php b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterPropertyTypeInferer.php index 5f3828bdf67..00143b1867f 100644 --- a/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterPropertyTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/GetterPropertyTypeInferer.php @@ -9,8 +9,8 @@ use PhpParser\Node\Stmt\Property; use PHPStan\Type\MixedType; use PHPStan\Type\Type; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\Contract\TypeInferer\PropertyTypeInfererInterface; use Rector\TypeDeclaration\FunctionLikeReturnTypeResolver; use Rector\TypeDeclaration\NodeAnalyzer\ClassMethodAndPropertyAnalyzer; @@ -24,14 +24,15 @@ public function __construct( private ReturnedNodesReturnTypeInferer $returnedNodesReturnTypeInferer, private FunctionLikeReturnTypeResolver $functionLikeReturnTypeResolver, private ClassMethodAndPropertyAnalyzer $classMethodAndPropertyAnalyzer, - private NodeNameResolver $nodeNameResolver + private NodeNameResolver $nodeNameResolver, + private BetterNodeFinder $betterNodeFinder, ) { } public function inferProperty(Property $property): ?Type { - $classLike = $property->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($property, Class_::class); + if (! $class instanceof Class_) { // anonymous class return null; } @@ -39,7 +40,7 @@ public function inferProperty(Property $property): ?Type /** @var string $propertyName */ $propertyName = $this->nodeNameResolver->getName($property); - foreach ($classLike->getMethods() as $classMethod) { + foreach ($class->getMethods() as $classMethod) { if (! $this->classMethodAndPropertyAnalyzer->hasClassMethodOnlyStatementReturnOfPropertyFetch( $classMethod, $propertyName diff --git a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInferer.php index 38ebd86209f..7ea76b6b34e 100644 --- a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/ReturnedNodesReturnTypeInferer.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\FunctionLike; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Interface_; @@ -21,9 +22,9 @@ use PHPStan\Type\Type; use PHPStan\Type\VoidType; use Rector\Core\PhpParser\AstResolver; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\Printer\BetterStandardPrinter; use Rector\Core\Reflection\ReflectionResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\TypeDeclaration\Contract\TypeInferer\ReturnTypeInfererInterface; @@ -41,7 +42,8 @@ public function __construct( private SplArrayFixedTypeNarrower $splArrayFixedTypeNarrower, private AstResolver $reflectionAstResolver, private BetterStandardPrinter $betterStandardPrinter, - private ReflectionResolver $reflectionResolver + private ReflectionResolver $reflectionResolver, + private BetterNodeFinder $betterNodeFinder, ) { } @@ -50,9 +52,8 @@ public function __construct( */ public function inferFunctionLike(FunctionLike $functionLike): Type { - /** @var Class_|Trait_|Interface_|null $classLike */ - $classLike = $functionLike->getAttribute(AttributeKey::CLASS_NODE); - if ($classLike === null) { + $classLike = $this->betterNodeFinder->findParentType($functionLike, ClassLike::class); + if (! $classLike instanceof ClassLike) { return new MixedType(); } @@ -64,6 +65,7 @@ public function inferFunctionLike(FunctionLike $functionLike): Type $localReturnNodes = $this->collectReturns($functionLike); if ($localReturnNodes === []) { + /** @var Class_|Interface_|Trait_ $classLike */ return $this->resolveNoLocalReturnNodes($classLike, $functionLike); } diff --git a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/SetterNodeReturnTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/SetterNodeReturnTypeInferer.php index 4821b049378..43db8acfe2c 100644 --- a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/SetterNodeReturnTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer/SetterNodeReturnTypeInferer.php @@ -9,7 +9,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\Core\NodeManipulator\FunctionLikeManipulator; -use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\TypeDeclaration\Contract\TypeInferer\ReturnTypeInfererInterface; use Rector\TypeDeclaration\TypeInferer\AssignToPropertyTypeInferer; @@ -19,13 +19,14 @@ final class SetterNodeReturnTypeInferer implements ReturnTypeInfererInterface public function __construct( private AssignToPropertyTypeInferer $assignToPropertyTypeInferer, private FunctionLikeManipulator $functionLikeManipulator, - private TypeFactory $typeFactory + private TypeFactory $typeFactory, + private BetterNodeFinder $betterNodeFinder, ) { } public function inferFunctionLike(FunctionLike $functionLike): Type { - $classLike = $functionLike->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($functionLike, ClassLike::class); if (! $classLike instanceof ClassLike) { return new MixedType(); } diff --git a/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php b/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php index 790203c54f8..4eb2e72dca6 100644 --- a/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php +++ b/rules/TypeDeclaration/TypeInferer/SilentVoidResolver.php @@ -8,17 +8,15 @@ use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\Yield_; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; -use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; use PhpParser\Node\Stmt\Throw_; -use PhpParser\Node\Stmt\Trait_; use PhpParser\Node\Stmt\TryCatch; use Rector\Core\PhpParser\Node\BetterNodeFinder; -use Rector\NodeTypeResolver\Node\AttributeKey; final class SilentVoidResolver { @@ -29,12 +27,8 @@ public function __construct( public function hasExclusiveVoid(ClassMethod | Closure | Function_ $functionLike): bool { - $classLike = $functionLike->getAttribute(AttributeKey::CLASS_NODE); - if ($classLike instanceof Interface_) { - return false; - } - - if ($classLike instanceof Trait_) { + $class = $this->betterNodeFinder->findParentType($functionLike, Class_::class); + if (! $class instanceof Class_) { return false; } diff --git a/src/NodeAnalyzer/EnumAnalyzer.php b/src/NodeAnalyzer/EnumAnalyzer.php index 1f98d11fc2b..a5a21e44914 100644 --- a/src/NodeAnalyzer/EnumAnalyzer.php +++ b/src/NodeAnalyzer/EnumAnalyzer.php @@ -6,13 +6,14 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassConst; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; final class EnumAnalyzer { public function __construct( - private NodeNameResolver $nodeNameResolver + private NodeNameResolver $nodeNameResolver, + private BetterNodeFinder $betterNodeFinder, ) { } @@ -21,15 +22,15 @@ public function __construct( */ public function isEnumClassConst(ClassConst $classConst): bool { - $classLike = $classConst->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($classConst, Class_::class); + if (! $class instanceof Class_) { return false; } - if ($classLike->extends === null) { + if ($class->extends === null) { return false; } - return $this->nodeNameResolver->isName($classLike->extends, '*Enum'); + return $this->nodeNameResolver->isName($class->extends, '*Enum'); } } diff --git a/src/NodeAnalyzer/PropertyFetchAnalyzer.php b/src/NodeAnalyzer/PropertyFetchAnalyzer.php index a1e873e282d..8ea5af915e5 100644 --- a/src/NodeAnalyzer/PropertyFetchAnalyzer.php +++ b/src/NodeAnalyzer/PropertyFetchAnalyzer.php @@ -20,7 +20,6 @@ use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\ValueObject\MethodName; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; final class PropertyFetchAnalyzer { @@ -82,12 +81,12 @@ public function isPropertyToSelf(PropertyFetch | StaticPropertyFetch $expr): boo return false; } - $classLike = $expr->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($expr, Class_::class); + if (! $class instanceof Class_) { return false; } - foreach ($classLike->getProperties() as $property) { + foreach ($class->getProperties() as $property) { if (! $this->nodeNameResolver->areNamesEqual($property->props[0], $expr)) { continue; } @@ -130,7 +129,7 @@ public function isVariableAssignToThisPropertyFetch(Node $node, string $variable public function isFilledByConstructParam(Property $property): bool { - $class = $property->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($property, Class_::class); if (! $class instanceof Class_) { return false; } diff --git a/src/NodeManipulator/ClassConstManipulator.php b/src/NodeManipulator/ClassConstManipulator.php index 358bb8853fd..e628a084dd8 100644 --- a/src/NodeManipulator/ClassConstManipulator.php +++ b/src/NodeManipulator/ClassConstManipulator.php @@ -13,7 +13,6 @@ use Rector\Core\PhpParser\AstResolver; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; final class ClassConstManipulator { @@ -26,8 +25,8 @@ public function __construct( public function hasClassConstFetch(ClassConst $classConst, ClassReflection $classReflection): bool { - $classLike = $classConst->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($classConst, Class_::class); + if (! $class instanceof Class_) { return false; } diff --git a/src/NodeManipulator/ClassMethodManipulator.php b/src/NodeManipulator/ClassMethodManipulator.php index 385470e2965..42aaf0f0620 100644 --- a/src/NodeManipulator/ClassMethodManipulator.php +++ b/src/NodeManipulator/ClassMethodManipulator.php @@ -64,8 +64,8 @@ public function isNamedConstructor(ClassMethod $classMethod): bool return false; } - $classLike = $classMethod->getAttribute(AttributeKey::CLASS_NODE); - if (! $classLike instanceof Class_) { + $class = $this->betterNodeFinder->findParentType($classMethod, Class_::class); + if (! $class instanceof Class_) { return false; } @@ -73,7 +73,7 @@ public function isNamedConstructor(ClassMethod $classMethod): bool return true; } - if ($classLike->isFinal()) { + if ($class->isFinal()) { return false; } diff --git a/src/NodeManipulator/PropertyManipulator.php b/src/NodeManipulator/PropertyManipulator.php index 8bf9b162e8b..e25dddc6f6e 100644 --- a/src/NodeManipulator/PropertyManipulator.php +++ b/src/NodeManipulator/PropertyManipulator.php @@ -76,8 +76,10 @@ public function isPropertyUsedInReadContext(Property | Param $propertyOrPromoted } // has classLike $this->$variable call? - /** @var ClassLike $classLike */ - $classLike = $propertyOrPromotedParam->getAttribute(AttributeKey::CLASS_NODE); + $classLike = $this->betterNodeFinder->findParentType($propertyOrPromotedParam, ClassLike::class); + if (! $classLike instanceof ClassLike) { + return false; + } return (bool) $this->betterNodeFinder->findFirst($classLike->stmts, function (Node $node): bool { if (! $node instanceof PropertyFetch) { diff --git a/src/PhpParser/NodeFinder/LocalConstantFinder.php b/src/PhpParser/NodeFinder/LocalConstantFinder.php index f409432d82f..9d786a7e9da 100644 --- a/src/PhpParser/NodeFinder/LocalConstantFinder.php +++ b/src/PhpParser/NodeFinder/LocalConstantFinder.php @@ -8,8 +8,8 @@ use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Stmt\Class_; use PHPStan\Type\TypeWithClassName; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; final class LocalConstantFinder @@ -17,12 +17,13 @@ final class LocalConstantFinder public function __construct( private NodeTypeResolver $nodeTypeResolver, private NodeNameResolver $nodeNameResolver, + private BetterNodeFinder $betterNodeFinder, ) { } public function match(ClassConstFetch $classConstFetch): ?Const_ { - $class = $classConstFetch->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($classConstFetch, Class_::class); if (! $class instanceof Class_) { return null; } diff --git a/src/PhpParser/NodeFinder/LocalMethodCallFinder.php b/src/PhpParser/NodeFinder/LocalMethodCallFinder.php index b35ded0a9e6..4fb35b4fd70 100644 --- a/src/PhpParser/NodeFinder/LocalMethodCallFinder.php +++ b/src/PhpParser/NodeFinder/LocalMethodCallFinder.php @@ -10,7 +10,6 @@ use PHPStan\Type\TypeWithClassName; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; final class LocalMethodCallFinder @@ -27,7 +26,7 @@ public function __construct( */ public function match(ClassMethod $classMethod): array { - $class = $classMethod->getAttribute(AttributeKey::CLASS_NODE); + $class = $this->betterNodeFinder->findParentType($classMethod, Class_::class); if (! $class instanceof Class_) { return []; } diff --git a/src/Rector/AbstractRector.php b/src/Rector/AbstractRector.php index dc87ea75229..8791597c9f2 100644 --- a/src/Rector/AbstractRector.php +++ b/src/Rector/AbstractRector.php @@ -62,7 +62,6 @@ abstract class AbstractRector extends NodeVisitorAbstract implements PhpRectorIn * @var string[] */ private const ATTRIBUTES_TO_MIRROR = [ - AttributeKey::CLASS_NODE, AttributeKey::CLASS_NAME, AttributeKey::METHOD_NODE, AttributeKey::USE_NODES, diff --git a/tests/Issues/Issue6675/Fixture/fixture.php.inc b/tests/Issues/Issue6675/Fixture/fixture.php.inc index ddea05becf5..907178466fd 100644 --- a/tests/Issues/Issue6675/Fixture/fixture.php.inc +++ b/tests/Issues/Issue6675/Fixture/fixture.php.inc @@ -12,14 +12,6 @@ echo mysql_error(); namespace Rector\Core\Tests\Issues\Issue6675\Fixture; $db = mysqli_connect("server","user","password"); -<<<<<<< HEAD echo mysqli_error($db); -======= -<<<<<<< HEAD -echo mysql_error(); -======= -echo mysql_error($db); ->>>>>>> 1f3994e5b... skip rename for now, till re-traversing ->>>>>>> restore state before PHPStan 1.0 ?>