From 465edc1166346f36b46eba8462acdf237c3e9499 Mon Sep 17 00:00:00 2001 From: Daniel Leech Date: Sat, 2 Jan 2021 10:54:26 +0000 Subject: [PATCH] Add support for sort text --- composer.json | 2 +- .../Handler/CompletionHandler.php | 14 ++++++- .../Util/PhpactorToLspCompletionType.php | 4 +- .../Workspace/WorkspaceIndex.php | 1 + .../Unit/Handler/CompletionHandlerTest.php | 38 +++++++++++++++++++ .../Util/PhpactorToLspCompletionTypeTest.php | 7 +++- .../Benchmark/WorkspaceIndexBench.php | 2 - 7 files changed, 60 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 998c3786..2bf72adf 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "phly/phly-event-dispatcher": "^1.0", "phpactor/code-transform": "^0.4.0", "phpactor/code-transform-extension": "^0.2.1", - "phpactor/completion": "~0.4.2", + "phpactor/completion": "~0.4.3", "phpactor/completion-extension": "~0.2.2", "phpactor/completion-worse-extension": "^0.2.0", "phpactor/console-extension": "~0.1", diff --git a/lib/LanguageServerCompletion/Handler/CompletionHandler.php b/lib/LanguageServerCompletion/Handler/CompletionHandler.php index 428f3804..d48090ae 100644 --- a/lib/LanguageServerCompletion/Handler/CompletionHandler.php +++ b/lib/LanguageServerCompletion/Handler/CompletionHandler.php @@ -111,13 +111,14 @@ public function completion(CompletionParams $params, CancellationToken $token): : InsertTextFormat::PLAIN_TEXT ; } - - $items[] = CompletionItem::fromArray([ + + $items[] = $i = CompletionItem::fromArray([ 'label' => $name, 'kind' => PhpactorToLspCompletionType::fromPhpactorType($suggestion->type()), 'detail' => $this->formatShortDescription($suggestion), 'documentation' => $suggestion->documentation(), 'insertText' => $insertText, + 'sortText' => $this->sortText($suggestion), 'textEdit' => $this->textEdit($suggestion, $textDocument), 'command' => $this->command($textDocument->uri, $byteOffset, $suggestion), 'insertTextFormat' => $insertTextFormat @@ -191,4 +192,13 @@ private function formatShortDescription(Suggestion $suggestion): string return $prefix . $suggestion->shortDescription(); } + + private function sortText(Suggestion $suggestion): ?string + { + if (null === $suggestion->priority()) { + return null; + } + + return sprintf('%04s-%s', $suggestion->priority(), $suggestion->name()); + } } diff --git a/lib/LanguageServerCompletion/Util/PhpactorToLspCompletionType.php b/lib/LanguageServerCompletion/Util/PhpactorToLspCompletionType.php index 3950f0a6..0be61376 100644 --- a/lib/LanguageServerCompletion/Util/PhpactorToLspCompletionType.php +++ b/lib/LanguageServerCompletion/Util/PhpactorToLspCompletionType.php @@ -45,7 +45,9 @@ public static function fromPhpactorType(?string $suggestionType): ?int case Suggestion::TYPE_REFERENCE: return CompletionItemKind::REFERENCE; case Suggestion::TYPE_CONSTANT: - return 21; // not currently in the LSP protocol library + return CompletionItemKind::CONSTANT; + case Suggestion::TYPE_FIELD: + return CompletionItemKind::FIELD; default: return null; endswitch; diff --git a/lib/LanguageServerWorseReflection/Workspace/WorkspaceIndex.php b/lib/LanguageServerWorseReflection/Workspace/WorkspaceIndex.php index 42f4120a..4d8faaac 100644 --- a/lib/LanguageServerWorseReflection/Workspace/WorkspaceIndex.php +++ b/lib/LanguageServerWorseReflection/Workspace/WorkspaceIndex.php @@ -105,6 +105,7 @@ private function updateDocument(TextDocument $textDocument): void asyncCall(function () { yield delay($this->updateInterval); + $this->waiting = false; if (null === $this->documentToUpdate) { diff --git a/tests/LanguageServerCompletion/Unit/Handler/CompletionHandlerTest.php b/tests/LanguageServerCompletion/Unit/Handler/CompletionHandlerTest.php index 0603728c..a6756d69 100644 --- a/tests/LanguageServerCompletion/Unit/Handler/CompletionHandlerTest.php +++ b/tests/LanguageServerCompletion/Unit/Handler/CompletionHandlerTest.php @@ -193,6 +193,44 @@ public function testHandleSuggestionsWithSnippetsWhenClientDoesNotSupportIt() $this->assertFalse($response->result->isIncomplete); } + public function testHandleSuggestionsWithProiority(): void + { + $tester = $this->create([ + Suggestion::createWithOptions('hello', [ + 'type' => Suggestion::TYPE_METHOD, + 'label' => 'hello', + 'priority' => Suggestion::PRIORITY_HIGH + ]), + Suggestion::createWithOptions('goodbye', [ + 'type' => Suggestion::TYPE_METHOD, + 'snippet' => 'goodbye()', + 'priority' => Suggestion::PRIORITY_LOW + ]), + Suggestion::createWithOptions('$var', [ + 'type' => Suggestion::TYPE_VARIABLE, + ]), + ], false); + + $response = $tester->requestAndWait( + 'textDocument/completion', + [ + 'textDocument' => ProtocolFactory::textDocumentIdentifier(self::EXAMPLE_URI), + 'position' => ProtocolFactory::position(0, 0) + ] + ); + + $this->assertEquals([ + self::completionItem('hello', 2, [ + 'sortText' => '0064-hello', + ]), + self::completionItem('goodbye', 2, [ + 'sortText' => '0255-goodbye', + ]), + self::completionItem('var', 6), + ], $response->result->items); + $this->assertFalse($response->result->isIncomplete); + } + private static function completionItem( string $label, ?int $type, diff --git a/tests/LanguageServerCompletion/Unit/Util/PhpactorToLspCompletionTypeTest.php b/tests/LanguageServerCompletion/Unit/Util/PhpactorToLspCompletionTypeTest.php index 70c6aa98..f2fd1a08 100644 --- a/tests/LanguageServerCompletion/Unit/Util/PhpactorToLspCompletionTypeTest.php +++ b/tests/LanguageServerCompletion/Unit/Util/PhpactorToLspCompletionTypeTest.php @@ -12,8 +12,11 @@ class PhpactorToLspCompletionTypeTest extends TestCase public function testConverts() { $reflection = new ReflectionClass(Suggestion::class); - foreach ($reflection->getConstants() as $constantValue) { - $this->assertNotNull(PhpactorToLspCompletionType::fromPhpactorType($constantValue)); + foreach ($reflection->getConstants() as $name => $constantValue) { + if (0 !== strpos($name, 'TYPE')) { + continue; + } + $this->assertNotNull(PhpactorToLspCompletionType::fromPhpactorType($constantValue), $constantValue); } } } diff --git a/tests/LanguageServerWorseReflection/Benchmark/WorkspaceIndexBench.php b/tests/LanguageServerWorseReflection/Benchmark/WorkspaceIndexBench.php index 91455570..f1d9e924 100644 --- a/tests/LanguageServerWorseReflection/Benchmark/WorkspaceIndexBench.php +++ b/tests/LanguageServerWorseReflection/Benchmark/WorkspaceIndexBench.php @@ -2,7 +2,6 @@ namespace Phpactor\Extension\LanguageServerWorseReflection\Tests\Benchmark; -use PhpBench\Benchmark\Metadata\Annotations\Executor; use PhpBench\Benchmark\Metadata\Annotations\OutputTimeUnit; use PhpBench\Benchmark\Metadata\Annotations\Revs; use Phpactor\Extension\LanguageServerCompletion\Tests\IntegrationTestCase; @@ -13,7 +12,6 @@ /** * @BeforeMethods({"setUp"}) * @OutputTimeUnit("milliseconds") - * @Executor("local") */ class WorkspaceIndexBench extends IntegrationTestCase {