Don't filter properties on typed prefix (#207)
parent
10fb3c92e0
commit
db6f4f7e5d
|
@ -4,12 +4,10 @@ declare(strict_types = 1);
|
||||||
namespace LanguageServer;
|
namespace LanguageServer;
|
||||||
|
|
||||||
use PhpParser\Node;
|
use PhpParser\Node;
|
||||||
use phpDocumentor\Reflection\Types;
|
|
||||||
use LanguageServer\Protocol\{
|
use LanguageServer\Protocol\{
|
||||||
TextEdit,
|
TextEdit,
|
||||||
Range,
|
Range,
|
||||||
Position,
|
Position,
|
||||||
SymbolKind,
|
|
||||||
CompletionList,
|
CompletionList,
|
||||||
CompletionItem,
|
CompletionItem,
|
||||||
CompletionItemKind
|
CompletionItemKind
|
||||||
|
@ -134,30 +132,25 @@ class CompletionProvider
|
||||||
|| $node instanceof Node\Expr\StaticPropertyFetch
|
|| $node instanceof Node\Expr\StaticPropertyFetch
|
||||||
|| $node instanceof Node\Expr\ClassConstFetch
|
|| $node instanceof Node\Expr\ClassConstFetch
|
||||||
) {
|
) {
|
||||||
if (!is_string($node->name)) {
|
// If the name is an Error node, just filter by the class
|
||||||
// If the name is an Error node, just filter by the class
|
if ($node instanceof Node\Expr\MethodCall || $node instanceof Node\Expr\PropertyFetch) {
|
||||||
if ($node instanceof Node\Expr\MethodCall || $node instanceof Node\Expr\PropertyFetch) {
|
// For instances, resolve the variable type
|
||||||
// For instances, resolve the variable type
|
$prefixes = DefinitionResolver::getFqnsFromType(
|
||||||
$prefixes = DefinitionResolver::getFqnsFromType(
|
$this->definitionResolver->resolveExpressionNodeToType($node->var)
|
||||||
$this->definitionResolver->resolveExpressionNodeToType($node->var)
|
);
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$prefixes = [$node->class instanceof Node\Name ? (string)$node->class : ''];
|
|
||||||
}
|
|
||||||
// If we are just filtering by the class, add the appropiate operator to the prefix
|
|
||||||
// to filter the type of symbol
|
|
||||||
foreach ($prefixes as &$prefix) {
|
|
||||||
if ($node instanceof Node\Expr\MethodCall || $node instanceof Node\Expr\PropertyFetch) {
|
|
||||||
$prefix .= '->';
|
|
||||||
} else if ($node instanceof Node\Expr\StaticCall || $node instanceof Node\Expr\ClassConstFetch) {
|
|
||||||
$prefix .= '::';
|
|
||||||
} else if ($node instanceof Node\Expr\StaticPropertyFetch) {
|
|
||||||
$prefix .= '::$';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$fqn = $this->definitionResolver->resolveReferenceNodeToFqn($node);
|
$prefixes = [$node->class instanceof Node\Name ? (string)$node->class : ''];
|
||||||
$prefixes = $fqn !== null ? [$fqn] : [];
|
}
|
||||||
|
// If we are just filtering by the class, add the appropiate operator to the prefix
|
||||||
|
// to filter the type of symbol
|
||||||
|
foreach ($prefixes as &$prefix) {
|
||||||
|
if ($node instanceof Node\Expr\MethodCall || $node instanceof Node\Expr\PropertyFetch) {
|
||||||
|
$prefix .= '->';
|
||||||
|
} else if ($node instanceof Node\Expr\StaticCall || $node instanceof Node\Expr\ClassConstFetch) {
|
||||||
|
$prefix .= '::';
|
||||||
|
} else if ($node instanceof Node\Expr\StaticPropertyFetch) {
|
||||||
|
$prefix .= '::$';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->project->getDefinitions() as $fqn => $def) {
|
foreach ($this->project->getDefinitions() as $fqn => $def) {
|
||||||
|
|
|
@ -254,10 +254,25 @@ class CompletionTest extends TestCase
|
||||||
new Position(2, 13)
|
new Position(2, 13)
|
||||||
)->wait();
|
)->wait();
|
||||||
$this->assertEquals(new CompletionList([
|
$this->assertEquals(new CompletionList([
|
||||||
|
new CompletionItem(
|
||||||
|
'TEST_CLASS_CONST',
|
||||||
|
CompletionItemKind::VARIABLE,
|
||||||
|
'int',
|
||||||
|
'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.'
|
||||||
|
),
|
||||||
|
new CompletionItem(
|
||||||
|
'staticTestProperty',
|
||||||
|
CompletionItemKind::PROPERTY,
|
||||||
|
'\TestClass[]',
|
||||||
|
'Lorem excepteur officia sit anim velit veniam enim.',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'$staticTestProperty'
|
||||||
|
),
|
||||||
new CompletionItem(
|
new CompletionItem(
|
||||||
'staticTestMethod',
|
'staticTestMethod',
|
||||||
CompletionItemKind::METHOD,
|
CompletionItemKind::METHOD,
|
||||||
'mixed', // Method return type
|
'mixed',
|
||||||
'Do magna consequat veniam minim proident eiusmod incididunt aute proident.'
|
'Do magna consequat veniam minim proident eiusmod incididunt aute proident.'
|
||||||
)
|
)
|
||||||
], true), $items);
|
], true), $items);
|
||||||
|
@ -277,6 +292,21 @@ class CompletionTest extends TestCase
|
||||||
CompletionItemKind::VARIABLE,
|
CompletionItemKind::VARIABLE,
|
||||||
'int',
|
'int',
|
||||||
'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.'
|
'Anim labore veniam consectetur laboris minim quis aute aute esse nulla ad.'
|
||||||
|
),
|
||||||
|
new CompletionItem(
|
||||||
|
'staticTestProperty',
|
||||||
|
CompletionItemKind::PROPERTY,
|
||||||
|
'\TestClass[]',
|
||||||
|
'Lorem excepteur officia sit anim velit veniam enim.',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'$staticTestProperty'
|
||||||
|
),
|
||||||
|
new CompletionItem(
|
||||||
|
'staticTestMethod',
|
||||||
|
CompletionItemKind::METHOD,
|
||||||
|
'mixed',
|
||||||
|
'Do magna consequat veniam minim proident eiusmod incididunt aute proident.'
|
||||||
)
|
)
|
||||||
], true), $items);
|
], true), $items);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue