Skip to content

Commit 5f2d2db

Browse files
authored
fix(typescript-plugin): only forward quick info and suggestion diagnostics for setup bindings (#5892)
1 parent b7244e1 commit 5f2d2db

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

packages/typescript-plugin/lib/common.ts

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ import {
55
toSourceRanges,
66
} from '@volar/typescript/lib/node/transform';
77
import { getServiceScript } from '@volar/typescript/lib/node/utils';
8-
import { type Language, type VueCodeInformation, type VueCompilerOptions, VueVirtualCode } from '@vue/language-core';
8+
import {
9+
type Language,
10+
tsCodegen,
11+
type VueCodeInformation,
12+
type VueCompilerOptions,
13+
VueVirtualCode,
14+
} from '@vue/language-core';
915
import { capitalize, isGloballyAllowed } from '@vue/shared';
1016
import type * as ts from 'typescript';
1117

@@ -31,31 +37,42 @@ export function preprocessLanguageService(
3137
if (!language) {
3238
return result;
3339
}
34-
const [serviceScript, _targetScript, sourceScript] = getServiceScript(language, fileName);
40+
const [serviceScript, , sourceScript] = getServiceScript(language, fileName);
3541
if (!serviceScript || !(sourceScript?.generated?.root instanceof VueVirtualCode)) {
3642
return result;
3743
}
44+
const codegen = tsCodegen.get(sourceScript.generated.root.sfc);
45+
const leadingOffset = sourceScript.snapshot.getLength();
3846
for (
39-
const sourceOffset of toSourceOffsets(
47+
const sourceRange of toSourceRanges(
4048
sourceScript,
4149
language,
4250
serviceScript,
43-
position,
51+
result.textSpan.start,
52+
result.textSpan.start + result.textSpan.length,
53+
true,
4454
() => true,
4555
)
4656
) {
47-
const generatedOffset2 = toGeneratedOffset(
57+
const generateRange2 = toGeneratedRange(
4858
language,
4959
serviceScript,
5060
sourceScript,
51-
sourceOffset[1],
61+
sourceRange[1],
62+
sourceRange[2],
5263
(data: VueCodeInformation) => !!data.__importCompletion,
5364
);
54-
if (generatedOffset2 !== undefined) {
55-
const extraInfo = getQuickInfoAtPosition(fileName, generatedOffset2, ...rests);
56-
if (extraInfo) {
57-
result.tags ??= [];
58-
result.tags.push(...extraInfo.tags ?? []);
65+
if (generateRange2 !== undefined) {
66+
const variableName = serviceScript.code.snapshot.getText(
67+
generateRange2[0] - leadingOffset,
68+
generateRange2[1] - leadingOffset,
69+
);
70+
if (codegen?.getSetupExposed().has(variableName)) {
71+
const extraInfo = getQuickInfoAtPosition(fileName, generateRange2[0], ...rests);
72+
if (extraInfo) {
73+
result.tags ??= [];
74+
result.tags.push(...extraInfo.tags ?? []);
75+
}
5976
}
6077
}
6178
}
@@ -67,10 +84,12 @@ export function preprocessLanguageService(
6784
if (!language) {
6885
return result;
6986
}
70-
const [serviceScript, _targetScript, sourceScript] = getServiceScript(language, fileName);
87+
const [serviceScript, , sourceScript] = getServiceScript(language, fileName);
7188
if (!serviceScript || !(sourceScript?.generated?.root instanceof VueVirtualCode)) {
7289
return result;
7390
}
91+
const codegen = tsCodegen.get(sourceScript.generated.root.sfc);
92+
const leadingOffset = sourceScript.snapshot.getLength();
7493
for (const diagnostic of result) {
7594
for (
7695
const sourceRange of toSourceRanges(
@@ -92,9 +111,15 @@ export function preprocessLanguageService(
92111
(data: VueCodeInformation) => !data.__importCompletion,
93112
);
94113
if (generateRange2 !== undefined) {
95-
diagnostic.start = generateRange2[0];
96-
diagnostic.length = generateRange2[1] - generateRange2[0];
97-
break;
114+
const variableName = serviceScript.code.snapshot.getText(
115+
generateRange2[0] - leadingOffset,
116+
generateRange2[1] - leadingOffset,
117+
);
118+
if (codegen?.getSetupExposed().has(variableName)) {
119+
diagnostic.start = generateRange2[0];
120+
diagnostic.length = generateRange2[1] - generateRange2[0];
121+
break;
122+
}
98123
}
99124
}
100125
}

0 commit comments

Comments
 (0)