From 6cad71ba6d24b43f92dc9d2270a6ac099218b02d Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Sat, 22 Oct 2022 23:25:59 +0800 Subject: [PATCH] feat: add "Vue" from auto import close #82 --- .../vscode-vue-language-features/package.json | 5 ++++ .../src/languageService.ts | 30 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/extensions/vscode-vue-language-features/package.json b/extensions/vscode-vue-language-features/package.json index 67b948ccb..d5432925d 100644 --- a/extensions/vscode-vue-language-features/package.json +++ b/extensions/vscode-vue-language-features/package.json @@ -471,6 +471,11 @@ "default": true, "description": "Enabled auto-import for component with tag completion." }, + "volar.completion.trimVueFromImportName": { + "type": "boolean", + "default": true, + "description": "Trim \"Vue\" from import name from auto import." + }, "volar.preview.script.vite": { "type": "string", "default": "node {VITE_BIN} --port={PORT}" diff --git a/vue-language-tools/vue-language-service/src/languageService.ts b/vue-language-tools/vue-language-service/src/languageService.ts index 5137bf1bf..d1bca4f9e 100644 --- a/vue-language-tools/vue-language-service/src/languageService.ts +++ b/vue-language-tools/vue-language-service/src/languageService.ts @@ -38,10 +38,36 @@ export function getSemanticTokenLegend() { export function getLanguageServicePlugins( host: vue.LanguageServiceHost, apis: embeddedLS.LanguageService, -) { +): embeddedLS.LanguageServicePlugin[] { // plugins - const tsPlugin = useTsPlugin(); + const _tsPlugin = useTsPlugin(); + const tsPlugin: embeddedLS.LanguageServicePlugin = (() => { + let context: embeddedLS.LanguageServicePluginContext; + return { + ..._tsPlugin, + setup(_context) { + _tsPlugin.setup?.(_context); + context = _context; + }, + complete: { + ..._tsPlugin.complete, + async resolve(item) { + item = await _tsPlugin.complete!.resolve!(item); + if ( + /\w*Vue$/.test(item.label) + && item.textEdit?.newText && /\w*Vue$/.test(item.textEdit.newText) + && item.additionalTextEdits?.length === 1 && item.additionalTextEdits[0].newText.indexOf('Vue from ') >= 0 + && (await context.env.configurationHost?.getConfiguration('volar.completion.trimVueFromImportName') ?? true) + ) { + item.textEdit.newText = item.textEdit.newText.slice(0, -'Vue'.length); + item.additionalTextEdits[0].newText = item.additionalTextEdits[0].newText.replace('Vue from ', ' from '); + } + return item; + }, + }, + }; + })(); const vuePlugin = useVuePlugin({ getVueDocument: (document) => apis.context.documents.get(document.uri), });