From 839d40b363980d7fdb36997431a65458aeb38f83 Mon Sep 17 00:00:00 2001 From: "a.bolonin" Date: Mon, 2 Nov 2026 23:29:25 +0100 Subject: [PATCH] [Server] Filter list completions in one pass --- src/Capability/Completion/ListCompletionProvider.php | 12 ++++++++---- .../Completion/ListCompletionProviderTest.php | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/Capability/Completion/ListCompletionProvider.php b/src/Capability/Completion/ListCompletionProvider.php index 5e066dec..ce5eff8f 100644 --- a/src/Capability/Completion/ListCompletionProvider.php +++ b/src/Capability/Completion/ListCompletionProvider.php @@ -35,9 +35,13 @@ public function getCompletions(string $currentValue): array return $this->values; } - return array_values(array_filter( - $this->values, - static fn (string $value) => str_starts_with($value, $currentValue) - )); + $completions = []; + foreach ($this->values as $value) { + if (str_starts_with($value, $currentValue)) { + $completions[] = $value; + } + } + + return $completions; } } diff --git a/tests/Unit/Capability/Completion/ListCompletionProviderTest.php b/tests/Unit/Capability/Completion/ListCompletionProviderTest.php index 4870d737..729dd2bc 100644 --- a/tests/Unit/Capability/Completion/ListCompletionProviderTest.php +++ b/tests/Unit/Capability/Completion/ListCompletionProviderTest.php @@ -55,4 +55,12 @@ public function testKeysAreDiscarded(): void $this->assertSame(['a', 'b'], $provider->getCompletions('')); } + + public function testPrefixMatchesPreserveOrderAndDuplicates(): void + { + $provider = new ListCompletionProvider(['beta', 'alpine', 'alpha', 'alpine']); + + $this->assertSame(['alpine', 'alpha', 'alpine'], $provider->getCompletions('al')); + $this->assertSame([], $provider->getCompletions('missing')); + } }