Skip to content

Commit fa87e8a

Browse files
Clear trigger characters when restarting server (#1375)
Fixes #1372
1 parent 9d5b4f2 commit fa87e8a

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

packages/tailwindcss-language-server/src/tw.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,13 @@ export class TW {
929929
}
930930

931931
// If the trigger characters haven't changed then we don't need to do anything
932-
if (equal(Array.from(chars), Array.from(this.lastTriggerCharacters ?? []))) return
932+
if (
933+
this.completionRegistration &&
934+
equal(Array.from(chars), Array.from(this.lastTriggerCharacters ?? []))
935+
) {
936+
return
937+
}
938+
933939
this.lastTriggerCharacters = chars
934940

935941
this.completionRegistration?.dispose()
@@ -1127,6 +1133,7 @@ export class TW {
11271133
this.commonRegistrations?.dispose()
11281134
this.commonRegistrations = undefined
11291135

1136+
this.lastTriggerCharacters.clear()
11301137
this.completionRegistration?.dispose()
11311138
this.completionRegistration = undefined
11321139

packages/tailwindcss-language-server/tests/env/capabilities.test.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,65 @@ defineTest({
182182
expect(idsBefore).toEqual(idsAfter)
183183
},
184184
})
185+
186+
defineTest({
187+
name: 'Trigger characters are registered after a server restart',
188+
fs: {
189+
'app.css': '@import "tailwindcss"',
190+
},
191+
prepare: async ({ root }) => ({ client: await createClient({ root }) }),
192+
handle: async ({ root, client }) => {
193+
// Initially don't have any registered capabilities because dynamic
194+
// registration is delayed until after project initialization
195+
expect(client.serverCapabilities).toEqual([])
196+
197+
// We open a document so a project gets initialized
198+
await client.open({
199+
lang: 'html',
200+
text: '<div class="bg-[#000]/25 hover:">',
201+
})
202+
203+
// And now capabilities are registered
204+
expect(client.serverCapabilities).toEqual(
205+
expect.arrayContaining([
206+
expect.objectContaining({
207+
method: 'textDocument/hover',
208+
}),
209+
210+
expect.objectContaining({
211+
method: 'textDocument/completion',
212+
registerOptions: {
213+
documentSelector: null,
214+
resolveProvider: true,
215+
triggerCharacters: ['"', "'", '`', ' ', '.', '(', '[', ']', '!', '/', '-', ':'],
216+
},
217+
}),
218+
]),
219+
)
220+
221+
let didRestart = new Promise((resolve) => {
222+
client.conn.onNotification('@/tailwindCSS/serverRestarted', resolve)
223+
})
224+
225+
// Force a server restart by telling the server tsconfig.json changed
226+
client.notifyChangedFiles({
227+
changed: [`${root}/tsconfig.json`],
228+
})
229+
230+
// Wait for the server initialization to finish
231+
await didRestart
232+
233+
expect(client.serverCapabilities).toEqual(
234+
expect.arrayContaining([
235+
expect.objectContaining({
236+
method: 'textDocument/completion',
237+
registerOptions: {
238+
documentSelector: null,
239+
resolveProvider: true,
240+
triggerCharacters: ['"', "'", '`', ' ', '.', '(', '[', ']', '!', '/', '-', ':'],
241+
},
242+
}),
243+
]),
244+
)
245+
},
246+
})

0 commit comments

Comments
 (0)