Skip to content

Commit 8cd7a65

Browse files
committed
refactor(typescript-plugin): early exit
1 parent 63ed6d3 commit 8cd7a65

File tree

1 file changed

+150
-135
lines changed

1 file changed

+150
-135
lines changed

packages/typescript-plugin/lib/common.ts

Lines changed: 150 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -23,168 +23,183 @@ export function preprocessLanguageService(
2323
} = languageService;
2424

2525
languageService.getQuickInfoAtPosition = (fileName, position, maximumLength) => {
26-
let result = getQuickInfoAtPosition(fileName, position, maximumLength);
26+
const result = getQuickInfoAtPosition(fileName, position, maximumLength);
27+
if (!result) {
28+
return result;
29+
}
2730
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-
}
31+
if (!language) {
32+
return result;
33+
}
34+
const [serviceScript, _targetScript, sourceScript] = getServiceScript(language, fileName);
35+
if (!serviceScript || !(sourceScript?.generated?.root instanceof VueVirtualCode)) {
36+
return result;
37+
}
38+
for (
39+
const sourceOffset of toSourceOffsets(
40+
sourceScript,
41+
language,
42+
serviceScript,
43+
position,
44+
() => true,
45+
)
46+
) {
47+
const generatedOffset2 = toGeneratedOffset(
48+
language,
49+
serviceScript,
50+
sourceScript,
51+
sourceOffset[1],
52+
(data: VueCodeInformation) => !!data.__importCompletion,
53+
);
54+
if (generatedOffset2 !== undefined) {
55+
const extraInfo = getQuickInfoAtPosition(fileName, generatedOffset2, maximumLength);
56+
if (extraInfo) {
57+
result.tags ??= [];
58+
result.tags.push(...extraInfo.tags ?? []);
5459
}
5560
}
5661
}
5762
return result;
5863
};
5964
languageService.getSuggestionDiagnostics = fileName => {
60-
const diagnostics = getSuggestionDiagnostics(fileName);
65+
const result = getSuggestionDiagnostics(fileName);
6166
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-
}
67+
if (!language) {
68+
return result;
69+
}
70+
const [serviceScript, _targetScript, sourceScript] = getServiceScript(language, fileName);
71+
if (!serviceScript || !(sourceScript?.generated?.root instanceof VueVirtualCode)) {
72+
return result;
73+
}
74+
for (const diagnostic of result) {
75+
for (
76+
const sourceRange of toSourceRanges(
77+
sourceScript,
78+
language,
79+
serviceScript,
80+
diagnostic.start,
81+
diagnostic.start + diagnostic.length,
82+
true,
83+
(data: VueCodeInformation) => !!data.__importCompletion,
84+
)
85+
) {
86+
const generateRange2 = toGeneratedRange(
87+
language,
88+
serviceScript,
89+
sourceScript,
90+
sourceRange[1],
91+
sourceRange[2],
92+
(data: VueCodeInformation) => !data.__importCompletion,
93+
);
94+
if (generateRange2 !== undefined) {
95+
diagnostic.start = generateRange2[0];
96+
diagnostic.length = generateRange2[1] - generateRange2[0];
97+
break;
9198
}
9299
}
93100
}
94-
return diagnostics;
101+
return result;
95102
};
96103
languageService.getCompletionsAtPosition = (fileName, position, preferences, formatOptions) => {
97-
let result = getCompletionsAtPosition(fileName, position, preferences, formatOptions);
104+
const result = getCompletionsAtPosition(fileName, position, preferences, formatOptions);
105+
if (!result) {
106+
return result;
107+
}
98108
const language = getLanguage();
99-
if (language && result) {
100-
const [serviceScript, targetScript, sourceScript] = getServiceScript(language, fileName);
101-
if (serviceScript && sourceScript?.generated?.root instanceof VueVirtualCode) {
102-
for (
103-
const sourceOffset of toSourceOffsets(
104-
sourceScript,
105-
language,
106-
serviceScript,
107-
position,
108-
() => true,
109-
)
110-
) {
111-
const generatedOffset2 = toGeneratedOffset(
112-
language,
113-
serviceScript,
114-
sourceScript,
115-
sourceOffset[1],
116-
(data: VueCodeInformation) => !!data.__importCompletion,
117-
);
118-
if (generatedOffset2 !== undefined) {
119-
const completion2 = getCompletionsAtPosition(targetScript.id, generatedOffset2, preferences, formatOptions);
120-
if (completion2) {
121-
const nameToIndex = new Map(result.entries.map((entry, index) => [entry.name, index]));
122-
for (const entry of completion2.entries) {
123-
if (entry.kind === 'warning') {
124-
continue;
125-
}
126-
if (nameToIndex.has(entry.name)) {
127-
const index = nameToIndex.get(entry.name)!;
128-
const existingEntry = result.entries[index]!;
129-
if (existingEntry.kind === 'warning') {
130-
result.entries[index] = entry;
131-
}
132-
}
133-
else {
134-
result.entries.push(entry);
135-
}
109+
if (!language) {
110+
return result;
111+
}
112+
const [serviceScript, _targetScript, sourceScript] = getServiceScript(language, fileName);
113+
if (!serviceScript || !(sourceScript?.generated?.root instanceof VueVirtualCode)) {
114+
return result;
115+
}
116+
for (
117+
const sourceOffset of toSourceOffsets(
118+
sourceScript,
119+
language,
120+
serviceScript,
121+
position,
122+
() => true,
123+
)
124+
) {
125+
const generatedOffset2 = toGeneratedOffset(
126+
language,
127+
serviceScript,
128+
sourceScript,
129+
sourceOffset[1],
130+
(data: VueCodeInformation) => !!data.__importCompletion,
131+
);
132+
if (generatedOffset2 !== undefined) {
133+
const completion2 = getCompletionsAtPosition(fileName, generatedOffset2, preferences, formatOptions);
134+
if (completion2) {
135+
const nameToIndex = new Map(result.entries.map((entry, index) => [entry.name, index]));
136+
for (const entry of completion2.entries) {
137+
if (entry.kind === 'warning') {
138+
continue;
139+
}
140+
if (nameToIndex.has(entry.name)) {
141+
const index = nameToIndex.get(entry.name)!;
142+
const existingEntry = result.entries[index]!;
143+
if (existingEntry.kind === 'warning') {
144+
result.entries[index] = entry;
136145
}
137146
}
147+
else {
148+
result.entries.push(entry);
149+
}
138150
}
139151
}
140152
}
141153
}
142154
return result;
143155
};
144156
languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
145-
let fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
157+
let result = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
158+
// Property 'xxx' does not exist on type 'yyy'.ts(2339)
159+
if (!errorCodes.includes(2339)) {
160+
return result;
161+
}
146162
const language = getLanguage();
147-
if (
148-
language
149-
&& errorCodes.includes(2339) // Property 'xxx' does not exist on type 'yyy'.ts(2339)
163+
if (!language) {
164+
return result;
165+
}
166+
const [serviceScript, _targetScript, sourceScript] = getServiceScript(language, fileName);
167+
if (!serviceScript || !(sourceScript?.generated?.root instanceof VueVirtualCode)) {
168+
return result;
169+
}
170+
for (
171+
const sourceRange of toSourceRanges(
172+
sourceScript,
173+
language,
174+
serviceScript,
175+
start,
176+
end,
177+
true,
178+
() => true,
179+
)
150180
) {
151-
const [serviceScript, targetScript, sourceScript] = getServiceScript(language, fileName);
152-
if (serviceScript && sourceScript?.generated?.root instanceof VueVirtualCode) {
153-
for (
154-
const sourceRange of toSourceRanges(
155-
sourceScript,
156-
language,
157-
serviceScript,
158-
start,
159-
end,
160-
true,
161-
() => true,
162-
)
163-
) {
164-
const generateRange2 = toGeneratedRange(
165-
language,
166-
serviceScript,
167-
sourceScript,
168-
sourceRange[1],
169-
sourceRange[2],
170-
(data: VueCodeInformation) => !!data.__importCompletion,
171-
);
172-
if (generateRange2 !== undefined) {
173-
let importFixes = getCodeFixesAtPosition(
174-
targetScript.id,
175-
generateRange2[0],
176-
generateRange2[1],
177-
[2304], // Cannot find name 'xxx'.ts(2304)
178-
formatOptions,
179-
preferences,
180-
);
181-
importFixes = importFixes.filter(fix => fix.fixName === 'import');
182-
fixes = fixes.concat(importFixes);
183-
}
184-
}
181+
const generateRange2 = toGeneratedRange(
182+
language,
183+
serviceScript,
184+
sourceScript,
185+
sourceRange[1],
186+
sourceRange[2],
187+
(data: VueCodeInformation) => !!data.__importCompletion,
188+
);
189+
if (generateRange2 !== undefined) {
190+
let importFixes = getCodeFixesAtPosition(
191+
fileName,
192+
generateRange2[0],
193+
generateRange2[1],
194+
[2304], // Cannot find name 'xxx'.ts(2304)
195+
formatOptions,
196+
preferences,
197+
);
198+
importFixes = importFixes.filter(fix => fix.fixName === 'import');
199+
result = result.concat(importFixes);
185200
}
186201
}
187-
return fixes;
202+
return result;
188203
};
189204
}
190205

0 commit comments

Comments
 (0)