From cd182f687773ac3fd3b7db272f956b27e8937dac Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Mon, 21 Mar 2022 00:08:15 +0800 Subject: [PATCH] fix: vue tag auto-complete not working --- .../src/commonPlugins/html.ts | 18 +++++++++-------- .../src/documentService.ts | 1 - .../src/languageService.ts | 2 -- .../src/vuePlugins/vue.ts | 20 ++++--------------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/packages/vue-language-service/src/commonPlugins/html.ts b/packages/vue-language-service/src/commonPlugins/html.ts index efc3c25a6..94d604ae0 100644 --- a/packages/vue-language-service/src/commonPlugins/html.ts +++ b/packages/vue-language-service/src/commonPlugins/html.ts @@ -4,9 +4,10 @@ import { TextDocument } from 'vscode-languageserver-textdocument'; import * as shared from '@volar/shared'; export default function (host: { - configurationHost: ConfigurationHost | undefined + configurationHost?: ConfigurationHost, documentContext?: html.DocumentContext, fileSystemProvider?: html.FileSystemProvider, + validLang?: string, }): EmbeddedLanguageServicePlugin & { htmlLs: html.LanguageService, getHtmlDocument(document: TextDocument): html.HTMLDocument | undefined, @@ -35,11 +36,12 @@ export default function (host: { async doComplete(document, position, context) { return worker(document, (htmlDocument) => { - - if (!host.documentContext) - return; - - return htmlLs.doComplete2(document, position, htmlDocument, host.documentContext, /** TODO: CompletionConfiguration */); + if (host.documentContext) { + return htmlLs.doComplete2(document, position, htmlDocument, host.documentContext, /** TODO: CompletionConfiguration */); + } + else { + return htmlLs.doComplete(document, position, htmlDocument, /** TODO: CompletionConfiguration */); + } }); }, @@ -153,7 +155,7 @@ export default function (host: { }; async function initCustomData() { - if (!inited) { + if (!inited && host.configurationHost) { customData = await getCustomData(); htmlLs.setDataProviders(true, customData); inited = true; @@ -208,7 +210,7 @@ export default function (host: { function getHtmlDocument(document: TextDocument) { - if (document.languageId !== 'html') + if (document.languageId !== (host.validLang ?? 'html')) return; const cache = htmlDocuments.get(document); diff --git a/packages/vue-language-service/src/documentService.ts b/packages/vue-language-service/src/documentService.ts index e23aeb746..efa5739a4 100644 --- a/packages/vue-language-service/src/documentService.ts +++ b/packages/vue-language-service/src/documentService.ts @@ -47,7 +47,6 @@ export function getDocumentService( // language support plugins const vuePlugin = useVuePlugin({ - configurationHost, getVueDocument, scriptTsLs: undefined, }); diff --git a/packages/vue-language-service/src/languageService.ts b/packages/vue-language-service/src/languageService.ts index b64b49d71..e348d4d67 100644 --- a/packages/vue-language-service/src/languageService.ts +++ b/packages/vue-language-service/src/languageService.ts @@ -119,10 +119,8 @@ export function createLanguageService( const customPlugins = _customPlugins.map(plugin => defineLanguageServicePlugin(plugin)); const vuePlugin = defineLanguageServicePlugin( useVuePlugin({ - configurationHost, getVueDocument: (document) => vueDocuments.get(document.uri), scriptTsLs, - documentContext, }), ); const vueTemplateHtmlPlugin = _useVueTemplateLanguagePlugin( diff --git a/packages/vue-language-service/src/vuePlugins/vue.ts b/packages/vue-language-service/src/vuePlugins/vue.ts index 6d85f4286..5b8b88c44 100644 --- a/packages/vue-language-service/src/vuePlugins/vue.ts +++ b/packages/vue-language-service/src/vuePlugins/vue.ts @@ -5,6 +5,7 @@ import useHtmlPlugin from '../commonPlugins/html'; import * as vscode from 'vscode-languageserver-protocol'; import type * as ts2 from '@volar/typescript-language-service'; import { VueDocument } from '../vueDocuments'; +import { EmbeddedLanguageServicePlugin } from '@volar/vue-language-service-types'; const dataProvider = html.newHTMLDataProvider('vue', { version: 1.1, @@ -91,12 +92,12 @@ const dataProvider = html.newHTMLDataProvider('vue', { ] }); -export default function (host: Omit[0], 'getHtmlLs'> & { +export default function (host: { getVueDocument(document: TextDocument): VueDocument | undefined, scriptTsLs: ts2.LanguageService | undefined, -}): ReturnType { +}): EmbeddedLanguageServicePlugin { - const htmlPlugin = useHtmlPlugin(host); + const htmlPlugin = useHtmlPlugin({ validLang: 'vue' }); htmlPlugin.htmlLs.setDataProviders(false, [dataProvider]); return { @@ -150,19 +151,6 @@ export default function (host: Omit[0], 'getHtm }); }, - findDocumentLinks(document) { - return worker(document, (vueDocument) => { - - if (!host.documentContext) - return; - - const sfcWithEmptyBlocks = getSfcCodeWithEmptyBlocks(vueDocument, document.getText()); - const sfcWithEmptyBlocksDocument = TextDocument.create(document.uri, document.languageId, document.version, sfcWithEmptyBlocks); - - return htmlPlugin.htmlLs.findDocumentLinks(sfcWithEmptyBlocksDocument, host.documentContext); - }); - }, - findDocumentSymbols(document) { return worker(document, (vueDocument) => {