CompletionItemFactory and imported missing names in SymbolInformationFactory
parent
641b1c2907
commit
d05d02ce8a
|
@ -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
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace LanguageServer\ProtocolBridge;
|
||||
|
||||
use LanguageServer\Definition;
|
||||
use LanguageServer\Protocol\CompletionItem;
|
||||
use LanguageServer\Protocol\CompletionItemKind;
|
||||
use LanguageServer\Protocol\SymbolKind;
|
||||
|
||||
class CompletionItemFactory
|
||||
{
|
||||
/**
|
||||
* Creates a CompletionItem for a Definition
|
||||
*
|
||||
* @param Definition $def
|
||||
* @return CompletionItem|null
|
||||
*/
|
||||
public static function fromDefinition(Definition $def)
|
||||
{
|
||||
$item = new CompletionItem;
|
||||
$item->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;
|
||||
}
|
||||
}
|
|
@ -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()), "$");
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue