diff --git a/fixtures/completion/this_return_value.php b/fixtures/completion/this_return_value.php index ae44071..03666e7 100644 --- a/fixtures/completion/this_return_value.php +++ b/fixtures/completion/this_return_value.php @@ -1,10 +1,14 @@ parent instanceof Node\Expression\CallExpression) { $add .= '()'; } - $fqn = $classFqn . $add; - $def = $this->index->getDefinition($fqn); - if ($def !== null) { - return $def->type; - } else { - $classDef = $this->index->getDefinition($classFqn); - if ($classDef !== null && is_array($classDef->extends)) { - foreach ($classDef->extends as $parent) { - $def = $this->index->getDefinition($parent . $add); - if ($def !== null) { - if ($def->type instanceof Types\This) { - return new Types\Object_(new Fqsen('\\' . $classFqn)); - } - return $def->type; - } + $lookupDefinition = function (string $base, string $add) use (&$lookupDefinition) { + $def = $this->index->getDefinition($base . $add); + if ($def !== null) { + yield $def; + } + $baseDef = $this->index->getDefinition($base); + if ($baseDef !== null && is_array($baseDef->extends)) { + foreach ($baseDef->extends as $name) { + yield from $lookupDefinition($name, $add); } } + }; + foreach ($lookupDefinition($classFqn, $add) as $def) { + if ($def->type instanceof Types\This) { + return new Types\Object_(new Fqsen('\\' . $classFqn)); + } + return $def->type; } } } diff --git a/tests/Server/TextDocument/CompletionTest.php b/tests/Server/TextDocument/CompletionTest.php index a766e78..9ff1df5 100644 --- a/tests/Server/TextDocument/CompletionTest.php +++ b/tests/Server/TextDocument/CompletionTest.php @@ -660,7 +660,7 @@ class CompletionTest extends TestCase $this->loader->open($completionUri, file_get_contents($completionUri)); $items = $this->textDocument->completion( new TextDocumentIdentifier($completionUri), - new Position(10, 19) + new Position(14, 19) )->wait(); $this->assertEquals(new CompletionList([ new CompletionItem(