From e730f7e91f4c448c71792515ae3eb1a5c7453dac Mon Sep 17 00:00:00 2001 From: Lyu Jason Date: Sat, 4 Sep 2021 12:30:54 +0800 Subject: [PATCH 1/5] completion --- .../src/plugins/html/HTMLPlugin.ts | 11 ++++ .../src/plugins/svelte/SveltePlugin.ts | 2 +- .../plugins/svelte/features/getCompletions.ts | 59 ++++++++++++++++--- .../svelte/features/getModifierData.ts | 58 ++++++++++++++++++ packages/language-server/src/server.ts | 3 +- .../svelte/features/getCompletions.test.ts | 10 ++-- 6 files changed, 128 insertions(+), 15 deletions(-) create mode 100644 packages/language-server/src/plugins/svelte/features/getModifierData.ts diff --git a/packages/language-server/src/plugins/html/HTMLPlugin.ts b/packages/language-server/src/plugins/html/HTMLPlugin.ts index 18e6a009e..a493d81cc 100644 --- a/packages/language-server/src/plugins/html/HTMLPlugin.ts +++ b/packages/language-server/src/plugins/html/HTMLPlugin.ts @@ -102,12 +102,23 @@ export class HTMLPlugin ) ]); } + const results = this.isInComponentTag(html, document, position) ? // Only allow emmet inside component element tags. // Other attributes/events would be false positives. CompletionList.create([]) : this.lang.doComplete(document, position, html); const items = this.toCompletionItems(results.items); + + items.forEach((item) => { + if (item.label.startsWith('on:') && item.textEdit) { + item.textEdit = { + ...item.textEdit, + newText: item.textEdit.newText.replace('="$1"', '$2="$1"') + }; + } + }); + return CompletionList.create( [ ...this.toCompletionItems(items), diff --git a/packages/language-server/src/plugins/svelte/SveltePlugin.ts b/packages/language-server/src/plugins/svelte/SveltePlugin.ts index 34901f141..29335979b 100644 --- a/packages/language-server/src/plugins/svelte/SveltePlugin.ts +++ b/packages/language-server/src/plugins/svelte/SveltePlugin.ts @@ -160,7 +160,7 @@ export class SveltePlugin return null; } - return getCompletions(svelteDoc, position); + return getCompletions(document, svelteDoc, position); } async doHover(document: Document, position: Position): Promise { diff --git a/packages/language-server/src/plugins/svelte/features/getCompletions.ts b/packages/language-server/src/plugins/svelte/features/getCompletions.ts index 8b16a17b2..1427e595d 100644 --- a/packages/language-server/src/plugins/svelte/features/getCompletions.ts +++ b/packages/language-server/src/plugins/svelte/features/getCompletions.ts @@ -5,10 +5,13 @@ import { CompletionList, CompletionItemKind, CompletionItem, - InsertTextFormat + InsertTextFormat, + MarkupKind } from 'vscode-languageserver'; import { SvelteTag, documentation, getLatestOpeningTag } from './SvelteTags'; -import { isInTag } from '../../../lib/documents'; +import { isInTag, Document } from '../../../lib/documents'; +import { AttributeContext, getAttributeContextAtPosition } from '../../../lib/documents/parseHtml'; +import { getModifierData } from './getModifierData'; const HTML_COMMENT_START = '