Skip to content

Commit ae25b12

Browse files
fix(language-core): inject generics of useTemplateRef into correct location (#4829)
Co-authored-by: Johnson Chu <[email protected]>
1 parent 8d08da8 commit ae25b12

File tree

5 files changed

+29
-16
lines changed

5 files changed

+29
-16
lines changed

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ function* generateSetupFunction(
193193
}
194194
}
195195
if (scriptSetupRanges.cssModules.length) {
196-
for (const { exp, arg } of scriptSetupRanges.cssModules) {
196+
for (const { define: { arg, exp } } of scriptSetupRanges.cssModules) {
197197
setupCodeModifies.push([
198198
arg ? [
199199
` as Omit<__VLS_StyleModules, '$style'>[`,
@@ -219,8 +219,8 @@ function* generateSetupFunction(
219219
generateSfcBlockSection(scriptSetup, define.arg.start, define.arg.end, codeFeatures.navigation),
220220
`], keyof __VLS_TemplateResult['refs']>`
221221
],
222-
define.arg.start - 1,
223-
define.arg.start - 1
222+
define.exp.end,
223+
define.exp.end
224224
]);
225225
}
226226
}
@@ -273,8 +273,8 @@ function* generateDefineWithType(
273273
scriptSetup: NonNullable<Sfc['scriptSetup']>,
274274
name: string | undefined,
275275
define: {
276-
statement: TextRange,
277-
typeArg?: TextRange
276+
statement: TextRange;
277+
typeArg?: TextRange;
278278
},
279279
expression: TextRange,
280280
defaultName: string,

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

+8-11
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,11 @@ export function parseScriptSetupRanges(
4545
inheritAttrs?: string;
4646
} = {};
4747
const cssModules: {
48-
exp: TextRange;
49-
arg?: TextRange;
48+
define: ReturnType<typeof parseDefineFunction>;
5049
}[] = [];
5150
const templateRefs: {
5251
name?: string;
53-
define?: ReturnType<typeof parseDefineFunction>;
52+
define: ReturnType<typeof parseDefineFunction>;
5453
}[] = [];
5554
const definePropProposalA = vueCompilerOptions.experimentalDefinePropProposal === 'kevinEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=kevinEdition');
5655
const definePropProposalB = vueCompilerOptions.experimentalDefinePropProposal === 'johnsonEdition' || ast.text.trimStart().startsWith('// @experimentalDefinePropProposal=johnsonEdition');
@@ -130,11 +129,13 @@ export function parseScriptSetupRanges(
130129
}
131130

132131
function parseDefineFunction(node: ts.CallExpression): TextRange & {
132+
exp: TextRange;
133133
arg?: TextRange;
134134
typeArg?: TextRange;
135135
} {
136136
return {
137137
..._getStartEnd(node),
138+
exp: _getStartEnd(node.expression),
138139
arg: node.arguments.length ? _getStartEnd(node.arguments[0]) : undefined,
139140
typeArg: node.typeArguments?.length ? _getStartEnd(node.typeArguments[0]) : undefined,
140141
};
@@ -371,7 +372,6 @@ export function parseScriptSetupRanges(
371372
}
372373
} else if (vueCompilerOptions.composibles.useTemplateRef.includes(callText) && node.arguments.length && !node.typeArguments?.length) {
373374
const define = parseDefineFunction(node);
374-
define.arg = _getStartEnd(node.arguments[0]);
375375
let name;
376376
if (ts.isVariableDeclaration(parent)) {
377377
name = getNodeText(ts, parent.name, ast);
@@ -382,13 +382,10 @@ export function parseScriptSetupRanges(
382382
});
383383
}
384384
else if (vueCompilerOptions.composibles.useCssModule.includes(callText)) {
385-
const module: (typeof cssModules)[number] = {
386-
exp: _getStartEnd(node)
387-
};
388-
if (node.arguments.length) {
389-
module.arg = _getStartEnd(node.arguments[0]);
390-
}
391-
cssModules.push(module);
385+
const define = parseDefineFunction(node);
386+
cssModules.push({
387+
define
388+
});
392389
}
393390
}
394391
ts.forEachChild(node, child => {

test-workspace/tsc/passedFixtures/vue2/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"../vue3/#4777",
2828
"../vue3/#4820",
2929
"../vue3/#4822",
30+
"../vue3/#4828",
3031
"../vue3/components",
3132
"../vue3/defineEmits",
3233
"../vue3/defineModel",

test-workspace/tsc/passedFixtures/vue3.4/tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"../vue3/#3820",
1313
"../vue3/#4777",
1414
"../vue3/#4820",
15+
"../vue3/#4828",
1516
"../vue3/rootEl",
1617
"../vue3/templateRef",
1718
"../vue3/templateRef_native",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script setup lang="ts">
2+
import { exactType } from '../../shared';
3+
import { useTemplateRef } from 'vue';
4+
5+
const ref1 = useTemplateRef('input');
6+
const ref2 = useTemplateRef( 'input');
7+
8+
exactType(ref1.value!, {} as HTMLInputElement);
9+
exactType(ref2.value!, {} as HTMLInputElement);
10+
</script>
11+
12+
<template>
13+
<input ref="input">
14+
</template>

0 commit comments

Comments
 (0)