Skip to content

Commit 4fff892

Browse files
authored
fix(language-core): generate macros after script setup content (#5071)
1 parent 3216627 commit 4fff892

File tree

7 files changed

+56
-34
lines changed

7 files changed

+56
-34
lines changed

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

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ export function* generateScript(options: ScriptCodegenOptions): Generator<Code,
8484
&& options.sfc.script.content[exportDefault.expression.start] === '{';
8585
if (options.sfc.scriptSetup && options.scriptSetupRanges) {
8686
yield* generateScriptSetupImports(options.sfc.scriptSetup, options.scriptSetupRanges);
87-
yield* generateDefineProp(options, options.sfc.scriptSetup);
8887
if (exportDefault) {
8988
yield generateSfcBlockSection(options.sfc.script, 0, exportDefault.expression.start, codeFeatures.all);
9089
yield* generateScriptSetup(options, ctx, options.sfc.scriptSetup, options.scriptSetupRanges);
@@ -141,7 +140,6 @@ export function* generateScript(options: ScriptCodegenOptions): Generator<Code,
141140
}
142141
else if (options.sfc.scriptSetup && options.scriptSetupRanges) {
143142
yield* generateScriptSetupImports(options.sfc.scriptSetup, options.scriptSetupRanges);
144-
yield* generateDefineProp(options, options.sfc.scriptSetup);
145143
yield* generateScriptSetup(options, ctx, options.sfc.scriptSetup, options.scriptSetupRanges);
146144
}
147145

@@ -182,24 +180,3 @@ export function* generateScriptSectionPartiallyEnding(source: string, end: numbe
182180
yield ['', source, end, codeFeatures.verification];
183181
yield `/* PartiallyEnd: ${mark} */${newLine}`;
184182
}
185-
186-
function* generateDefineProp(
187-
options: ScriptCodegenOptions,
188-
scriptSetup: NonNullable<Sfc['scriptSetup']>
189-
): Generator<Code> {
190-
const definePropProposalA = scriptSetup.content.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition') || options.vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition';
191-
const definePropProposalB = scriptSetup.content.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition') || options.vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition';
192-
193-
if (definePropProposalA || definePropProposalB) {
194-
yield `type __VLS_PropOptions<T> = Exclude<import('${options.vueCompilerOptions.lib}').Prop<T>, import('${options.vueCompilerOptions.lib}').PropType<T>>${endOfLine}`;
195-
if (definePropProposalA) {
196-
yield `declare function defineProp<T>(name: string, options: ({ required: true } | { default: T }) & __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T>${endOfLine}`;
197-
yield `declare function defineProp<T>(name?: string, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T | undefined>${endOfLine}`;
198-
}
199-
if (definePropProposalB) {
200-
yield `declare function defineProp<T>(value: T | (() => T), required?: boolean, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T>${endOfLine}`;
201-
yield `declare function defineProp<T>(value: T | (() => T) | undefined, required: true, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T>${endOfLine}`;
202-
yield `declare function defineProp<T>(value?: T | (() => T), required?: boolean, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T | undefined>${endOfLine}`;
203-
}
204-
}
205-
}

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

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ export function* generateScriptSetupImports(
1717
0,
1818
codeFeatures.all,
1919
];
20-
yield newLine;
2120
}
2221

2322
export function* generateScriptSetup(
@@ -96,16 +95,6 @@ function* generateSetupFunction(
9695
scriptSetupRanges: ScriptSetupRanges,
9796
syntax: 'return' | 'export default' | undefined
9897
): Generator<Code> {
99-
if (options.vueCompilerOptions.target >= 3.3) {
100-
yield `const { `;
101-
for (const macro of Object.keys(options.vueCompilerOptions.macros)) {
102-
if (!ctx.bindingNames.has(macro) && macro !== 'templateRef') {
103-
yield macro + `, `;
104-
}
105-
}
106-
yield `} = await import('${options.vueCompilerOptions.lib}')${endOfLine}`;
107-
}
108-
10998
ctx.scriptSetupGeneratedOffset = options.getGeneratedLength() - scriptSetupRanges.importSectionEndOffset;
11099

111100
let setupCodeModifies: [Code[], number, number][] = [];
@@ -280,6 +269,8 @@ function* generateSetupFunction(
280269
yield generateSfcBlockSection(scriptSetup, nextStart, scriptSetup.content.length, codeFeatures.all);
281270

282271
yield* generateScriptSectionPartiallyEnding(scriptSetup.name, scriptSetup.content.length, '#3632/scriptSetup.vue');
272+
yield* generateMacros(options, ctx);
273+
yield* generateDefineProp(options, scriptSetup);
283274

284275
if (scriptSetupRanges.defineProps?.typeArg && scriptSetupRanges.withDefaults?.arg) {
285276
// fix https://github.com/vuejs/language-tools/issues/1187
@@ -317,6 +308,42 @@ function* generateSetupFunction(
317308
}
318309
}
319310

311+
function* generateMacros(
312+
options: ScriptCodegenOptions,
313+
ctx: ScriptCodegenContext
314+
): Generator<Code> {
315+
if (options.vueCompilerOptions.target >= 3.3) {
316+
yield `declare const { `;
317+
for (const macro of Object.keys(options.vueCompilerOptions.macros)) {
318+
if (!ctx.bindingNames.has(macro)) {
319+
yield `${macro}, `;
320+
}
321+
}
322+
yield `}: typeof import('${options.vueCompilerOptions.lib}')${endOfLine}`;
323+
}
324+
}
325+
326+
function* generateDefineProp(
327+
options: ScriptCodegenOptions,
328+
scriptSetup: NonNullable<Sfc['scriptSetup']>
329+
): Generator<Code> {
330+
const definePropProposalA = scriptSetup.content.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition') || options.vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition';
331+
const definePropProposalB = scriptSetup.content.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition') || options.vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition';
332+
333+
if (definePropProposalA || definePropProposalB) {
334+
yield `type __VLS_PropOptions<T> = Exclude<import('${options.vueCompilerOptions.lib}').Prop<T>, import('${options.vueCompilerOptions.lib}').PropType<T>>${endOfLine}`;
335+
if (definePropProposalA) {
336+
yield `declare function defineProp<T>(name: string, options: ({ required: true } | { default: T }) & __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T>${endOfLine}`;
337+
yield `declare function defineProp<T>(name?: string, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T | undefined>${endOfLine}`;
338+
}
339+
if (definePropProposalB) {
340+
yield `declare function defineProp<T>(value: T | (() => T), required?: boolean, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T>${endOfLine}`;
341+
yield `declare function defineProp<T>(value: T | (() => T) | undefined, required: true, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T>${endOfLine}`;
342+
yield `declare function defineProp<T>(value?: T | (() => T), required?: boolean, options?: __VLS_PropOptions<T>): import('${options.vueCompilerOptions.lib}').ComputedRef<T | undefined>${endOfLine}`;
343+
}
344+
}
345+
}
346+
320347
function* generateDefineWithType(
321348
scriptSetup: NonNullable<Sfc['scriptSetup']>,
322349
statement: TextRange,

packages/tsc/tests/typecheck.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ describe(`vue-tsc`, () => {
1313
"test-workspace/tsc/failureFixtures/#3632/both.vue(7,1): error TS1109: Expression expected.",
1414
"test-workspace/tsc/failureFixtures/#3632/script.vue(3,1): error TS1109: Expression expected.",
1515
"test-workspace/tsc/failureFixtures/#3632/scriptSetup.vue(3,1): error TS1109: Expression expected.",
16+
"test-workspace/tsc/failureFixtures/#5071/withoutScript.vue(2,26): error TS1005: ';' expected.",
17+
"test-workspace/tsc/failureFixtures/#5071/withScript.vue(1,19): error TS1005: ';' expected.",
1618
"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 ..., {}>'.",
1719
"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 ..., {}>'.",
1820
"test-workspace/tsc/failureFixtures/directives/main.vue(12,2): error TS2578: Unused '@ts-expect-error' directive.",
@@ -32,6 +34,8 @@ describe(`vue-tsc`, () => {
3234
"test-workspace/tsc/failureFixtures/#3632/both.vue(7,1): error TS1109: Expression expected.",
3335
"test-workspace/tsc/failureFixtures/#3632/script.vue(3,1): error TS1109: Expression expected.",
3436
"test-workspace/tsc/failureFixtures/#3632/scriptSetup.vue(3,1): error TS1109: Expression expected.",
37+
"test-workspace/tsc/failureFixtures/#5071/withoutScript.vue(2,26): error TS1005: ';' expected.",
38+
"test-workspace/tsc/failureFixtures/#5071/withScript.vue(1,19): error TS1005: ';' expected.",
3539
"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 ..., {}>'.",
3640
"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 ..., {}>'.",
3741
"test-workspace/tsc/failureFixtures/directives/main.vue(12,2): error TS2578: Unused '@ts-expect-error' directive.",
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+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<script lang="ts">export default {};
2+
</script>
3+
4+
<script setup lang="ts">
5+
import { ref } from 'vue'ref('');
6+
</script>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<script setup lang="ts">
2+
import { ref } from 'vue'ref('');
3+
</script>

test-workspace/tsc/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"references": [
44
{ "path": "./failureFixtures/#3632" },
55
// { "path": "./failureFixtures/#4569" }, // TODO: not working with --build flag
6+
{ "path": "./failureFixtures/#5071" },
67
{ "path": "./failureFixtures/directives" },
78

89
{ "path": "./passedFixtures/#1886" },

0 commit comments

Comments
 (0)