From 3ea750384b84d9f2d11518478580316891a7e39f Mon Sep 17 00:00:00 2001 From: so1ve Date: Mon, 26 Jun 2023 20:43:04 +0800 Subject: [PATCH 1/8] test --- .../vue-tsc/non-strict-template/#3327/main.vue | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/main.vue diff --git a/packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/main.vue b/packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/main.vue new file mode 100644 index 0000000000..1b0431856c --- /dev/null +++ b/packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/main.vue @@ -0,0 +1,4 @@ + From f3902d2f3c08c8a9a8ec832515333de54b29e0e3 Mon Sep 17 00:00:00 2001 From: so1ve Date: Mon, 26 Jun 2023 22:08:38 +0800 Subject: [PATCH 2/8] fxk --- .../src/parsers/scriptSetupRanges.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts index 86b15e358d..f9b8239706 100644 --- a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts +++ b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts @@ -34,7 +34,13 @@ export function parseScriptSetupRanges( }[] = []; const bindings = parseBindingRanges(ts, ast, false); + let lastImportNode: ts.Node | undefined; + ast.forEachChild(node => { + if (ts.isImportDeclaration(node) || (ts.isImportEqualsDeclaration(node) && !!node.moduleReference.getText(ast))) { + lastImportNode = node; + } + const isTypeExport = (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword); if ( !foundNonImportExportNode @@ -44,7 +50,11 @@ export function parseScriptSetupRanges( // fix https://github.com/vuejs/language-tools/issues/1223 && !ts.isImportEqualsDeclaration(node) ) { - importSectionEndOffset = node.getStart(ast, true); + const start = node.getStart(ast, true); + importSectionEndOffset = lastImportNode?.getEnd() ?? 0; + if (ast.text.slice(importSectionEndOffset, start).trim().includes('^complete')) { + importSectionEndOffset = start; + } foundNonImportExportNode = true; } }); From 1a9bb9cf3630e9741b1deaffa533ccd4acc44dbd Mon Sep 17 00:00:00 2001 From: so1ve Date: Wed, 5 Jul 2023 13:15:47 +0800 Subject: [PATCH 3/8] Revert "fxk" This reverts commit f3902d2f3c08c8a9a8ec832515333de54b29e0e3. --- .../src/parsers/scriptSetupRanges.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts index f9b8239706..86b15e358d 100644 --- a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts +++ b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts @@ -34,13 +34,7 @@ export function parseScriptSetupRanges( }[] = []; const bindings = parseBindingRanges(ts, ast, false); - let lastImportNode: ts.Node | undefined; - ast.forEachChild(node => { - if (ts.isImportDeclaration(node) || (ts.isImportEqualsDeclaration(node) && !!node.moduleReference.getText(ast))) { - lastImportNode = node; - } - const isTypeExport = (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword); if ( !foundNonImportExportNode @@ -50,11 +44,7 @@ export function parseScriptSetupRanges( // fix https://github.com/vuejs/language-tools/issues/1223 && !ts.isImportEqualsDeclaration(node) ) { - const start = node.getStart(ast, true); - importSectionEndOffset = lastImportNode?.getEnd() ?? 0; - if (ast.text.slice(importSectionEndOffset, start).trim().includes('^complete')) { - importSectionEndOffset = start; - } + importSectionEndOffset = node.getStart(ast, true); foundNonImportExportNode = true; } }); From ce2e5be8cc9d3206ae3dcf0508b425b4b3f9634d Mon Sep 17 00:00:00 2001 From: so1ve Date: Wed, 5 Jul 2023 13:19:54 +0800 Subject: [PATCH 4/8] fix --- .../vue-language-core/src/generators/script.ts | 12 ++++++++---- .../src/parsers/scriptSetupRanges.ts | 14 +++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/vue-language-core/src/generators/script.ts b/packages/vue-language-core/src/generators/script.ts index b70ed11bf6..d98a67a3f1 100644 --- a/packages/vue-language-core/src/generators/script.ts +++ b/packages/vue-language-core/src/generators/script.ts @@ -56,7 +56,8 @@ export function generate( emitsTypeArg: undefined, emitsTypeNums: 0, exposeRuntimeArg: undefined, - importSectionEndOffset: 0, + importSectionEndOffsetWithComment: 0, + importSectionEndOffsetWithoutComment: 0, defineProps: undefined, propsAssignName: undefined, propsRuntimeArg: undefined, @@ -267,7 +268,7 @@ export function generate( return; codes.push([ - sfc.scriptSetup.content.substring(0, scriptSetupRanges.importSectionEndOffset), + sfc.scriptSetup.content.substring(0, scriptSetupRanges.importSectionEndOffsetWithComment), 'scriptSetup', 0, FileRangeCapabilities.full, @@ -480,9 +481,12 @@ declare function defineProp(value?: T | (() => T), required?: boolean, rest?: `.trim() + '\n'); } - const scriptSetupGeneratedOffset = muggle.getLength(codes) - scriptSetupRanges.importSectionEndOffset; + const scriptSetupGeneratedOffset = muggle.getLength(codes) - scriptSetupRanges.importSectionEndOffsetWithComment; + console.log(muggle.toString(codes)) - addVirtualCode('scriptSetup', scriptSetupRanges.importSectionEndOffset); + addVirtualCode('scriptSetup', scriptSetupRanges.importSectionEndOffsetWithComment); + + console.log(muggle.toString(codes)) if (scriptSetupRanges.propsTypeArg && scriptSetupRanges.withDefaultsArg) { // fix https://github.com/vuejs/language-tools/issues/1187 diff --git a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts index 86b15e358d..7ee0808ea8 100644 --- a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts +++ b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts @@ -10,7 +10,8 @@ export function parseScriptSetupRanges( ) { let foundNonImportExportNode = false; - let importSectionEndOffset = 0; + let importSectionEndOffsetWithComment = 0; + let importSectionEndOffsetWithoutComment = 0; let withDefaultsArg: TextRange | undefined; let propsAssignName: string | undefined; let defineProps: TextRange | undefined; @@ -34,7 +35,12 @@ export function parseScriptSetupRanges( }[] = []; const bindings = parseBindingRanges(ts, ast, false); + let lastImportNode: ts.Node | undefined; + ast.forEachChild(node => { + if (ts.isImportDeclaration(node) || (ts.isImportEqualsDeclaration(node) && !!node.moduleReference.getText(ast))) { + lastImportNode = node; + } const isTypeExport = (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword); if ( !foundNonImportExportNode @@ -44,14 +50,16 @@ export function parseScriptSetupRanges( // fix https://github.com/vuejs/language-tools/issues/1223 && !ts.isImportEqualsDeclaration(node) ) { - importSectionEndOffset = node.getStart(ast, true); + importSectionEndOffsetWithComment = node.getStart(ast, true); + importSectionEndOffsetWithoutComment = lastImportNode?.getEnd() ?? 0; foundNonImportExportNode = true; } }); ast.forEachChild(child => visitNode(child, ast)); return { - importSectionEndOffset, + importSectionEndOffsetWithComment, + importSectionEndOffsetWithoutComment, bindings, withDefaultsArg, defineProps, From 47a917e05f58fc124141cda442a86613f4c9780b Mon Sep 17 00:00:00 2001 From: so1ve Date: Wed, 5 Jul 2023 13:22:17 +0800 Subject: [PATCH 5/8] fix --- packages/vue-language-core/src/generators/script.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/vue-language-core/src/generators/script.ts b/packages/vue-language-core/src/generators/script.ts index ae51017fe5..ba04d0f11a 100644 --- a/packages/vue-language-core/src/generators/script.ts +++ b/packages/vue-language-core/src/generators/script.ts @@ -481,12 +481,9 @@ declare function defineProp(value?: T | (() => T), required?: boolean, rest?: `.trim() + '\n'); } - const scriptSetupGeneratedOffset = muggle.getLength(codes) - scriptSetupRanges.importSectionEndOffsetWithComment; - console.log(muggle.toString(codes)) + const scriptSetupGeneratedOffset = muggle.getLength(codes) - scriptSetupRanges.importSectionEndOffsetWithoutComment; - addVirtualCode('scriptSetup', scriptSetupRanges.importSectionEndOffsetWithComment); - - console.log(muggle.toString(codes)) + addVirtualCode('scriptSetup', scriptSetupRanges.importSectionEndOffsetWithoutComment); if (scriptSetupRanges.propsTypeArg && scriptSetupRanges.withDefaultsArg) { // fix https://github.com/vuejs/language-tools/issues/1187 From 0bcbd151751214b8f4180c96c0dbfaffb9978748 Mon Sep 17 00:00:00 2001 From: so1ve Date: Wed, 5 Jul 2023 13:27:41 +0800 Subject: [PATCH 6/8] test: add a case with import --- .../vue-tsc/non-strict-template/#3327/import.vue | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/import.vue diff --git a/packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/import.vue b/packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/import.vue new file mode 100644 index 0000000000..72873e7d15 --- /dev/null +++ b/packages/vue-test-workspace/vue-tsc/non-strict-template/#3327/import.vue @@ -0,0 +1,11 @@ + + + \ No newline at end of file From 0b74569b9205ba9fa7183299210e161857a7b016 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 13 Jul 2023 10:43:13 +0800 Subject: [PATCH 7/8] remove lastImportNode --- .../vue-language-core/src/parsers/scriptSetupRanges.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts index 7ee0808ea8..da8d02ce18 100644 --- a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts +++ b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts @@ -35,12 +35,7 @@ export function parseScriptSetupRanges( }[] = []; const bindings = parseBindingRanges(ts, ast, false); - let lastImportNode: ts.Node | undefined; - ast.forEachChild(node => { - if (ts.isImportDeclaration(node) || (ts.isImportEqualsDeclaration(node) && !!node.moduleReference.getText(ast))) { - lastImportNode = node; - } const isTypeExport = (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword); if ( !foundNonImportExportNode @@ -51,7 +46,7 @@ export function parseScriptSetupRanges( && !ts.isImportEqualsDeclaration(node) ) { importSectionEndOffsetWithComment = node.getStart(ast, true); - importSectionEndOffsetWithoutComment = lastImportNode?.getEnd() ?? 0; + importSectionEndOffsetWithoutComment = node.getFullStart(); foundNonImportExportNode = true; } }); From 06c64323137170ddfe34f8e0aa2f357a15045801 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 13 Jul 2023 10:58:33 +0800 Subject: [PATCH 8/8] use getLeadingCommentRanges --- .../vue-language-core/src/generators/script.ts | 9 ++++----- .../src/parsers/scriptSetupRanges.ts | 16 ++++++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/vue-language-core/src/generators/script.ts b/packages/vue-language-core/src/generators/script.ts index 4ce7cecc6b..70cb65cdb1 100644 --- a/packages/vue-language-core/src/generators/script.ts +++ b/packages/vue-language-core/src/generators/script.ts @@ -56,8 +56,7 @@ export function generate( emitsTypeArg: undefined, emitsTypeNums: 0, exposeRuntimeArg: undefined, - importSectionEndOffsetWithComment: 0, - importSectionEndOffsetWithoutComment: 0, + importSectionEndOffset: 0, defineProps: undefined, propsAssignName: undefined, propsRuntimeArg: undefined, @@ -268,7 +267,7 @@ export function generate( return; codes.push([ - sfc.scriptSetup.content.substring(0, scriptSetupRanges.importSectionEndOffsetWithComment), + sfc.scriptSetup.content.substring(0, scriptSetupRanges.importSectionEndOffset), 'scriptSetup', 0, FileRangeCapabilities.full, @@ -481,9 +480,9 @@ declare function defineProp(value?: T | (() => T), required?: boolean, rest?: `.trim() + '\n'); } - const scriptSetupGeneratedOffset = muggle.getLength(codes) - scriptSetupRanges.importSectionEndOffsetWithoutComment; + const scriptSetupGeneratedOffset = muggle.getLength(codes) - scriptSetupRanges.importSectionEndOffset; - addVirtualCode('scriptSetup', scriptSetupRanges.importSectionEndOffsetWithoutComment); + addVirtualCode('scriptSetup', scriptSetupRanges.importSectionEndOffset); if (scriptSetupRanges.propsTypeArg && scriptSetupRanges.withDefaultsArg) { // fix https://github.com/vuejs/language-tools/issues/1187 diff --git a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts index da8d02ce18..053422477e 100644 --- a/packages/vue-language-core/src/parsers/scriptSetupRanges.ts +++ b/packages/vue-language-core/src/parsers/scriptSetupRanges.ts @@ -10,8 +10,7 @@ export function parseScriptSetupRanges( ) { let foundNonImportExportNode = false; - let importSectionEndOffsetWithComment = 0; - let importSectionEndOffsetWithoutComment = 0; + let importSectionEndOffset = 0; let withDefaultsArg: TextRange | undefined; let propsAssignName: string | undefined; let defineProps: TextRange | undefined; @@ -45,16 +44,21 @@ export function parseScriptSetupRanges( // fix https://github.com/vuejs/language-tools/issues/1223 && !ts.isImportEqualsDeclaration(node) ) { - importSectionEndOffsetWithComment = node.getStart(ast, true); - importSectionEndOffsetWithoutComment = node.getFullStart(); + const commentRagnes = ts.getLeadingCommentRanges(ast.getFullText(), node.getFullStart()); + if (commentRagnes?.length) { + const commentRange = commentRagnes.sort((a, b) => a.pos - b.pos)[0]; + importSectionEndOffset = commentRange.pos; + } + else { + importSectionEndOffset = node.getStart(ast); + } foundNonImportExportNode = true; } }); ast.forEachChild(child => visitNode(child, ast)); return { - importSectionEndOffsetWithComment, - importSectionEndOffsetWithoutComment, + importSectionEndOffset, bindings, withDefaultsArg, defineProps,