Skip to content

Commit 0016eec

Browse files
committed
wip
1 parent b9ea136 commit 0016eec

File tree

2 files changed

+55
-40
lines changed

2 files changed

+55
-40
lines changed

packages/typescript-plugin/index.ts

Lines changed: 9 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
import { toGeneratedRange, toSourceRanges, transformFileTextChanges } from '@volar/typescript/lib/node/transform.js';
2-
import { getServiceScript } from '@volar/typescript/lib/node/utils.js';
1+
import { transformFileTextChanges } from '@volar/typescript/lib/node/transform.js';
32
import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin';
43
import * as core from '@vue/language-core';
54
import type * as ts from 'typescript';
6-
import { createVueLanguageServiceProxy, resolveCompletionEntryDetails, resolveCompletionResult } from './lib/common';
5+
import {
6+
postprocessLanguageService,
7+
preprocessLanguageService,
8+
resolveCompletionEntryDetails,
9+
resolveCompletionResult,
10+
} from './lib/common';
711
import type { Requests } from './lib/requests';
812
import { collectExtractProps } from './lib/requests/collectExtractProps';
913
import { getComponentDirectives } from './lib/requests/getComponentDirectives';
@@ -22,40 +26,7 @@ const projectToOriginalLanguageService = new WeakMap<ts.server.Project, ts.Langu
2226
export = createLanguageServicePlugin(
2327
(ts, info) => {
2428
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-
};
29+
preprocessLanguageService(info.languageService, () => _language);
5930

6031
projectToOriginalLanguageService.set(info.project, info.languageService);
6132

@@ -73,7 +44,7 @@ export = createLanguageServicePlugin(
7344
languagePlugins: [languagePlugin],
7445
setup: language => {
7546
_language = language;
76-
info.languageService = createVueLanguageServiceProxy(
47+
info.languageService = postprocessLanguageService(
7748
ts,
7849
language,
7950
info.languageService,

packages/typescript-plugin/lib/common.ts

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,54 @@
1-
import { type Language, type VueCompilerOptions, VueVirtualCode } from '@vue/language-core';
1+
import { toGeneratedRange, toSourceRanges } from '@volar/typescript/lib/node/transform';
2+
import { getServiceScript } from '@volar/typescript/lib/node/utils';
3+
import { type Language, type VueCodeInformation, type VueCompilerOptions, VueVirtualCode } from '@vue/language-core';
24
import { capitalize, isGloballyAllowed } from '@vue/shared';
35
import type * as ts from 'typescript';
46

57
const windowsPathReg = /\\/g;
68

7-
export function createVueLanguageServiceProxy<T>(
9+
export function preprocessLanguageService(
10+
languageService: ts.LanguageService,
11+
getLanguage: () => Language<any> | undefined,
12+
) {
13+
const { getCodeFixesAtPosition } = languageService;
14+
15+
languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
16+
let fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
17+
const language = getLanguage();
18+
if (language) {
19+
const [serviceScript, targetScript, sourceScript] = getServiceScript(language, fileName);
20+
if (serviceScript && sourceScript?.generated?.root instanceof VueVirtualCode) {
21+
for (
22+
const sourceRange of toSourceRanges(sourceScript, language, serviceScript, start, end, true, () => true)
23+
) {
24+
const generateRange2 = toGeneratedRange(
25+
language,
26+
serviceScript,
27+
sourceScript,
28+
sourceRange[1],
29+
sourceRange[2],
30+
(data: VueCodeInformation) => typeof data.completion === 'object' && !!data.completion.isAdditional,
31+
);
32+
if (generateRange2 !== undefined) {
33+
let importFixes = getCodeFixesAtPosition(
34+
targetScript.id,
35+
generateRange2[0],
36+
generateRange2[1],
37+
[2304], // Cannot find name 'xxx'.ts(2304)
38+
formatOptions,
39+
preferences,
40+
);
41+
importFixes = importFixes.filter(fix => fix.fixName === 'import');
42+
fixes = fixes.concat(importFixes);
43+
}
44+
}
45+
}
46+
}
47+
return fixes;
48+
};
49+
}
50+
51+
export function postprocessLanguageService<T>(
852
ts: typeof import('typescript'),
953
language: Language<T>,
1054
languageService: ts.LanguageService,

0 commit comments

Comments
 (0)