Skip to content

Commit a2b2bb3

Browse files
committed
fix(typescript-plugin): ensure all requests do not return void
1 parent e3aa6d1 commit a2b2bb3

File tree

10 files changed

+87
-101
lines changed

10 files changed

+87
-101
lines changed

packages/language-service/index.ts

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,14 @@ import { create as createVueTwoslashQueriesPlugin } from './lib/plugins/vue-twos
3131

3232
export function createVueLanguageServicePlugins(
3333
ts: typeof import('typescript'),
34-
tsPluginClient: import('@vue/typescript-plugin/lib/requests').Requests = {
35-
collectExtractProps: () => undefined,
36-
getImportPathForFile: () => undefined,
37-
getPropertiesAtLocation: () => undefined,
38-
getComponentDirectives: () => undefined,
39-
getComponentEvents: () => undefined,
40-
getComponentNames: () => undefined,
41-
getComponentProps: () => undefined,
42-
getComponentSlots: () => undefined,
43-
getElementAttrs: () => undefined,
44-
getElementNames: () => undefined,
45-
getDocumentHighlights: () => undefined,
46-
getEncodedSemanticClassifications: () => undefined,
47-
getQuickInfoAtPosition: () => undefined,
48-
},
34+
tsPluginClient?: import('@vue/typescript-plugin/lib/requests').Requests,
4935
) {
36+
tsPluginClient ??= new Proxy({}, {
37+
get() {
38+
return () => undefined;
39+
},
40+
}) as NonNullable<typeof tsPluginClient>;
41+
5042
return [
5143
createCssPlugin(),
5244
createJsonPlugin(),

packages/typescript-plugin/lib/requests/collectExtractProps.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,9 @@ export function collectExtractProps(
99
const { typescript: ts, languageService, language } = this;
1010

1111
const sourceScript = language.scripts.get(fileName);
12-
if (!sourceScript?.generated) {
13-
return;
14-
}
15-
16-
const root = sourceScript.generated.root;
17-
if (!(root instanceof VueVirtualCode)) {
18-
return;
12+
const root = sourceScript?.generated?.root;
13+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
14+
return [];
1915
}
2016

2117
const result = new Map<string, {
@@ -26,8 +22,8 @@ export function collectExtractProps(
2622
const program = languageService.getProgram()!;
2723
const sourceFile = program.getSourceFile(fileName)!;
2824
const checker = program.getTypeChecker();
29-
const script = sourceScript.generated?.languagePlugin.typescript?.getServiceScript(root);
30-
const maps = script ? [...language.maps.forEach(script.code)].map(([_sourceScript, map]) => map) : [];
25+
const script = sourceScript.generated.languagePlugin.typescript?.getServiceScript(root);
26+
const maps = script ? [...language.maps.forEach(script.code)].map(([, map]) => map) : [];
3127
const { sfc } = root;
3228

3329
sourceFile.forEachChild(function visit(node) {

packages/typescript-plugin/lib/requests/getComponentDirectives.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ export function getComponentDirectives(
1616
fileName: string,
1717
) {
1818
const { typescript: ts, language, languageService } = this;
19-
const volarFile = language.scripts.get(fileName);
20-
if (!(volarFile?.generated?.root instanceof VueVirtualCode)) {
21-
return;
19+
20+
const sourceScript = language.scripts.get(fileName);
21+
const root = sourceScript?.generated?.root;
22+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
23+
return [];
2224
}
23-
const vueCode = volarFile.generated.root;
24-
const directives = getVariableType(ts, languageService, vueCode, '__VLS_directives');
25+
26+
const directives = getVariableType(ts, languageService, root, '__VLS_directives');
2527
if (!directives) {
2628
return [];
2729
}

packages/typescript-plugin/lib/requests/getComponentEvents.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@ export function getComponentEvents(
88
tag: string,
99
) {
1010
const { typescript: ts, language, languageService } = this;
11-
const volarFile = language.scripts.get(fileName);
12-
if (!(volarFile?.generated?.root instanceof VueVirtualCode)) {
13-
return;
11+
12+
const sourceScript = language.scripts.get(fileName);
13+
const root = sourceScript?.generated?.root;
14+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
15+
return [];
1416
}
15-
const vueCode = volarFile.generated.root;
17+
1618
const program = languageService.getProgram()!;
1719
const checker = program.getTypeChecker();
18-
const components = getVariableType(ts, languageService, vueCode, '__VLS_components');
20+
const components = getVariableType(ts, languageService, root, '__VLS_components');
1921
if (!components) {
2022
return [];
2123
}
2224

23-
const componentType = getComponentType(ts, languageService, vueCode, components, fileName, tag);
25+
const componentType = getComponentType(ts, languageService, root, components, fileName, tag);
2426
if (!componentType) {
2527
return [];
2628
}
Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { VueVirtualCode } from '@vue/language-core';
2-
import type * as ts from 'typescript';
32
import type { RequestContext } from './types';
43
import { getSelfComponentName, getVariableType } from './utils';
54

@@ -8,26 +7,20 @@ export function getComponentNames(
87
fileName: string,
98
) {
109
const { typescript: ts, language, languageService } = this;
11-
const volarFile = language.scripts.get(fileName);
12-
if (!(volarFile?.generated?.root instanceof VueVirtualCode)) {
13-
return;
10+
11+
const sourceScript = language.scripts.get(fileName);
12+
const root = sourceScript?.generated?.root;
13+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
14+
return [];
1415
}
15-
const vueCode = volarFile.generated.root;
16-
return _getComponentNames(ts, languageService, vueCode);
17-
}
1816

19-
export function _getComponentNames(
20-
ts: typeof import('typescript'),
21-
tsLs: ts.LanguageService,
22-
vueCode: VueVirtualCode,
23-
) {
24-
const names = getVariableType(ts, tsLs, vueCode, '__VLS_components')
17+
const names = getVariableType(ts, languageService, root, '__VLS_components')
2518
?.type
2619
?.getProperties()
2720
.map(c => c.name)
2821
.filter(entry => !entry.includes('$') && !entry.startsWith('_'))
2922
?? [];
3023

31-
names.push(getSelfComponentName(vueCode.fileName));
24+
names.push(getSelfComponentName(fileName));
3225
return names;
3326
}

packages/typescript-plugin/lib/requests/getComponentProps.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,19 @@ export function getComponentProps(
1818
tag: string,
1919
) {
2020
const { typescript: ts, language, languageService } = this;
21-
const volarFile = language.scripts.get(fileName);
22-
if (!(volarFile?.generated?.root instanceof VueVirtualCode)) {
23-
return;
21+
22+
const sourceScript = language.scripts.get(fileName);
23+
const root = sourceScript?.generated?.root;
24+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
25+
return [];
2426
}
25-
const vueCode = volarFile.generated.root;
26-
const components = getVariableType(ts, languageService, vueCode, '__VLS_components');
27+
28+
const components = getVariableType(ts, languageService, root, '__VLS_components');
2729
if (!components) {
2830
return [];
2931
}
3032

31-
const componentType = getComponentType(ts, languageService, vueCode, components, fileName, tag);
33+
const componentType = getComponentType(ts, languageService, root, components, fileName, tag);
3234
if (!componentType) {
3335
return [];
3436
}

packages/typescript-plugin/lib/requests/getComponentSlots.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,20 @@ export function getComponentSlots(
77
fileName: string,
88
) {
99
const { typescript: ts, language, languageService } = this;
10-
const volarFile = language.scripts.get(fileName);
11-
if (!(volarFile?.generated?.root instanceof VueVirtualCode)) {
12-
return;
10+
11+
const sourceScript = language.scripts.get(fileName);
12+
const root = sourceScript?.generated?.root;
13+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
14+
return [];
1315
}
14-
const vueCode = volarFile.generated.root;
1516

16-
const codegen = tsCodegen.get(vueCode.sfc);
17+
const codegen = tsCodegen.get(root.sfc);
1718
if (!codegen) {
1819
return;
1920
}
2021

2122
const assignName = codegen.getSetupSlotsAssignName() ?? `__VLS_slots`;
22-
const slots = getVariableType(ts, languageService, vueCode, assignName);
23+
const slots = getVariableType(ts, languageService, root, assignName);
2324
if (!slots) {
2425
return [];
2526
}

packages/typescript-plugin/lib/requests/getElementAttrs.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ export function getElementAttrs(
88
tagName: string,
99
) {
1010
const { typescript: ts, language, languageService } = this;
11-
const volarFile = language.scripts.get(fileName);
12-
if (!(volarFile?.generated?.root instanceof VueVirtualCode)) {
13-
return;
11+
12+
const sourceScript = language.scripts.get(fileName);
13+
const root = sourceScript?.generated?.root;
14+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
15+
return [];
1416
}
15-
const vueCode = volarFile.generated.root;
1617

1718
const program = languageService.getProgram()!;
1819
const checker = program.getTypeChecker();
19-
const elements = getVariableType(ts, languageService, vueCode, '__VLS_elements');
20+
const elements = getVariableType(ts, languageService, root, '__VLS_elements');
2021
if (!elements) {
2122
return [];
2223
}

packages/typescript-plugin/lib/requests/getElementNames.ts

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { VueVirtualCode } from '@vue/language-core';
2-
import type * as ts from 'typescript';
32
import type { RequestContext } from './types';
43
import { getVariableType } from './utils';
54

@@ -8,20 +7,14 @@ export function getElementNames(
87
fileName: string,
98
) {
109
const { typescript: ts, language, languageService } = this;
11-
const volarFile = language.scripts.get(fileName);
12-
if (!(volarFile?.generated?.root instanceof VueVirtualCode)) {
13-
return;
10+
11+
const sourceScript = language.scripts.get(fileName);
12+
const root = sourceScript?.generated?.root;
13+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
14+
return [];
1415
}
15-
const vueCode = volarFile.generated.root;
16-
return _getElementNames(ts, languageService, vueCode);
17-
}
1816

19-
export function _getElementNames(
20-
ts: typeof import('typescript'),
21-
tsLs: ts.LanguageService,
22-
vueCode: VueVirtualCode,
23-
) {
24-
return getVariableType(ts, tsLs, vueCode, '__VLS_elements')
17+
return getVariableType(ts, languageService, root, '__VLS_elements')
2518
?.type
2619
?.getProperties()
2720
.map(c => c.name)

packages/typescript-plugin/lib/requests/getPropertiesAtLocation.ts

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/// <reference types="@volar/typescript" />
22

3-
import { isCompletionEnabled } from '@vue/language-core';
3+
import { isCompletionEnabled, VueVirtualCode } from '@vue/language-core';
44
import type * as ts from 'typescript';
55
import type { RequestContext } from './types';
66

@@ -12,40 +12,44 @@ export function getPropertiesAtLocation(
1212
const { languageService, language, typescript: ts } = this;
1313

1414
// mapping
15-
const file = language.scripts.get(fileName);
16-
if (file?.generated) {
17-
const virtualScript = file.generated.languagePlugin.typescript?.getServiceScript(file.generated.root);
18-
if (!virtualScript) {
19-
return;
20-
}
21-
let mapped = false;
22-
for (const [_sourceScript, map] of language.maps.forEach(virtualScript.code)) {
23-
for (const [position2, mapping] of map.toGeneratedLocation(position)) {
24-
if (isCompletionEnabled(mapping.data)) {
25-
position = position2;
26-
mapped = true;
27-
break;
28-
}
29-
}
30-
if (mapped) {
15+
const sourceScript = language.scripts.get(fileName);
16+
const root = sourceScript?.generated?.root;
17+
if (!sourceScript?.generated || !(root instanceof VueVirtualCode)) {
18+
return [];
19+
}
20+
21+
const virtualScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(root);
22+
if (!virtualScript) {
23+
return [];
24+
}
25+
26+
let mapped = false;
27+
for (const [_sourceScript, map] of language.maps.forEach(virtualScript.code)) {
28+
for (const [position2, mapping] of map.toGeneratedLocation(position)) {
29+
if (isCompletionEnabled(mapping.data)) {
30+
position = position2;
31+
mapped = true;
3132
break;
3233
}
3334
}
34-
if (!mapped) {
35-
return;
35+
if (mapped) {
36+
break;
3637
}
37-
position += file.snapshot.getLength();
3838
}
39+
if (!mapped) {
40+
return [];
41+
}
42+
position += sourceScript.snapshot.getLength();
3943

4044
const program = languageService.getProgram()!;
4145
const sourceFile = program.getSourceFile(fileName);
4246
if (!sourceFile) {
43-
return;
47+
return [];
4448
}
4549

4650
const node = findPositionIdentifier(sourceFile, sourceFile, position);
4751
if (!node) {
48-
return;
52+
return [];
4953
}
5054

5155
const checker = program.getTypeChecker();

0 commit comments

Comments
 (0)