From 12c3909ea30393aaf070b4b7e7b5170343a0241e Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 5 Aug 2018 18:19:02 +0200 Subject: [PATCH] Turn InterfaceTypeResolver to BetterReflection --- .../src/PHPStanNodeScopeResolver.php | 6 +++--- .../PerNodeTypeResolver/TraitTypeResolver.php | 19 ++++++++----------- .../ClassTypeResolverTest.php | 2 +- src/NodeAnalyzer/PropertyFetchAnalyzer.php | 1 - 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/NodeTypeResolver/src/PHPStanNodeScopeResolver.php b/packages/NodeTypeResolver/src/PHPStanNodeScopeResolver.php index 276a1e968eb..52fbf9d3204 100644 --- a/packages/NodeTypeResolver/src/PHPStanNodeScopeResolver.php +++ b/packages/NodeTypeResolver/src/PHPStanNodeScopeResolver.php @@ -109,9 +109,9 @@ final class PHPStanNodeScopeResolver $scope = $scope->enterClass($this->phpstanBroker->getClass((string) $node->namespacedName)); } else { // possibly anonymous class - $privatesAccessor = (new PrivatesAccessor); - $anonymousClassReflection = $privatesAccessor->getPrivateProperty( - $this->nodeScopeResolver, 'anonymousClassReflection' + $anonymousClassReflection = (new PrivatesAccessor())->getPrivateProperty( + $this->nodeScopeResolver, + 'anonymousClassReflection' ); if ($anonymousClassReflection) { diff --git a/packages/NodeTypeResolver/src/PerNodeTypeResolver/TraitTypeResolver.php b/packages/NodeTypeResolver/src/PerNodeTypeResolver/TraitTypeResolver.php index 260286694eb..8beff88ebc7 100644 --- a/packages/NodeTypeResolver/src/PerNodeTypeResolver/TraitTypeResolver.php +++ b/packages/NodeTypeResolver/src/PerNodeTypeResolver/TraitTypeResolver.php @@ -4,10 +4,8 @@ namespace Rector\NodeTypeResolver\PerNodeTypeResolver; use PhpParser\Node; use PhpParser\Node\Stmt\Trait_; -use PHPStan\Analyser\Scope; -use PHPStan\Reflection\ClassReflection; -use Rector\Node\Attribute; use Rector\NodeTypeResolver\Contract\PerNodeTypeResolver\PerNodeTypeResolverInterface; +use Roave\BetterReflection\Reflection\ReflectionClass; final class TraitTypeResolver implements PerNodeTypeResolverInterface { @@ -25,16 +23,15 @@ final class TraitTypeResolver implements PerNodeTypeResolverInterface */ public function resolve(Node $traitNode): array { - /** @var Scope $traitNodeScope */ - $traitNodeScope = $traitNode->getAttribute(Attribute::SCOPE); + $traitReflection = ReflectionClass::createFromName((string) $traitNode->namespacedName); - /** @var ClassReflection $classReflection */ - $classReflection = $traitNodeScope->getClassReflection(); + $types = []; + $types[] = $traitReflection->getName(); - dump($classReflection); - die; + foreach ($traitReflection->getTraits() as $usedTraitReflection) { + $types[] = $usedTraitReflection->getName(); + } - $types[] = $this->resolveNameNode($traitNode); - return array_merge($types, $this->resolveUsedTraitTypes($traitNode)); + return $types; } } diff --git a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/ClassTypeResolverTest.php b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/ClassTypeResolverTest.php index 9f9ce134c08..201670baa5b 100644 --- a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/ClassTypeResolverTest.php +++ b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/ClassTypeResolverTest.php @@ -42,11 +42,11 @@ final class ClassTypeResolverTest extends AbstractNodeTypeResolverTest yield [__DIR__ . '/Source/ClassWithTrait.php', 0, [ClassWithTrait::class, AnotherTrait::class]]; + // traits in anonymous classes are ignored in PHPStan yield [ __DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class /*, AnotherTrait::class */], - // traits in anonymous classes are ignored in PHPStan ]; } } diff --git a/src/NodeAnalyzer/PropertyFetchAnalyzer.php b/src/NodeAnalyzer/PropertyFetchAnalyzer.php index 48449c41ee5..86d24a28209 100644 --- a/src/NodeAnalyzer/PropertyFetchAnalyzer.php +++ b/src/NodeAnalyzer/PropertyFetchAnalyzer.php @@ -93,7 +93,6 @@ final class PropertyFetchAnalyzer /** @var Scope $nodeScope */ $nodeScope = $node->getAttribute(Attribute::SCOPE); - $publicPropertyNames = $this->getPublicPropertyNamesForType($type); return ! in_array($nodePropertyName, $publicPropertyNames, true);