Skip to content

Commit d0562f9

Browse files
authored
perf: only create objects for completion items for svelte syntax once (#2900)
* only create objects for completion items for svelte syntax once * Optimize completion items handling for Svelte syntax * format
1 parent 96e8ca8 commit d0562f9

File tree

2 files changed

+56
-36
lines changed

2 files changed

+56
-36
lines changed

.changeset/sharp-jeans-attack.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte-language-server': patch
3+
---
4+
5+
[perf]: avoid re-reacting completion items for svelte syntax every time `getCompletionsWithRegardToTriggerCharacter` is called

packages/language-server/src/plugins/svelte/features/getCompletions.ts

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,48 @@ function getEventModifierCompletion(attributeContext: AttributeContext): Complet
109109
return CompletionList.create(items);
110110
}
111111

112+
const atCompletionItems = createCompletionItems([
113+
{ tag: 'html', label: 'html' },
114+
{ tag: 'debug', label: 'debug' },
115+
{ tag: 'const', label: 'const' },
116+
{ tag: 'render', label: 'render' },
117+
{ tag: 'attach', label: 'attach' }
118+
]);
119+
120+
const hashtagCompletionItems = createCompletionItems([
121+
{ tag: 'if', label: 'if', insertText: 'if $1}\n\t$2\n{/if' },
122+
{ tag: 'each', label: 'each', insertText: 'each $1 as $2}\n\t$3\n{/each' },
123+
{
124+
tag: 'await',
125+
label: 'await :then',
126+
insertText: 'await $1}\n\t$2\n{:then $3} \n\t$4\n{/await'
127+
},
128+
{
129+
tag: 'await',
130+
label: 'await then',
131+
insertText: 'await $1 then $2}\n\t$3\n{/await'
132+
},
133+
{ tag: 'key', label: 'key', insertText: 'key $1}\n\t$2\n{/key' },
134+
{ tag: 'snippet', label: 'snippet', insertText: 'snippet $1($2)}\n\t$3\n{/snippet' }
135+
]);
136+
137+
const beginningAwaitOpenCompletionItems = createCompletionItems([
138+
{ tag: 'await', label: 'then' },
139+
{ tag: 'await', label: 'catch' }
140+
]);
141+
142+
const beginningEachOpenCompletionItems = createCompletionItems([{ tag: 'each', label: 'else' }]);
143+
144+
const beginningIfOpenCompletionItems = createCompletionItems([
145+
{ tag: 'if', label: 'else' },
146+
{ tag: 'if', label: 'else if' }
147+
]);
148+
149+
const endAwaitOpenCompletionItems = createCompletionItems([{ tag: 'await', label: 'await' }]);
150+
const endEachOpenCompletionItems = createCompletionItems([{ tag: 'each', label: 'each' }]);
151+
const endIfOpenCompletionItems = createCompletionItems([{ tag: 'if', label: 'if' }]);
152+
const endKeyOpenCompletionItems = createCompletionItems([{ tag: 'key', label: 'key' }]);
153+
112154
/**
113155
* Get completions with regard to trigger character.
114156
*/
@@ -118,46 +160,19 @@ function getCompletionsWithRegardToTriggerCharacter(
118160
offset: number
119161
) {
120162
if (triggerCharacter === '@') {
121-
return createCompletionItems([
122-
{ tag: 'html', label: 'html' },
123-
{ tag: 'debug', label: 'debug' },
124-
{ tag: 'const', label: 'const' },
125-
{ tag: 'render', label: 'render' },
126-
{ tag: 'attach', label: 'attach' }
127-
]);
163+
return atCompletionItems;
128164
}
129165

130166
if (triggerCharacter === '#') {
131-
return createCompletionItems([
132-
{ tag: 'if', label: 'if', insertText: 'if $1}\n\t$2\n{/if' },
133-
{ tag: 'each', label: 'each', insertText: 'each $1 as $2}\n\t$3\n{/each' },
134-
{
135-
tag: 'await',
136-
label: 'await :then',
137-
insertText: 'await $1}\n\t$2\n{:then $3} \n\t$4\n{/await'
138-
},
139-
{
140-
tag: 'await',
141-
label: 'await then',
142-
insertText: 'await $1 then $2}\n\t$3\n{/await'
143-
},
144-
{ tag: 'key', label: 'key', insertText: 'key $1}\n\t$2\n{/key' },
145-
{ tag: 'snippet', label: 'snippet', insertText: 'snippet $1($2)}\n\t$3\n{/snippet' }
146-
]);
167+
return hashtagCompletionItems;
147168
}
148169

149170
if (triggerCharacter === ':') {
150171
return showCompletionWithRegardsToOpenedTags(
151172
{
152-
awaitOpen: createCompletionItems([
153-
{ tag: 'await', label: 'then' },
154-
{ tag: 'await', label: 'catch' }
155-
]),
156-
eachOpen: createCompletionItems([{ tag: 'each', label: 'else' }]),
157-
ifOpen: createCompletionItems([
158-
{ tag: 'if', label: 'else' },
159-
{ tag: 'if', label: 'else if' }
160-
])
173+
awaitOpen: beginningAwaitOpenCompletionItems,
174+
eachOpen: beginningEachOpenCompletionItems,
175+
ifOpen: beginningIfOpenCompletionItems
161176
},
162177
svelteDoc,
163178
offset
@@ -167,10 +182,10 @@ function getCompletionsWithRegardToTriggerCharacter(
167182
if (triggerCharacter === '/') {
168183
return showCompletionWithRegardsToOpenedTags(
169184
{
170-
awaitOpen: createCompletionItems([{ tag: 'await', label: 'await' }]),
171-
eachOpen: createCompletionItems([{ tag: 'each', label: 'each' }]),
172-
ifOpen: createCompletionItems([{ tag: 'if', label: 'if' }]),
173-
keyOpen: createCompletionItems([{ tag: 'key', label: 'key' }])
185+
awaitOpen: endAwaitOpenCompletionItems,
186+
eachOpen: endEachOpenCompletionItems,
187+
ifOpen: endIfOpenCompletionItems,
188+
keyOpen: endKeyOpenCompletionItems
174189
},
175190
svelteDoc,
176191
offset

0 commit comments

Comments
 (0)