1
0
Fork 0

removed getAncestorFQNs in favor of yielding fqn keys

pull/421/head
Ivan Bozhanov 2017-07-06 20:19:46 +03:00
parent 51c0a94a21
commit f1188aa658
3 changed files with 17 additions and 32 deletions

View File

@ -196,18 +196,15 @@ class CompletionProvider
// $a->|
// Multiple prefixes for all possible types
$prefixes = FqnUtilities\getFqnsFromType(
$fqns = FqnUtilities\getFqnsFromType(
$this->definitionResolver->resolveExpressionNodeToType($node->dereferencableExpression)
);
// Include parent classes
$prefixes = iterator_to_array($this->expandParentFqns($prefixes), false);
// Add the object access operator to only get members
foreach ($prefixes as &$prefix) {
$prefix .= '->';
// Add the object access operator to only get members of all parents
$prefixes = [];
foreach ($this->expandParentFqns($fqns) as $prefix) {
$prefixes[] = $prefix . '->';
}
unset($prefix);
// Collect all definitions that match any of the prefixes
foreach ($this->index->getDefinitions() as $fqn => $def) {
@ -232,18 +229,15 @@ class CompletionProvider
// TODO: $a::|
// Resolve all possible types to FQNs
$prefixes = FqnUtilities\getFqnsFromType(
$fqns = FqnUtilities\getFqnsFromType(
$classType = $this->definitionResolver->resolveExpressionNodeToType($scoped->scopeResolutionQualifier)
);
// Add parent classes
$prefixes = iterator_to_array($this->expandParentFqns($prefixes), false);
// Append :: operator to only get static members
foreach ($prefixes as &$prefix) {
$prefix .= '::';
// Append :: operator to only get static members of all parents
$prefixes = [];
foreach ($this->expandParentFqns($fqns) as $prefix) {
$prefixes[] = $prefix . '::';
}
unset($prefix);
// Collect all definitions that match any of the prefixes
foreach ($this->index->getDefinitions() as $fqn => $def) {
@ -388,7 +382,9 @@ class CompletionProvider
yield $fqn;
$def = $this->index->getDefinition($fqn);
if ($def !== null) {
yield from $def->getAncestorFQNs($this->index);
foreach ($def->getAncestorDefinitions($this->index) as $name => $def) {
yield $name;
}
}
}
}

View File

@ -105,16 +105,16 @@ class Definition
public function getAncestorDefinitions(ReadableIndex $index, bool $includeSelf = false)
{
if ($includeSelf) {
yield $this;
yield $this->fqn => $this;
}
if (is_array($this->extends)) {
// iterating once, storing the references and iterating again
// guarantees that closest definitions are returned first
// guarantees that closest definitions are yielded first
$definitions = [];
foreach ($this->extends as $fqn) {
$def = $index->getDefinition($fqn);
if ($def !== null) {
yield $def;
yield $def->fqn => $def;
$definitions[] = $def;
}
}
@ -123,15 +123,4 @@ class Definition
}
}
}
/**
* Gets the FQNs of all parent classes
*
* @return string[]
*/
public function getAncestorFQNs(ReadableIndex $index, bool $includeSelf = false)
{
foreach ($this->getAncestorDefinitions($index, $includeSelf) as $def) {
yield $def->fqn;
}
}
}

View File

@ -672,7 +672,7 @@ class DefinitionResolver
}
$classDef = $this->index->getDefinition($classFqn);
if ($classDef !== null) {
foreach ($classDef->getAncestorFQNs($this->index, true) as $fqn) {
foreach ($classDef->getAncestorDefinitions($this->index, true) as $fqn => $def) {
$def = $this->index->getDefinition($fqn . $add);
if ($def !== null) {
if ($def->type instanceof Types\This) {