diff --git a/.changeset/rotten-gifts-develop.md b/.changeset/rotten-gifts-develop.md new file mode 100644 index 000000000..f4a19595e --- /dev/null +++ b/.changeset/rotten-gifts-develop.md @@ -0,0 +1,5 @@ +--- +"svelte-language-server": patch +--- + +fix: use pug syntax for emmet in template lang pug diff --git a/packages/language-server/src/plugins/html/HTMLPlugin.ts b/packages/language-server/src/plugins/html/HTMLPlugin.ts index c7796f6c6..192d416ac 100644 --- a/packages/language-server/src/plugins/html/HTMLPlugin.ts +++ b/packages/language-server/src/plugins/html/HTMLPlugin.ts @@ -125,6 +125,13 @@ export class HTMLPlugin return this.lang.doHover(document, position, html); } + private getEmmetSyntax(document: Document, position: Position) { + return isInTag(position, document.templateInfo) && + document.getLanguageAttribute('template') === 'pug' + ? 'pug' + : 'html'; + } + async getCompletions( document: Document, position: Position, @@ -158,7 +165,12 @@ export class HTMLPlugin this.configManager.getEmmetConfig().showExpandedAbbreviation !== 'never' ) { doEmmetCompleteInner = () => - doEmmetComplete(document, position, 'html', this.configManager.getEmmetConfig()); + doEmmetComplete( + document, + position, + this.getEmmetSyntax(document, position), + this.configManager.getEmmetConfig() + ); this.lang.setCompletionParticipants([ { diff --git a/packages/language-server/test/plugins/html/HTMLPlugin.test.ts b/packages/language-server/test/plugins/html/HTMLPlugin.test.ts index ac7e9be55..f91bf6625 100644 --- a/packages/language-server/test/plugins/html/HTMLPlugin.test.ts +++ b/packages/language-server/test/plugins/html/HTMLPlugin.test.ts @@ -201,6 +201,32 @@ describe('HTML Plugin', () => { assert.strictEqual(completions, null); }); + it('provides pug emmet completions inside template lang="pug"', async () => { + const { plugin, document } = setup('\ndiv>\n'); + + const completions = await plugin.getCompletions(document, Position.create(1, 4), { + triggerCharacter: '>', + triggerKind: CompletionTriggerKind.TriggerCharacter + }); + + assert.strictEqual(completions?.items[0]?.label, 'div>'); + assert.strictEqual(completions?.items[0]?.textEdit?.newText, 'div ${0}'); + assert.strictEqual(completions?.items[0]?.documentation, 'div |'); + }); + + it('provides html emmet completions outside template lang="pug"', async () => { + const { plugin, document } = setup('\np\n\ndiv>'); + + const completions = await plugin.getCompletions(document, Position.create(3, 4), { + triggerCharacter: '>', + triggerKind: CompletionTriggerKind.TriggerCharacter + }); + + assert.strictEqual(completions?.items[0]?.label, 'div>'); + assert.strictEqual(completions?.items[0]?.textEdit?.newText, '