Skip to content

Commit

Permalink
feat(language-core): support defineOptions (#4362)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhiyuanzmj committed May 10, 2024
1 parent dd6c13e commit d7c8f2f
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 1 deletion.
2 changes: 1 addition & 1 deletion packages/language-core/lib/codegen/script/template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ function* generateConstNameOption(options: ScriptCodegenOptions): Generator<Code
yield endOfLine;
}
else if (options.sfc.scriptSetup) {
yield `let __VLS_name!: '${options.fileBaseName.substring(0, options.fileBaseName.lastIndexOf('.'))}'${endOfLine}`;
yield `let __VLS_name!: '${options.scriptSetupRanges?.options.name ?? options.fileBaseName.substring(0, options.fileBaseName.lastIndexOf('.'))}'${endOfLine}`;
}
else {
yield `const __VLS_name = undefined${endOfLine}`;
Expand Down
13 changes: 13 additions & 0 deletions packages/language-core/lib/parsers/scriptSetupRanges.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ export function parseScriptSetupRanges(
name?: string;
define?: ReturnType<typeof parseDefineFunction>;
} = {};
const options: {
name?: string;
} = {};

const definePropProposalA = vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition');
const definePropProposalB = vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition');
Expand Down Expand Up @@ -95,6 +98,7 @@ export function parseScriptSetupRanges(
emits,
expose,
defineProp,
options,
};

function _getStartEnd(node: ts.Node) {
Expand Down Expand Up @@ -259,6 +263,15 @@ export function parseScriptSetupRanges(
props.name = getNodeText(ts, parent.name, ast);
}
}
else if (vueCompilerOptions.macros.defineOptions.includes(callText)) {
if (node.arguments.length && ts.isObjectLiteralExpression(node.arguments[0])) {
for (const prop of node.arguments[0].properties) {
if ((ts.isPropertyAssignment(prop)) && getNodeText(ts, prop.name, ast) === 'name' && ts.isStringLiteral(prop.initializer)) {
options.name = prop.initializer.text;
}
}
}
}
}
ts.forEachChild(node, child => {
parents.push(node);
Expand Down
17 changes: 17 additions & 0 deletions test-workspace/tsc/vue3/defineOptions/child.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<script setup lang="tsx">
import { exactType } from 'tsc/shared';
defineOptions({
name: 'Foo',
});
defineSlots<{
default: (props: { foo: 0 }) => any
}>();
</script>

<template>
<Foo v-slot="{ foo }">
{{ exactType(foo, 0) }}
</Foo>
</template>

0 comments on commit d7c8f2f

Please sign in to comment.