Skip to content

Commit

Permalink
fix(definitionresolver): infinite loop when indexing self referencing…
Browse files Browse the repository at this point in the history
… classes (#670)
  • Loading branch information
d0x2f authored and felixfbecker committed Nov 11, 2018
1 parent 71390c9 commit c7d25c7
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
20 changes: 20 additions & 0 deletions fixtures/self_referencing_class.php
@@ -0,0 +1,20 @@
<?php
namespace RecursiveTest;

class A extends A {}

class B extends C {}
class C extends B {}

class D extends E {}
class E extends F {}
class F extends D {}

$a = new A;
$a->undef_prop = 1;

$b = new B;
$b->undef_prop = 1;

$d = new D;
$d->undef_prop = 1;
8 changes: 7 additions & 1 deletion src/DefinitionResolver.php
Expand Up @@ -438,6 +438,7 @@ private function resolveMemberAccessExpressionNodeToFqn(Node\Expression\MemberAc

// Find the right class that implements the member
$implementorFqns = [$classFqn];
$visitedFqns = [];

while ($implementorFqn = array_shift($implementorFqns)) {
// If the member FQN exists, return it
Expand All @@ -450,10 +451,15 @@ private function resolveMemberAccessExpressionNodeToFqn(Node\Expression\MemberAc
if ($implementorDef === null) {
break;
}
// Note the FQN as visited
$visitedFqns[] = $implementorFqn;
// Repeat for parent class
if ($implementorDef->extends) {
foreach ($implementorDef->extends as $extends) {
$implementorFqns[] = $extends;
// Don't add the parent FQN if it's already been visited
if (!\in_array($extends, $visitedFqns)) {
$implementorFqns[] = $extends;
}
}
}
}
Expand Down

0 comments on commit c7d25c7

Please sign in to comment.