Skip to content

Commit d7c8f2f

Browse files
authored
feat(language-core): support defineOptions (#4362)
1 parent dd6c13e commit d7c8f2f

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ function* generateConstNameOption(options: ScriptCodegenOptions): Generator<Code
6666
yield endOfLine;
6767
}
6868
else if (options.sfc.scriptSetup) {
69-
yield `let __VLS_name!: '${options.fileBaseName.substring(0, options.fileBaseName.lastIndexOf('.'))}'${endOfLine}`;
69+
yield `let __VLS_name!: '${options.scriptSetupRanges?.options.name ?? options.fileBaseName.substring(0, options.fileBaseName.lastIndexOf('.'))}'${endOfLine}`;
7070
}
7171
else {
7272
yield `const __VLS_name = undefined${endOfLine}`;

packages/language-core/lib/parsers/scriptSetupRanges.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ export function parseScriptSetupRanges(
3434
name?: string;
3535
define?: ReturnType<typeof parseDefineFunction>;
3636
} = {};
37+
const options: {
38+
name?: string;
39+
} = {};
3740

3841
const definePropProposalA = vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition');
3942
const definePropProposalB = vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition');
@@ -95,6 +98,7 @@ export function parseScriptSetupRanges(
9598
emits,
9699
expose,
97100
defineProp,
101+
options,
98102
};
99103

100104
function _getStartEnd(node: ts.Node) {
@@ -259,6 +263,15 @@ export function parseScriptSetupRanges(
259263
props.name = getNodeText(ts, parent.name, ast);
260264
}
261265
}
266+
else if (vueCompilerOptions.macros.defineOptions.includes(callText)) {
267+
if (node.arguments.length && ts.isObjectLiteralExpression(node.arguments[0])) {
268+
for (const prop of node.arguments[0].properties) {
269+
if ((ts.isPropertyAssignment(prop)) && getNodeText(ts, prop.name, ast) === 'name' && ts.isStringLiteral(prop.initializer)) {
270+
options.name = prop.initializer.text;
271+
}
272+
}
273+
}
274+
}
262275
}
263276
ts.forEachChild(node, child => {
264277
parents.push(node);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script setup lang="tsx">
2+
import { exactType } from 'tsc/shared';
3+
4+
defineOptions({
5+
name: 'Foo',
6+
});
7+
8+
defineSlots<{
9+
default: (props: { foo: 0 }) => any
10+
}>();
11+
</script>
12+
13+
<template>
14+
<Foo v-slot="{ foo }">
15+
{{ exactType(foo, 0) }}
16+
</Foo>
17+
</template>

0 commit comments

Comments
 (0)