From 255df25227dbc53ab7a6c10f735785a7588a55aa Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Mon, 21 Mar 2022 13:23:57 +0800 Subject: [PATCH] fix: diagnostics not update close #1076 --- .../vue-language-service/src/languageService.ts | 7 ++++++- .../vue-language-service/src/stylesheetExtra.ts | 11 +++++++++-- packages/vue-language-service/src/vueDocuments.ts | 14 +++++++++++--- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/vue-language-service/src/languageService.ts b/packages/vue-language-service/src/languageService.ts index 6df5e2f90..3fff99957 100644 --- a/packages/vue-language-service/src/languageService.ts +++ b/packages/vue-language-service/src/languageService.ts @@ -114,6 +114,7 @@ export function createLanguageService( const templateTsLs = templateTsLsHost && templateTsLsRaw ? ts2.createLanguageService(ts, templateTsLsHost, templateTsLsRaw, tsSettings) : undefined; const blockingRequests = new Set>(); const documents = new WeakMap(); + const documentVersions = new Map(); // plugins const customPlugins = _customPlugins.map(plugin => defineLanguageServicePlugin(plugin)); @@ -385,10 +386,14 @@ export function createLanguageService( if (!document) { + const newVersion = (documentVersions.get(uri.toLowerCase()) ?? 0) + 1; + + documentVersions.set(uri.toLowerCase(), newVersion); + document = TextDocument.create( uri, uri.endsWith('.vue') ? 'vue' : 'typescript', // TODO - 0, // TODO + newVersion, scriptSnapshot.getText(0, scriptSnapshot.getLength()), ); documents.set(scriptSnapshot, document); diff --git a/packages/vue-language-service/src/stylesheetExtra.ts b/packages/vue-language-service/src/stylesheetExtra.ts index d329aabfd..0b58ab24b 100644 --- a/packages/vue-language-service/src/stylesheetExtra.ts +++ b/packages/vue-language-service/src/stylesheetExtra.ts @@ -21,6 +21,7 @@ export function createStylesheetExtra(cssPlugin: ReturnType const embeddedDocuments = new WeakMap(); const stylesheetVBinds = new WeakMap(); const stylesheetClasses = new WeakMap>(); + const embeddedDocumentVersions = new Map(); return { getCssVBindRanges, @@ -48,10 +49,16 @@ export function createStylesheetExtra(cssPlugin: ReturnType let document = embeddedDocuments.get(embeddedFile); if (!document) { + + const uri = shared.fsPathToUri(embeddedFile.fileName); + const newVersion = (embeddedDocumentVersions.get(embeddedFile.lsType + ':' + uri.toLowerCase()) ?? 0) + 1; + + embeddedDocumentVersions.set(embeddedFile.lsType + ':' + uri.toLowerCase(), newVersion); + document = TextDocument.create( - shared.fsPathToUri(embeddedFile.fileName), + uri, shared.syntaxToLanguageId(embeddedFile.lang), - 0, + newVersion, embeddedFile.content, ); embeddedDocuments.set(embeddedFile, document); diff --git a/packages/vue-language-service/src/vueDocuments.ts b/packages/vue-language-service/src/vueDocuments.ts index a2c50c09e..7be396efd 100644 --- a/packages/vue-language-service/src/vueDocuments.ts +++ b/packages/vue-language-service/src/vueDocuments.ts @@ -210,11 +210,19 @@ export function parseVueDocuments(vueFiles: VueFiles) { export function parseVueDocument(vueFile: VueFile) { // cache map + let documentVersion = 0; + const embeddedDocumentVersions = new Map(); const embeddedDocumentsMap = useCacheMap(embeddedFile => { + + const uri = shared.fsPathToUri(embeddedFile.fileName); + const newVersion = (embeddedDocumentVersions.get(embeddedFile.lsType + ':' + uri.toLowerCase()) ?? 0) + 1; + + embeddedDocumentVersions.set(embeddedFile.lsType + ':' + uri.toLowerCase(), newVersion); + return TextDocument.create( - shared.fsPathToUri(embeddedFile.fileName), + uri, shared.syntaxToLanguageId(embeddedFile.lang), - 0, + newVersion, embeddedFile.content, ); }); @@ -228,7 +236,7 @@ export function parseVueDocument(vueFile: VueFile) { }); // reactivity - const document = computed(() => TextDocument.create(shared.fsPathToUri(vueFile.fileName), 'vue', 0, vueFile.refs.content.value)); + const document = computed(() => TextDocument.create(shared.fsPathToUri(vueFile.fileName), 'vue', documentVersion++, vueFile.refs.content.value)); const sourceMaps = computed(() => { return vueFile.refs.allEmbeddeds.value.map(embedded => sourceMapsMap.get(embedded)); });