diff --git a/src/CompletionProvider.php b/src/CompletionProvider.php index d8fefa8..f330697 100644 --- a/src/CompletionProvider.php +++ b/src/CompletionProvider.php @@ -4,6 +4,7 @@ declare(strict_types = 1); namespace LanguageServer; use LanguageServer\Index\ReadableIndex; +use LanguageServer\ProtocolBridge\CompletionItemFactory; use LanguageServer\Protocol\{ TextEdit, Range, @@ -246,7 +247,7 @@ class CompletionProvider foreach ($this->index->getDefinitions() as $fqn => $def) { foreach ($prefixes as $prefix) { if (substr($fqn, 0, strlen($prefix)) === $prefix && $def->isMember) { - $list->items[] = CompletionItem::fromDefinition($def); + $list->items[] = CompletionItemFactory::fromDefinition($def); } } } @@ -279,7 +280,7 @@ class CompletionProvider foreach ($this->index->getDefinitions() as $fqn => $def) { foreach ($prefixes as $prefix) { if (substr(strtolower($fqn), 0, strlen($prefix)) === strtolower($prefix) && $def->isMember) { - $list->items[] = CompletionItem::fromDefinition($def); + $list->items[] = CompletionItemFactory::fromDefinition($def); } } } @@ -337,7 +338,7 @@ class CompletionProvider foreach ($aliases as $alias => $fqn) { // Suggest symbols that have been `use`d and match the prefix if (substr($alias, 0, $prefixLen) === $prefix && ($def = $this->index->getDefinition($fqn))) { - $list->items[] = CompletionItem::fromDefinition($def); + $list->items[] = CompletionItemFactory::fromDefinition($def); } } } @@ -370,7 +371,7 @@ class CompletionProvider // Only suggest classes for `new` && (!isset($creation) || $def->canBeInstantiated) ) { - $item = CompletionItem::fromDefinition($def); + $item = CompletionItemFactory::fromDefinition($def); // Find the shortest name to reference the symbol if ($namespaceNode && ($alias = array_search($fqn, $aliases, true)) !== false) { // $alias is the name under which this definition is aliased in the current namespace diff --git a/src/ProtocolBridge/CompletionItemFactory.php b/src/ProtocolBridge/CompletionItemFactory.php new file mode 100644 index 0000000..f3a3103 --- /dev/null +++ b/src/ProtocolBridge/CompletionItemFactory.php @@ -0,0 +1,36 @@ +label = $def->symbolInformation->name; + $item->kind = CompletionItemKind::fromSymbolKind($def->symbolInformation->kind); + if ($def->type) { + $item->detail = (string)$def->type; + } else if ($def->symbolInformation->containerName) { + $item->detail = $def->symbolInformation->containerName; + } + if ($def->documentation) { + $item->documentation = $def->documentation; + } + if ($def->isStatic && $def->symbolInformation->kind === SymbolKind::PROPERTY) { + $item->insertText = '$' . $def->symbolInformation->name; + } + return $item; + } +} diff --git a/src/ProtocolBridge/SymbolInformationFactory.php b/src/ProtocolBridge/SymbolInformationFactory.php index 54ffdcf..41dad3c 100644 --- a/src/ProtocolBridge/SymbolInformationFactory.php +++ b/src/ProtocolBridge/SymbolInformationFactory.php @@ -5,6 +5,8 @@ namespace LanguageServer\ProtocolBridge; use LanguageServer\Protocol\Location; use LanguageServer\Protocol\SymbolInformation; use LanguageServer\Protocol\SymbolKind; +use Microsoft\PhpParser\Node; +use Microsoft\PhpParser\ResolvedName; class SymbolInformationFactory { @@ -15,7 +17,7 @@ class SymbolInformationFactory * @param string $fqn If given, $containerName will be extracted from it * @return SymbolInformation|null */ - public function fromNode($node, string $fqn = null) + public function fromNode($node, string $fqn = null):? SymbolInformation { $symbol = new SymbolInformation(); if ($node instanceof Node\Statement\ClassDeclaration) { @@ -67,7 +69,7 @@ class SymbolInformationFactory $symbol->name = $node->getName(); } else if (isset($node->name)) { if ($node->name instanceof Node\QualifiedName) { - $symbol->name = (string)PhpParser\ResolvedName::buildName($node->name->nameParts, $node->getFileContents()); + $symbol->name = (string)ResolvedName::buildName($node->name->nameParts, $node->getFileContents()); } else { $symbol->name = ltrim((string)$node->name->getText($node->getFileContents()), "$"); } diff --git a/tests/LanguageServerTest.php b/tests/LanguageServerTest.php index 52963e6..8aebf77 100644 --- a/tests/LanguageServerTest.php +++ b/tests/LanguageServerTest.php @@ -5,8 +5,8 @@ namespace LanguageServer\Tests; use PHPUnit\Framework\TestCase; use LanguageServer\LanguageServer; +use LanguageServer\ProtocolBridge\Message; use LanguageServer\Protocol\{ - Message, ClientCapabilities, TextDocumentSyncKind, MessageType,