Skip to content

Commit dcecd3c

Browse files
committed
feat: make defineExpose(...) equivalent to setup() { return ... }
1 parent 8dd5b1c commit dcecd3c

File tree

7 files changed

+26
-20
lines changed

7 files changed

+26
-20
lines changed

packages/vscode-vue-languageservice/src/services/hover.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
import * as vscode from 'vscode-languageserver';
22
import type { ApiLanguageServiceContext } from '../types';
33
import { HtmlSourceMap } from '../utils/sourceMaps';
4-
import { register as registerFindDefinitions } from './definition';
54
import * as shared from '@volar/shared';
65

76
export function register({ sourceFiles, htmlLs, pugLs, getCssLs, getTsLs, vueHost }: ApiLanguageServiceContext) {
87

9-
const findDefinitions = registerFindDefinitions(arguments[0]);
10-
118
return async (uri: string, position: vscode.Position) => {
129

1310
const tsResult = onTs(uri, position);

packages/vscode-vue-languageservice/src/sourceFile.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ export function createSourceFile(
126126
sfcTemplateCompileResult,
127127
computed(() => sfcStyles.textDocuments.value),
128128
context.compilerOptions.experimentalCompatMode === 2,
129-
!!context.compilerOptions.experimentalExposeScriptSetupContext,
130129
);
131130
const sfcScriptForScriptLs = useSfcScriptGen(
132131
'script',
@@ -139,7 +138,6 @@ export function createSourceFile(
139138
sfcTemplateCompileResult,
140139
computed(() => sfcStyles.textDocuments.value),
141140
context.compilerOptions.experimentalCompatMode === 2,
142-
!!context.compilerOptions.experimentalExposeScriptSetupContext,
143141
);
144142
const sfcEntryForTemplateLs = useSfcEntryForTemplateLs(
145143
uri,

packages/vscode-vue-languageservice/src/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ export interface VueCompilerOptions {
6161
experimentalCompatMode?: 2 | 3;
6262
experimentalTemplateCompilerOptions?: CompilerDOM.CompilerOptions;
6363
experimentalTemplateCompilerOptionsRequirePath?: string;
64-
experimentalExposeScriptSetupContext?: boolean;
6564
}
6665

6766
export type LanguageServiceContextBase = {

packages/vscode-vue-languageservice/src/use/useSfcScriptGen.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export function useSfcScriptGen<T extends 'template' | 'script'>(
1919
sfcTemplateCompileResult: ReturnType<(typeof import('./useSfcTemplateCompileResult'))['useSfcTemplateCompileResult']>,
2020
sfcStyles: ReturnType<(typeof import('./useSfcStyles'))['useSfcStyles']>['textDocuments'],
2121
isVue2: boolean,
22-
exposeScriptSetupContext: boolean,
2322
) {
2423

2524
let version = 0;
@@ -34,7 +33,7 @@ export function useSfcScriptGen<T extends 'template' | 'script'>(
3433
lsType,
3534
vueUri,
3635
script.value ?? undefined,
37-
scriptSetup.value ? { content: scriptSetup.value.content, exposeContext: exposeScriptSetupContext } : undefined,
36+
scriptSetup.value ?? undefined,
3837
scriptRanges.value,
3938
scriptSetupRanges.value,
4039
() => htmlGen.value,

packages/vue-code-gen/src/generators/script.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ export function generate(
1616
},
1717
scriptSetup: undefined | {
1818
content: string,
19-
exposeContext: boolean,
2019
},
2120
scriptRanges: ScriptRanges | undefined,
2221
scriptSetupRanges: ScriptSetupRanges | undefined,
@@ -270,17 +269,29 @@ export function generate(
270269
vueTag: 'script',
271270
});
272271
}
272+
273273
codeGen.addText(`setup() {\n`);
274-
if (lsType === 'script' && !scriptSetup.exposeContext) {
275-
codeGen.addText(`return () => {\n`);
274+
275+
if (lsType === 'script') {
276+
codeGen.addText(`() => {\n`);
276277
for (const bindText of getStyleBindTexts()) {
277278
codeGen.addText('// @ts-ignore\n');
278279
codeGen.addText(bindText + ';\n');
279280
}
280281
writeTemplate();
281282
codeGen.addText(`};\n`);
283+
284+
if (scriptSetupRanges.exposeRuntimeArg) {
285+
codeGen.addText(`return `);
286+
mapSubText('scriptSetup', scriptSetupRanges.exposeRuntimeArg.start, scriptSetupRanges.exposeRuntimeArg.end);
287+
codeGen.addText(`;\n`);
288+
}
289+
else {
290+
codeGen.addText(`return { };\n`);
291+
};
282292
}
283-
else {
293+
294+
if (lsType === 'template') {
284295
codeGen.addText(`return {\n`);
285296
for (const { bindings, content } of bindingsArr) {
286297
for (const expose of bindings) {

packages/vue-code-gen/src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ export function generateSFCScriptTypeCheckCode(
1515
scriptLang: 'js' | 'jsx' | 'ts' | 'tsx',
1616
scriptCode: string | undefined,
1717
scriptSetupCode: string | undefined,
18-
exposeScriptSetupContext: boolean,
1918
templateAst?: CompilerDOM.RootNode,
2019
cssVars?: string[],
2120
vueLibName = 'vue',
@@ -25,7 +24,7 @@ export function generateSFCScriptTypeCheckCode(
2524
'script',
2625
'',
2726
scriptCode !== undefined ? { content: scriptCode } : undefined,
28-
scriptSetupCode !== undefined ? { content: scriptSetupCode, exposeContext: exposeScriptSetupContext } : undefined,
27+
scriptSetupCode !== undefined ? { content: scriptSetupCode } : undefined,
2928
scriptCode !== undefined ? parseScriptRanges(
3029
ts,
3130
ts.createSourceFile('dummy.' + scriptLang, scriptCode, ts.ScriptTarget.ESNext),

packages/vue-code-gen/src/parsers/scriptSetupRanges.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,13 @@ export function parseScriptSetupRanges(ts: typeof import('typescript/lib/tsserve
1010
let propsTypeArg: TextRange | undefined;
1111
let emitsRuntimeArg: TextRange | undefined;
1212
let emitsTypeArg: TextRange | undefined;
13+
let exposeRuntimeArg: TextRange | undefined;
1314
let emitsTypeNums = -1;
1415

1516
const bindings = parseBindingRanges(ts, ast, false);
1617
const typeBindings = parseBindingRanges(ts, ast, true);
1718

18-
ast.forEachChild(node => {
19-
visitNode(node);
20-
});
19+
ast.forEachChild(visitNode);
2120

2221
return {
2322
bindings,
@@ -28,6 +27,7 @@ export function parseScriptSetupRanges(ts: typeof import('typescript/lib/tsserve
2827
emitsRuntimeArg,
2928
emitsTypeArg,
3029
emitsTypeNums,
30+
exposeRuntimeArg,
3131
};
3232

3333
function _getStartEnd(node: ts.Node) {
@@ -39,22 +39,25 @@ export function parseScriptSetupRanges(ts: typeof import('typescript/lib/tsserve
3939
&& ts.isIdentifier(node.expression)
4040
) {
4141
const callText = node.expression.getText(ast);
42-
if (callText === 'defineProps' || callText === 'defineEmits') {
42+
if (callText === 'defineProps' || callText === 'defineEmits' || callText === 'defineExpose') {
4343
if (node.arguments.length) {
4444
const runtimeArg = node.arguments[0];
4545
if (callText === 'defineProps') {
4646
propsRuntimeArg = _getStartEnd(runtimeArg);
4747
}
48-
else {
48+
else if (callText === 'defineEmits') {
4949
emitsRuntimeArg = _getStartEnd(runtimeArg);
5050
}
51+
else if (callText === 'defineExpose') {
52+
exposeRuntimeArg = _getStartEnd(runtimeArg);
53+
}
5154
}
5255
else if (node.typeArguments?.length) {
5356
const typeArg = node.typeArguments[0];
5457
if (callText === 'defineProps') {
5558
propsTypeArg = _getStartEnd(typeArg);
5659
}
57-
else {
60+
else if (callText === 'defineEmits') {
5861
emitsTypeArg = _getStartEnd(typeArg);
5962
if (ts.isTypeLiteralNode(typeArg)) {
6063
emitsTypeNums = typeArg.members.length;

0 commit comments

Comments
 (0)