Skip to content

Commit acddb02

Browse files
fix(language-core): should error when invalid syntax at script end (#4692)
Co-authored-by: Johnson Chu <[email protected]>
1 parent 32aa8a8 commit acddb02

File tree

8 files changed

+42
-7
lines changed

8 files changed

+42
-7
lines changed

packages/language-core/lib/codegen/script/index.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import type { Code, Sfc, VueCodeInformation, VueCompilerOptions } from '../../ty
66
import { endOfLine, generateSfcBlockSection, newLine } from '../common';
77
import { generateGlobalTypes } from '../globalTypes';
88
import type { TemplateCodegenContext } from '../template/context';
9-
import { createScriptCodegenContext, ScriptCodegenContext } from './context';
109
import { generateComponentSelf } from './componentSelf';
10+
import { createScriptCodegenContext, ScriptCodegenContext } from './context';
1111
import { generateScriptSetup, generateScriptSetupImports } from './scriptSetup';
1212
import { generateSrc } from './src';
1313
import { generateStyleModulesType } from './styleModulesType';
@@ -79,6 +79,7 @@ export function* generateScript(options: ScriptCodegenOptions): Generator<Code,
7979
}
8080
else {
8181
yield generateSfcBlockSection(options.sfc.script, 0, options.sfc.script.content.length, codeFeatures.all);
82+
yield* generateScriptSectionPartiallyEnding(options.sfc.script.name, options.sfc.script.content.length, '#3632/both.vue');
8283
yield* generateScriptSetup(options, ctx, options.sfc.scriptSetup, options.scriptSetupRanges);
8384
}
8485
}
@@ -131,12 +132,12 @@ export function* generateScript(options: ScriptCodegenOptions): Generator<Code,
131132
yield* generateScriptSetup(options, ctx, options.sfc.scriptSetup, options.scriptSetupRanges);
132133
}
133134

134-
yield `;`;
135+
if (options.sfc.script) {
136+
yield* generateScriptSectionPartiallyEnding(options.sfc.script.name, options.sfc.script.content.length, '#3632/script.vue');
137+
}
135138
if (options.sfc.scriptSetup) {
136-
// #4569
137-
yield ['', 'scriptSetup', options.sfc.scriptSetup.content.length, codeFeatures.verification];
139+
yield* generateScriptSectionPartiallyEnding(options.sfc.scriptSetup.name, options.sfc.scriptSetup.content.length, '#4569/main.vue');
138140
}
139-
yield newLine;
140141

141142
if (!ctx.generatedTemplate) {
142143
yield `function __VLS_template() {${newLine}`;
@@ -163,6 +164,12 @@ export function* generateScript(options: ScriptCodegenOptions): Generator<Code,
163164
return ctx;
164165
}
165166

167+
export function* generateScriptSectionPartiallyEnding(source: string, end: number, mark: string): Generator<Code> {
168+
yield `;`;
169+
yield ['', source, end, codeFeatures.verification];
170+
yield `/* PartiallyEnd: ${mark} */${newLine}`;
171+
}
172+
166173
function* generateDefineProp(
167174
options: ScriptCodegenOptions,
168175
scriptSetup: NonNullable<Sfc['scriptSetup']>

packages/language-core/lib/codegen/script/scriptSetup.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import type { ScriptSetupRanges } from '../../parsers/scriptSetupRanges';
22
import type { Code, Sfc, TextRange } from '../../types';
33
import { endOfLine, generateSfcBlockSection, newLine } from '../common';
44
import { generateComponent, generateEmitsOption } from './component';
5-
import type { ScriptCodegenContext } from './context';
6-
import { ScriptCodegenOptions, codeFeatures } from './index';
75
import { generateComponentSelf } from './componentSelf';
6+
import type { ScriptCodegenContext } from './context';
7+
import { ScriptCodegenOptions, codeFeatures, generateScriptSectionPartiallyEnding } from './index';
88
import { generateTemplate } from './template';
99

1010
export function* generateScriptSetupImports(
@@ -278,6 +278,8 @@ function* generateSetupFunction(
278278
yield generateSfcBlockSection(scriptSetup, scriptSetupRanges.importSectionEndOffset, scriptSetup.content.length, codeFeatures.all);
279279
}
280280

281+
yield* generateScriptSectionPartiallyEnding(scriptSetup.name, scriptSetup.content.length, '#3632/scriptSetup.vue');
282+
281283
if (scriptSetupRanges.props.define?.typeArg && scriptSetupRanges.props.withDefaults?.arg) {
282284
// fix https://github.com/vuejs/language-tools/issues/1187
283285
yield `const __VLS_withDefaultsArg = (function <T>(t: T) { return t })(`;

packages/tsc/tests/typecheck.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ describe(`vue-tsc`, () => {
99
getTscOutput('stable')
1010
).toMatchInlineSnapshot(`
1111
[
12+
"test-workspace/tsc/failureFixtures/#3632/both.vue(3,1): error TS1109: Expression expected.",
13+
"test-workspace/tsc/failureFixtures/#3632/both.vue(7,1): error TS1109: Expression expected.",
14+
"test-workspace/tsc/failureFixtures/#3632/script.vue(3,1): error TS1109: Expression expected.",
15+
"test-workspace/tsc/failureFixtures/#3632/scriptSetup.vue(3,1): error TS1109: Expression expected.",
1216
"test-workspace/tsc/failureFixtures/directives/main.vue(4,6): error TS2339: Property 'notExist' does not exist on type 'CreateComponentPublicInstanceWithMixins<ToResolvedProps<{}, {}>, { exist: typeof exist; }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 18 more ..., {}>'.",
1317
"test-workspace/tsc/failureFixtures/directives/main.vue(9,6): error TS2339: Property 'notExist' does not exist on type 'CreateComponentPublicInstanceWithMixins<ToResolvedProps<{}, {}>, { exist: typeof exist; }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 18 more ..., {}>'.",
1418
"test-workspace/tsc/failureFixtures/directives/main.vue(12,2): error TS2578: Unused '@ts-expect-error' directive.",
@@ -24,6 +28,10 @@ describe(`vue-tsc`, () => {
2428
getTscOutput('next')
2529
).toMatchInlineSnapshot(`
2630
[
31+
"test-workspace/tsc/failureFixtures/#3632/both.vue(3,1): error TS1109: Expression expected.",
32+
"test-workspace/tsc/failureFixtures/#3632/both.vue(7,1): error TS1109: Expression expected.",
33+
"test-workspace/tsc/failureFixtures/#3632/script.vue(3,1): error TS1109: Expression expected.",
34+
"test-workspace/tsc/failureFixtures/#3632/scriptSetup.vue(3,1): error TS1109: Expression expected.",
2735
"test-workspace/tsc/failureFixtures/directives/main.vue(4,6): error TS2339: Property 'notExist' does not exist on type 'CreateComponentPublicInstanceWithMixins<ToResolvedProps<{}, {}>, { exist: typeof exist; }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 18 more ..., {}>'.",
2836
"test-workspace/tsc/failureFixtures/directives/main.vue(9,6): error TS2339: Property 'notExist' does not exist on type 'CreateComponentPublicInstanceWithMixins<ToResolvedProps<{}, {}>, { exist: typeof exist; }, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ... 18 more ..., {}>'.",
2937
"test-workspace/tsc/failureFixtures/directives/main.vue(12,2): error TS2578: Unused '@ts-expect-error' directive.",
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script lang="ts">
2+
const foo =
3+
</script>
4+
5+
<script lang="ts" setup>
6+
const bar =
7+
</script>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<script lang="ts">
2+
const foo =
3+
</script>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<script lang="ts" setup>
2+
const foo =
3+
</script>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": "../../../tsconfig.base.json",
3+
"include": [ "**/*" ]
4+
}

test-workspace/tsc/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"include": [ ],
33
"references": [
4+
{ "path": "./failureFixtures/#3632" },
45
// { "path": "./failureFixtures/#4569" }, // TODO: not working with --build flag
56
{ "path": "./failureFixtures/directives" },
67

0 commit comments

Comments
 (0)