Skip to content

Commit b9ea136

Browse files
committed
wip
1 parent 125cc3e commit b9ea136

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

packages/typescript-plugin/index.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { transformFileTextChanges } from '@volar/typescript/lib/node/transform.js';
1+
import { toGeneratedRange, toSourceRanges, transformFileTextChanges } from '@volar/typescript/lib/node/transform.js';
2+
import { getServiceScript } from '@volar/typescript/lib/node/utils.js';
23
import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin';
34
import * as core from '@vue/language-core';
45
import type * as ts from 'typescript';
@@ -20,6 +21,42 @@ const projectToOriginalLanguageService = new WeakMap<ts.server.Project, ts.Langu
2021

2122
export = createLanguageServicePlugin(
2223
(ts, info) => {
24+
let _language: core.Language<string> | undefined;
25+
const { getCodeFixesAtPosition } = info.languageService;
26+
info.languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
27+
let fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
28+
if (_language) {
29+
const [serviceScript, targetScript, sourceScript] = getServiceScript(_language, fileName);
30+
if (serviceScript && sourceScript?.generated?.root instanceof core.VueVirtualCode) {
31+
for (
32+
const sourceRange of toSourceRanges(sourceScript, _language, serviceScript, start, end, true, () => true)
33+
) {
34+
const generateRange2 = toGeneratedRange(
35+
_language,
36+
serviceScript,
37+
sourceScript,
38+
sourceRange[1],
39+
sourceRange[2],
40+
(data: core.VueCodeInformation) => typeof data.completion === 'object' && !!data.completion.isAdditional,
41+
);
42+
if (generateRange2 !== undefined) {
43+
let importFixes = getCodeFixesAtPosition(
44+
targetScript.id,
45+
generateRange2[0],
46+
generateRange2[1],
47+
[2304], // Cannot find name 'xxx'.ts(2304)
48+
formatOptions,
49+
preferences,
50+
);
51+
importFixes = importFixes.filter(fix => fix.fixName === 'import');
52+
fixes = fixes.concat(importFixes);
53+
}
54+
}
55+
}
56+
}
57+
return fixes;
58+
};
59+
2360
projectToOriginalLanguageService.set(info.project, info.languageService);
2461

2562
const vueOptions = getVueCompilerOptions();
@@ -35,6 +72,7 @@ export = createLanguageServicePlugin(
3572
return {
3673
languagePlugins: [languagePlugin],
3774
setup: language => {
75+
_language = language;
3876
info.languageService = createVueLanguageServiceProxy(
3977
ts,
4078
language,

0 commit comments

Comments
 (0)