diff --git a/.changeset/sharp-jeans-attack.md b/.changeset/sharp-jeans-attack.md new file mode 100644 index 000000000..f93abbe73 --- /dev/null +++ b/.changeset/sharp-jeans-attack.md @@ -0,0 +1,5 @@ +--- +'svelte-language-server': patch +--- + +[perf]: avoid re-reacting completion items for svelte syntax every time `getCompletionsWithRegardToTriggerCharacter` is called diff --git a/packages/language-server/src/plugins/svelte/features/getCompletions.ts b/packages/language-server/src/plugins/svelte/features/getCompletions.ts index 5410cbad6..fa42ab231 100644 --- a/packages/language-server/src/plugins/svelte/features/getCompletions.ts +++ b/packages/language-server/src/plugins/svelte/features/getCompletions.ts @@ -109,6 +109,48 @@ function getEventModifierCompletion(attributeContext: AttributeContext): Complet return CompletionList.create(items); } +const atCompletionItems = createCompletionItems([ + { tag: 'html', label: 'html' }, + { tag: 'debug', label: 'debug' }, + { tag: 'const', label: 'const' }, + { tag: 'render', label: 'render' }, + { tag: 'attach', label: 'attach' } +]); + +const hashtagCompletionItems = createCompletionItems([ + { tag: 'if', label: 'if', insertText: 'if $1}\n\t$2\n{/if' }, + { tag: 'each', label: 'each', insertText: 'each $1 as $2}\n\t$3\n{/each' }, + { + tag: 'await', + label: 'await :then', + insertText: 'await $1}\n\t$2\n{:then $3} \n\t$4\n{/await' + }, + { + tag: 'await', + label: 'await then', + insertText: 'await $1 then $2}\n\t$3\n{/await' + }, + { tag: 'key', label: 'key', insertText: 'key $1}\n\t$2\n{/key' }, + { tag: 'snippet', label: 'snippet', insertText: 'snippet $1($2)}\n\t$3\n{/snippet' } +]); + +const beginningAwaitOpenCompletionItems = createCompletionItems([ + { tag: 'await', label: 'then' }, + { tag: 'await', label: 'catch' } +]); + +const beginningEachOpenCompletionItems = createCompletionItems([{ tag: 'each', label: 'else' }]); + +const beginningIfOpenCompletionItems = createCompletionItems([ + { tag: 'if', label: 'else' }, + { tag: 'if', label: 'else if' } +]); + +const endAwaitOpenCompletionItems = createCompletionItems([{ tag: 'await', label: 'await' }]); +const endEachOpenCompletionItems = createCompletionItems([{ tag: 'each', label: 'each' }]); +const endIfOpenCompletionItems = createCompletionItems([{ tag: 'if', label: 'if' }]); +const endKeyOpenCompletionItems = createCompletionItems([{ tag: 'key', label: 'key' }]); + /** * Get completions with regard to trigger character. */ @@ -118,46 +160,19 @@ function getCompletionsWithRegardToTriggerCharacter( offset: number ) { if (triggerCharacter === '@') { - return createCompletionItems([ - { tag: 'html', label: 'html' }, - { tag: 'debug', label: 'debug' }, - { tag: 'const', label: 'const' }, - { tag: 'render', label: 'render' }, - { tag: 'attach', label: 'attach' } - ]); + return atCompletionItems; } if (triggerCharacter === '#') { - return createCompletionItems([ - { tag: 'if', label: 'if', insertText: 'if $1}\n\t$2\n{/if' }, - { tag: 'each', label: 'each', insertText: 'each $1 as $2}\n\t$3\n{/each' }, - { - tag: 'await', - label: 'await :then', - insertText: 'await $1}\n\t$2\n{:then $3} \n\t$4\n{/await' - }, - { - tag: 'await', - label: 'await then', - insertText: 'await $1 then $2}\n\t$3\n{/await' - }, - { tag: 'key', label: 'key', insertText: 'key $1}\n\t$2\n{/key' }, - { tag: 'snippet', label: 'snippet', insertText: 'snippet $1($2)}\n\t$3\n{/snippet' } - ]); + return hashtagCompletionItems; } if (triggerCharacter === ':') { return showCompletionWithRegardsToOpenedTags( { - awaitOpen: createCompletionItems([ - { tag: 'await', label: 'then' }, - { tag: 'await', label: 'catch' } - ]), - eachOpen: createCompletionItems([{ tag: 'each', label: 'else' }]), - ifOpen: createCompletionItems([ - { tag: 'if', label: 'else' }, - { tag: 'if', label: 'else if' } - ]) + awaitOpen: beginningAwaitOpenCompletionItems, + eachOpen: beginningEachOpenCompletionItems, + ifOpen: beginningIfOpenCompletionItems }, svelteDoc, offset @@ -167,10 +182,10 @@ function getCompletionsWithRegardToTriggerCharacter( if (triggerCharacter === '/') { return showCompletionWithRegardsToOpenedTags( { - awaitOpen: createCompletionItems([{ tag: 'await', label: 'await' }]), - eachOpen: createCompletionItems([{ tag: 'each', label: 'each' }]), - ifOpen: createCompletionItems([{ tag: 'if', label: 'if' }]), - keyOpen: createCompletionItems([{ tag: 'key', label: 'key' }]) + awaitOpen: endAwaitOpenCompletionItems, + eachOpen: endEachOpenCompletionItems, + ifOpen: endIfOpenCompletionItems, + keyOpen: endKeyOpenCompletionItems }, svelteDoc, offset