Skip to content

Commit

Permalink
Move from CLASS_NODE attribute to more reliable parent node finder (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
TomasVotruba committed Nov 6, 2021
1 parent e46fe29 commit c3b6efe
Show file tree
Hide file tree
Showing 86 changed files with 322 additions and 330 deletions.
2 changes: 0 additions & 2 deletions .phpstorm.meta.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion build/target-repository/docs/how_it_works.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"phpstan/phpstan-phpunit": "^1.0",
"rector/extension-installer": "^0.11.1",
"rector/rector-cakephp": "^0.11.6",
"rector/rector-doctrine": "^0.11.26",
"rector/rector-doctrine": "^0.11",
"rector/rector-laravel": "^0.11.8",
"rector/rector-nette": "^0.11.39",
"rector/rector-phpoffice": "^0.11.6",
Expand Down
9 changes: 9 additions & 0 deletions packages/NodeTypeResolver/Node/AttributeKey.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace Rector\NodeTypeResolver\Node;

use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Symplify\SmartFileSystem\SmartFileInfo;

/**
Expand All @@ -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';
Expand Down
8 changes: 5 additions & 3 deletions packages/NodeTypeResolver/NodeTypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,20 @@
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;

final class ClassMethodOrClassConstTypeResolver implements NodeTypeResolverInterface
{
private NodeTypeResolver $nodeTypeResolver;

public function __construct(
private BetterNodeFinder $betterNodeFinder
) {
}

#[Required]
public function autowireClassMethodOrClassConstTypeResolver(NodeTypeResolver $nodeTypeResolver): void
{
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
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;
Expand All @@ -27,7 +28,8 @@ final class PropertyFetchTypeResolver implements NodeTypeResolverInterface

public function __construct(
private NodeNameResolver $nodeNameResolver,
private ReflectionProvider $reflectionProvider
private ReflectionProvider $reflectionProvider,
private BetterNodeFinder $betterNodeFinder
) {
}

Expand Down Expand Up @@ -56,13 +58,13 @@ public function resolve(Node $node): Type
return $vendorPropertyType;
}

/** @var Scope|null $scope */
$scope = $node->getAttribute(AttributeKey::SCOPE);
if (! $scope instanceof Scope) {
$classNode = $node->getAttribute(AttributeKey::CLASS_NODE);
$classLike = $this->betterNodeFinder->findParentType($node, ClassLike::class);

// fallback to class, since property fetches are not scoped by PHPStan
if ($classNode instanceof ClassLike) {
$scope = $classNode->getAttribute(AttributeKey::SCOPE);
if ($classLike instanceof ClassLike) {
$scope = $classLike->getAttribute(AttributeKey::SCOPE);
}

if (! $scope instanceof Scope) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
13 changes: 6 additions & 7 deletions packages/NodeTypeResolver/TypeAnalyzer/ArrayTypeAnalyzer.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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,
) {
}

Expand Down Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@
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
{
public function __construct(
private JustReadExprAnalyzer $justReadExprAnalyzer,
private PropertyFetchFinder $propertyFetchFinder,
private NodeNameResolver $nodeNameResolver
private NodeNameResolver $nodeNameResolver,
private BetterNodeFinder $betterNodeFinder
) {
}

Expand All @@ -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;
Expand Down
14 changes: 10 additions & 4 deletions packages/StaticTypeMapper/Naming/NameScopeFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ parameters:
- '#Cognitive complexity for "Rector\\Php80\\NodeResolver\\SwitchExprsResolver\:\:resolve\(\)" is (.*?), keep it under 9#'

-
message: "#^Cognitive complexity for \"Rector\\\\PhpSpecToPHPUnit\\\\Rector\\\\MethodCall\\\\PhpSpecPromisesToPHPUnitAssertRector\\:\\:refactor\\(\\)\" is 13, keep it under 9$#"
message: "#^Cognitive complexity for \"Rector\\\\PhpSpecToPHPUnit\\\\Rector\\\\MethodCall\\\\PhpSpecPromisesToPHPUnitAssertRector\\:\\:refactor\\(\\)\" is (.*?), keep it under 9$#"
path: rules/PhpSpecToPHPUnit/Rector/MethodCall/PhpSpecPromisesToPHPUnitAssertRector.php

-
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Rector\Tests\Php74\Rector\Property\TypedPropertyRector\Fixture;

trait SkipTrait
{
private $body;

public function setJsonBody(array $body): self
{
$this->body = $body;
return $this;
}

public function getJsonBody(): ?array
{
return $this->body;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ trait MaterializedPathEntity
public function setParent(self $parent = null) : static
{
$this->parent = $parent;

return $this;
}

Expand Down

0 comments on commit c3b6efe

Please sign in to comment.