1
0
Fork 0

Use CompletionList

pull/165/head
Felix Becker 2016-11-28 18:47:56 +01:00
parent 5f085a3d8a
commit 38383fcaf0
3 changed files with 52 additions and 41 deletions

View File

@ -10,6 +10,7 @@ use LanguageServer\Protocol\{
Range, Range,
Position, Position,
SymbolKind, SymbolKind,
CompletionList,
CompletionItem, CompletionItem,
CompletionItemKind CompletionItemKind
}; };
@ -112,9 +113,9 @@ class CompletionProvider
* *
* @param PhpDocument $doc The opened document * @param PhpDocument $doc The opened document
* @param Position $pos The cursor position * @param Position $pos The cursor position
* @return CompletionItem[] * @return CompletionList
*/ */
public function provideCompletion(PhpDocument $doc, Position $pos): array public function provideCompletion(PhpDocument $doc, Position $pos): CompletionList
{ {
$node = $doc->getNodeAtPosition($pos); $node = $doc->getNodeAtPosition($pos);
@ -122,8 +123,7 @@ class CompletionProvider
$node = $node->getAttribute('parentNode'); $node = $node->getAttribute('parentNode');
} }
/** @var CompletionItem[] */ $list = new CompletionList;
$items = [];
// A non-free node means we do NOT suggest global symbols // A non-free node means we do NOT suggest global symbols
if ( if (
@ -161,7 +161,7 @@ class CompletionProvider
foreach ($this->project->getDefinitions() as $fqn => $def) { foreach ($this->project->getDefinitions() as $fqn => $def) {
foreach ($prefixes as $prefix) { foreach ($prefixes as $prefix) {
if (substr($fqn, 0, strlen($prefix)) === $prefix && !$def->isGlobal) { if (substr($fqn, 0, strlen($prefix)) === $prefix && !$def->isGlobal) {
$items[] = CompletionItem::fromDefinition($def); $list->items[] = CompletionItem::fromDefinition($def);
} }
} }
} }
@ -204,7 +204,7 @@ class CompletionProvider
// Search the aliases for the typed-in name // Search the aliases for the typed-in name
foreach ($aliasedDefs as $alias => $def) { foreach ($aliasedDefs as $alias => $def) {
if (substr($alias, 0, $prefixLen) === $prefix) { if (substr($alias, 0, $prefixLen) === $prefix) {
$items[] = CompletionItem::fromDefinition($def); $list->items[] = CompletionItem::fromDefinition($def);
} }
} }
} }
@ -240,7 +240,7 @@ class CompletionProvider
// Insert the FQN without trailing backlash // Insert the FQN without trailing backlash
$item->insertText = $fqn; $item->insertText = $fqn;
} }
$items[] = $item; $list->items[] = $item;
} }
} }
// Suggest keywords // Suggest keywords
@ -249,7 +249,7 @@ class CompletionProvider
if (substr($keyword, 0, $prefixLen) === $prefix) { if (substr($keyword, 0, $prefixLen) === $prefix) {
$item = new CompletionItem($keyword, CompletionItemKind::KEYWORD); $item = new CompletionItem($keyword, CompletionItemKind::KEYWORD);
$item->insertText = $keyword . ' '; $item->insertText = $keyword . ' ';
$items[] = $item; $list->items[] = $item;
} }
} }
} }
@ -270,7 +270,7 @@ class CompletionProvider
new Range($pos, $pos), new Range($pos, $pos),
stripStringOverlap($doc->getRange(new Range(new Position(0, 0), $pos)), $item->label) stripStringOverlap($doc->getRange(new Range(new Position(0, 0), $pos)), $item->label)
); );
$items[] = $item; $list->items[] = $item;
} }
} else if ($node instanceof Node\Stmt\InlineHTML || $pos == new Position(0, 0)) { } else if ($node instanceof Node\Stmt\InlineHTML || $pos == new Position(0, 0)) {
$item = new CompletionItem('<?php', CompletionItemKind::KEYWORD); $item = new CompletionItem('<?php', CompletionItemKind::KEYWORD);
@ -278,10 +278,10 @@ class CompletionProvider
new Range($pos, $pos), new Range($pos, $pos),
stripStringOverlap($doc->getRange(new Range(new Position(0, 0), $pos)), '<?php') stripStringOverlap($doc->getRange(new Range(new Position(0, 0), $pos)), '<?php')
); );
$items[] = $item; $list->items[] = $item;
} }
return $items; return $list;
} }
/** /**

View File

@ -22,4 +22,14 @@ class CompletionList
* @var CompletionItem[] * @var CompletionItem[]
*/ */
public $items; public $items;
/**
* @param CompletionItem[] $items The completion items.
* @param bool $isIncomplete This list it not complete. Further typing should result in recomputing this list.
*/
public function __construct(array $items = [], bool $isIncomplete = false)
{
$this->items = $items;
$this->isIncomplete = $isIncomplete;
}
} }

View File

@ -12,6 +12,7 @@ use LanguageServer\Protocol\{
Range, Range,
Position, Position,
ClientCapabilities, ClientCapabilities,
CompletionList,
CompletionItem, CompletionItem,
CompletionItemKind CompletionItemKind
}; };
@ -46,7 +47,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(3, 7) new Position(3, 7)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'testProperty', 'testProperty',
CompletionItemKind::PROPERTY, CompletionItemKind::PROPERTY,
@ -59,7 +60,7 @@ class CompletionTest extends TestCase
'\TestClass', // Return type of the method '\TestClass', // Return type of the method
'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.'
) )
], $items); ]), $items);
} }
public function testPropertyAndMethodWithoutPrefix() public function testPropertyAndMethodWithoutPrefix()
@ -70,7 +71,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(3, 6) new Position(3, 6)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'testProperty', 'testProperty',
CompletionItemKind::PROPERTY, CompletionItemKind::PROPERTY,
@ -83,7 +84,7 @@ class CompletionTest extends TestCase
'\TestClass', // Return type of the method '\TestClass', // Return type of the method
'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.' 'Non culpa nostrud mollit esse sunt laboris in irure ullamco cupidatat amet.'
) )
], $items); ]), $items);
} }
public function testVariable() public function testVariable()
@ -94,7 +95,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(8, 5) new Position(8, 5)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'$var', '$var',
CompletionItemKind::VARIABLE, CompletionItemKind::VARIABLE,
@ -115,7 +116,7 @@ class CompletionTest extends TestCase
null, null,
new TextEdit(new Range(new Position(8, 5), new Position(8, 5)), 'param') new TextEdit(new Range(new Position(8, 5), new Position(8, 5)), 'param')
) )
], $items); ]), $items);
} }
public function testVariableWithPrefix() public function testVariableWithPrefix()
@ -126,7 +127,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(8, 6) new Position(8, 6)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'$param', '$param',
CompletionItemKind::VARIABLE, CompletionItemKind::VARIABLE,
@ -137,7 +138,7 @@ class CompletionTest extends TestCase
null, null,
new TextEdit(new Range(new Position(8, 6), new Position(8, 6)), 'aram') new TextEdit(new Range(new Position(8, 6), new Position(8, 6)), 'aram')
) )
], $items); ]), $items);
} }
public function testNewInNamespace() public function testNewInNamespace()
@ -148,7 +149,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(6, 10) new Position(6, 10)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
// Global TestClass definition (inserted as \TestClass) // Global TestClass definition (inserted as \TestClass)
new CompletionItem( new CompletionItem(
'TestClass', 'TestClass',
@ -169,7 +170,7 @@ class CompletionTest extends TestCase
null, null,
'TestClass' 'TestClass'
), ),
], $items); ]), $items);
} }
public function testUsedClass() public function testUsedClass()
@ -180,14 +181,14 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(6, 5) new Position(6, 5)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'TestClass', 'TestClass',
CompletionItemKind::CLASS_, CompletionItemKind::CLASS_,
'TestNamespace', 'TestNamespace',
'Pariatur ut laborum tempor voluptate consequat ea deserunt.' 'Pariatur ut laborum tempor voluptate consequat ea deserunt.'
) )
], $items); ]), $items);
} }
public function testStaticPropertyWithPrefix() public function testStaticPropertyWithPrefix()
@ -198,7 +199,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(2, 14) new Position(2, 14)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'staticTestProperty', 'staticTestProperty',
CompletionItemKind::PROPERTY, CompletionItemKind::PROPERTY,
@ -208,7 +209,7 @@ class CompletionTest extends TestCase
null, null,
'$staticTestProperty' '$staticTestProperty'
) )
], $items); ]), $items);
} }
public function testStaticWithoutPrefix() public function testStaticWithoutPrefix()
@ -219,7 +220,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(2, 11) new Position(2, 11)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'TEST_CLASS_CONST', 'TEST_CLASS_CONST',
CompletionItemKind::VARIABLE, CompletionItemKind::VARIABLE,
@ -241,7 +242,7 @@ class CompletionTest extends TestCase
'mixed', // Method return type 'mixed', // Method return type
'Do magna consequat veniam minim proident eiusmod incididunt aute proident.' 'Do magna consequat veniam minim proident eiusmod incididunt aute proident.'
) )
], $items); ]), $items);
} }
public function testStaticMethodWithPrefix() public function testStaticMethodWithPrefix()
@ -252,14 +253,14 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(2, 13) new Position(2, 13)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'staticTestMethod', 'staticTestMethod',
CompletionItemKind::METHOD, CompletionItemKind::METHOD,
'mixed', // Method return type 'mixed', // Method return type
'Do magna consequat veniam minim proident eiusmod incididunt aute proident.' 'Do magna consequat veniam minim proident eiusmod incididunt aute proident.'
) )
], $items); ]), $items);
} }
public function testClassConstWithPrefix() public function testClassConstWithPrefix()
@ -270,14 +271,14 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(2, 13) new Position(2, 13)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'TEST_CLASS_CONST', 'TEST_CLASS_CONST',
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.'
) )
], $items); ]), $items);
} }
public function testFullyQualifiedClass() public function testFullyQualifiedClass()
@ -288,7 +289,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(6, 6) new Position(6, 6)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'TestClass', 'TestClass',
CompletionItemKind::CLASS_, CompletionItemKind::CLASS_,
@ -298,7 +299,7 @@ class CompletionTest extends TestCase
null, null,
'TestClass' 'TestClass'
) )
], $items); ]), $items);
} }
public function testKeywords() public function testKeywords()
@ -309,10 +310,10 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(2, 1) new Position(2, 1)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem('class', CompletionItemKind::KEYWORD, null, null, null, null, 'class '), new CompletionItem('class', CompletionItemKind::KEYWORD, null, null, null, null, 'class '),
new CompletionItem('clone', CompletionItemKind::KEYWORD, null, null, null, null, 'clone ') new CompletionItem('clone', CompletionItemKind::KEYWORD, null, null, null, null, 'clone ')
], $items); ]), $items);
} }
public function testHtmlWithoutPrefix() public function testHtmlWithoutPrefix()
@ -323,7 +324,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(0, 0) new Position(0, 0)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'<?php', '<?php',
CompletionItemKind::KEYWORD, CompletionItemKind::KEYWORD,
@ -334,7 +335,7 @@ class CompletionTest extends TestCase
null, null,
new TextEdit(new Range(new Position(0, 0), new Position(0, 0)), '<?php') new TextEdit(new Range(new Position(0, 0), new Position(0, 0)), '<?php')
) )
], $items); ]), $items);
} }
public function testHtmlWithPrefix() public function testHtmlWithPrefix()
@ -345,7 +346,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(0, 1) new Position(0, 1)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'<?php', '<?php',
CompletionItemKind::KEYWORD, CompletionItemKind::KEYWORD,
@ -356,7 +357,7 @@ class CompletionTest extends TestCase
null, null,
new TextEdit(new Range(new Position(0, 1), new Position(0, 1)), '?php') new TextEdit(new Range(new Position(0, 1), new Position(0, 1)), '?php')
) )
], $items); ]), $items);
} }
public function testNamespace() public function testNamespace()
@ -367,7 +368,7 @@ class CompletionTest extends TestCase
new TextDocumentIdentifier($completionUri), new TextDocumentIdentifier($completionUri),
new Position(4, 6) new Position(4, 6)
)->wait(); )->wait();
$this->assertEquals([ $this->assertEquals(new CompletionList([
new CompletionItem( new CompletionItem(
'SomeNamespace', 'SomeNamespace',
CompletionItemKind::MODULE, CompletionItemKind::MODULE,
@ -377,6 +378,6 @@ class CompletionTest extends TestCase
null, null,
'SomeNamespace' 'SomeNamespace'
) )
], $items); ]), $items);
} }
} }