Skip to content

Commit 732cb86

Browse files
feat(typescript-plugin): mapping JSDoc informations from <script setup> (#5805)
1 parent f4a9c50 commit 732cb86

File tree

1 file changed

+77
-1
lines changed

1 file changed

+77
-1
lines changed

packages/typescript-plugin/lib/common.ts

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,84 @@ export function preprocessLanguageService(
1515
languageService: ts.LanguageService,
1616
getLanguage: () => Language<any> | undefined,
1717
) {
18-
const { getCompletionsAtPosition, getCodeFixesAtPosition } = languageService;
18+
const {
19+
getQuickInfoAtPosition,
20+
getSuggestionDiagnostics,
21+
getCompletionsAtPosition,
22+
getCodeFixesAtPosition,
23+
} = languageService;
1924

25+
languageService.getQuickInfoAtPosition = (fileName, position, maximumLength) => {
26+
let result = getQuickInfoAtPosition(fileName, position, maximumLength);
27+
const language = getLanguage();
28+
if (result && language) {
29+
const [serviceScript, targetScript, sourceScript] = getServiceScript(language, fileName);
30+
if (serviceScript && sourceScript?.generated?.root instanceof VueVirtualCode) {
31+
for (
32+
const sourceOffset of toSourceOffsets(
33+
sourceScript,
34+
language,
35+
serviceScript,
36+
position,
37+
() => true,
38+
)
39+
) {
40+
const generatedOffset2 = toGeneratedOffset(
41+
language,
42+
serviceScript,
43+
sourceScript,
44+
sourceOffset[1],
45+
(data: VueCodeInformation) => !!data.__importCompletion,
46+
);
47+
if (generatedOffset2 !== undefined) {
48+
const extraInfo = getQuickInfoAtPosition(targetScript.id, generatedOffset2, maximumLength);
49+
if (extraInfo) {
50+
result.tags ??= [];
51+
result.tags.push(...extraInfo.tags ?? []);
52+
}
53+
}
54+
}
55+
}
56+
}
57+
return result;
58+
};
59+
languageService.getSuggestionDiagnostics = fileName => {
60+
const diagnostics = getSuggestionDiagnostics(fileName);
61+
const language = getLanguage();
62+
if (language) {
63+
const [serviceScript, _targetScript, sourceScript] = getServiceScript(language, fileName);
64+
if (serviceScript && sourceScript?.generated?.root instanceof VueVirtualCode) {
65+
for (const diagnostic of diagnostics) {
66+
for (
67+
const sourceRange of toSourceRanges(
68+
sourceScript,
69+
language,
70+
serviceScript,
71+
diagnostic.start,
72+
diagnostic.start + diagnostic.length,
73+
true,
74+
(data: VueCodeInformation) => !!data.__importCompletion,
75+
)
76+
) {
77+
const generateRange2 = toGeneratedRange(
78+
language,
79+
serviceScript,
80+
sourceScript,
81+
sourceRange[1],
82+
sourceRange[2],
83+
(data: VueCodeInformation) => !data.__importCompletion,
84+
);
85+
if (generateRange2 !== undefined) {
86+
diagnostic.start = generateRange2[0];
87+
diagnostic.length = generateRange2[1] - generateRange2[0];
88+
break;
89+
}
90+
}
91+
}
92+
}
93+
}
94+
return diagnostics;
95+
};
2096
languageService.getCompletionsAtPosition = (fileName, position, preferences, formatOptions) => {
2197
let result = getCompletionsAtPosition(fileName, position, preferences, formatOptions);
2298
const language = getLanguage();

0 commit comments

Comments
 (0)