Skip to content

Commit 0dfe599

Browse files
committed
fix(language-server): name casing request not working
1 parent b1cd804 commit 0dfe599

File tree

3 files changed

+66
-51
lines changed

3 files changed

+66
-51
lines changed

packages/language-server/node.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Connection } from '@volar/language-server';
22
import { createConnection, createServer, createSimpleProjectProviderFactory, createTypeScriptProjectProviderFactory, loadTsdkByPath } from '@volar/language-server/node';
33
import { ParsedCommandLine, VueCompilerOptions, createParsedCommandLine, createVueLanguagePlugin, parse, resolveVueCompilerOptions } from '@vue/language-core';
4-
import { ServiceEnvironment, convertAttrName, convertTagName, createVueServicePlugins, detect } from '@vue/language-service';
4+
import { ServiceEnvironment, convertAttrName, convertTagName, createDefaultGetTsPluginClient, createVueServicePlugins, detect } from '@vue/language-service';
55
import { DetectNameCasingRequest, GetConvertAttrCasingEditsRequest, GetConvertTagCasingEditsRequest, ParseSFCRequest } from './lib/protocol';
66
import type { VueInitializationOptions } from './lib/types';
77
import * as tsPluginClient from '@vue/typescript-plugin/lib/client';
@@ -15,6 +15,7 @@ export const server = createServer(connection);
1515
const envToVueOptions = new WeakMap<ServiceEnvironment, VueCompilerOptions>();
1616

1717
let tsdk: ReturnType<typeof loadTsdkByPath>;
18+
let getTsPluginClient: ReturnType<typeof createDefaultGetTsPluginClient>;
1819

1920
connection.listen();
2021

@@ -33,6 +34,13 @@ connection.onInitialize(async params => {
3334
}
3435
}
3536

37+
if (hybridMode) {
38+
getTsPluginClient = () => tsPluginClient;
39+
}
40+
else {
41+
getTsPluginClient = createDefaultGetTsPluginClient(tsdk.typescript, env => envToVueOptions.get(env)!);
42+
}
43+
3644
const result = await server.initialize(
3745
params,
3846
hybridMode
@@ -44,7 +52,8 @@ connection.onInitialize(async params => {
4452
return createVueServicePlugins(
4553
tsdk.typescript,
4654
env => envToVueOptions.get(env)!,
47-
hybridMode ? () => tsPluginClient : undefined,
55+
getTsPluginClient,
56+
hybridMode,
4857
);
4958
},
5059
async getLanguagePlugins(serviceEnv, projectContext) {
@@ -130,21 +139,21 @@ connection.onRequest(ParseSFCRequest.type, params => {
130139
connection.onRequest(DetectNameCasingRequest.type, async params => {
131140
const languageService = await getService(params.textDocument.uri);
132141
if (languageService) {
133-
return await detect(languageService.context, params.textDocument.uri, tsPluginClient);
142+
return await detect(languageService.context, params.textDocument.uri, getTsPluginClient(languageService.context));
134143
}
135144
});
136145

137146
connection.onRequest(GetConvertTagCasingEditsRequest.type, async params => {
138147
const languageService = await getService(params.textDocument.uri);
139148
if (languageService) {
140-
return await convertTagName(languageService.context, params.textDocument.uri, params.casing, tsPluginClient);
149+
return await convertTagName(languageService.context, params.textDocument.uri, params.casing, getTsPluginClient(languageService.context));
141150
}
142151
});
143152

144153
connection.onRequest(GetConvertAttrCasingEditsRequest.type, async params => {
145154
const languageService = await getService(params.textDocument.uri);
146155
if (languageService) {
147-
return await convertAttrName(languageService.context, params.textDocument.uri, params.casing, tsPluginClient);
156+
return await convertAttrName(languageService.context, params.textDocument.uri, params.casing, getTsPluginClient(languageService.context));
148157
}
149158
});
150159

packages/language-service/index.ts

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ import { getQuickInfoAtPosition } from '@vue/typescript-plugin/lib/requests/getQ
3636
export function createVueServicePlugins(
3737
ts: typeof import('typescript'),
3838
getVueOptions: (env: ServiceEnvironment) => VueCompilerOptions,
39-
getTsPluginClient?: (context: ServiceContext) => typeof import('@vue/typescript-plugin/lib/client') | undefined,
39+
getTsPluginClient = createDefaultGetTsPluginClient(ts, getVueOptions),
40+
hybridMode = false,
4041
): ServicePlugin[] {
4142
const plugins: ServicePlugin[] = [];
42-
const hybridMode = !!getTsPluginClient;
4343
if (!hybridMode) {
4444
plugins.push(...createTypeScriptServicePlugins(ts));
4545
for (let i = 0; i < plugins.length; i++) {
@@ -61,45 +61,6 @@ export function createVueServicePlugins(
6161
break;
6262
}
6363
}
64-
getTsPluginClient = context => {
65-
if (!context.language.typescript) {
66-
return;
67-
}
68-
const requestContext = {
69-
typescript: ts,
70-
files: context.language.files,
71-
languageService: context.inject<(import('volar-service-typescript').Provide), 'typescript/languageService'>('typescript/languageService'),
72-
vueOptions: getVueOptions(context.env),
73-
isTsPlugin: false,
74-
getFileId: context.env.typescript!.fileNameToUri,
75-
};
76-
return {
77-
async collectExtractProps(...args) {
78-
return await collectExtractProps.apply(requestContext, args);
79-
},
80-
async getPropertiesAtLocation(...args) {
81-
return await getPropertiesAtLocation.apply(requestContext, args);
82-
},
83-
async getComponentEvents(...args) {
84-
return await getComponentEvents.apply(requestContext, args);
85-
},
86-
async getComponentNames(...args) {
87-
return await getComponentNames.apply(requestContext, args);
88-
},
89-
async getComponentProps(...args) {
90-
return await getComponentProps.apply(requestContext, args);
91-
},
92-
async getElementAttrs(...args) {
93-
return await getElementAttrs.apply(requestContext, args);
94-
},
95-
async getTemplateContextProps(...args) {
96-
return await getTemplateContextProps.apply(requestContext, args);
97-
},
98-
async getQuickInfoAtPosition(...args) {
99-
return await getQuickInfoAtPosition.apply(requestContext, args);
100-
},
101-
};
102-
};
10364
}
10465
else {
10566
plugins.push(
@@ -129,3 +90,48 @@ export function createVueServicePlugins(
12990
);
13091
return plugins;
13192
}
93+
94+
export function createDefaultGetTsPluginClient(
95+
ts: typeof import('typescript'),
96+
getVueOptions: (env: ServiceEnvironment) => VueCompilerOptions,
97+
): (context: ServiceContext) => typeof import('@vue/typescript-plugin/lib/client') | undefined {
98+
return context => {
99+
if (!context.language.typescript) {
100+
return;
101+
}
102+
const requestContext = {
103+
typescript: ts,
104+
files: context.language.files,
105+
languageService: context.inject<(import('volar-service-typescript').Provide), 'typescript/languageService'>('typescript/languageService'),
106+
vueOptions: getVueOptions(context.env),
107+
isTsPlugin: false,
108+
getFileId: context.env.typescript!.fileNameToUri,
109+
};
110+
return {
111+
async collectExtractProps(...args) {
112+
return await collectExtractProps.apply(requestContext, args);
113+
},
114+
async getPropertiesAtLocation(...args) {
115+
return await getPropertiesAtLocation.apply(requestContext, args);
116+
},
117+
async getComponentEvents(...args) {
118+
return await getComponentEvents.apply(requestContext, args);
119+
},
120+
async getComponentNames(...args) {
121+
return await getComponentNames.apply(requestContext, args);
122+
},
123+
async getComponentProps(...args) {
124+
return await getComponentProps.apply(requestContext, args);
125+
},
126+
async getElementAttrs(...args) {
127+
return await getElementAttrs.apply(requestContext, args);
128+
},
129+
async getTemplateContextProps(...args) {
130+
return await getTemplateContextProps.apply(requestContext, args);
131+
},
132+
async getQuickInfoAtPosition(...args) {
133+
return await getQuickInfoAtPosition.apply(requestContext, args);
134+
},
135+
};
136+
};;
137+
}

packages/language-service/lib/ideFeatures/nameCasing.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export async function convertTagName(
1010
context: ServiceContext,
1111
uri: string,
1212
casing: TagNameCasing,
13-
tsPluginClient: typeof import('@vue/typescript-plugin/lib/client'),
13+
tsPluginClient: typeof import('@vue/typescript-plugin/lib/client') | undefined,
1414
) {
1515

1616
const sourceFile = context.language.files.get(uri);
@@ -31,7 +31,7 @@ export async function convertTagName(
3131
const template = desc.template;
3232
const document = context.documents.get(sourceFile.id, sourceFile.languageId, sourceFile.snapshot);
3333
const edits: vscode.TextEdit[] = [];
34-
const components = await tsPluginClient.getComponentNames(rootCode.fileName) ?? [];
34+
const components = await tsPluginClient?.getComponentNames(rootCode.fileName) ?? [];
3535
const tags = getTemplateTagsAndAttrs(rootCode);
3636

3737
for (const [tagName, { offsets }] of tags) {
@@ -58,7 +58,7 @@ export async function convertAttrName(
5858
context: ServiceContext,
5959
uri: string,
6060
casing: AttrNameCasing,
61-
tsPluginClient: typeof import('@vue/typescript-plugin/lib/client'),
61+
tsPluginClient?: typeof import('@vue/typescript-plugin/lib/client'),
6262
) {
6363

6464
const sourceFile = context.language.files.get(uri);
@@ -79,13 +79,13 @@ export async function convertAttrName(
7979
const template = desc.template;
8080
const document = context.documents.get(uri, sourceFile.languageId, sourceFile.snapshot);
8181
const edits: vscode.TextEdit[] = [];
82-
const components = await tsPluginClient.getComponentNames(rootCode.fileName) ?? [];
82+
const components = await tsPluginClient?.getComponentNames(rootCode.fileName) ?? [];
8383
const tags = getTemplateTagsAndAttrs(rootCode);
8484

8585
for (const [tagName, { attrs }] of tags) {
8686
const componentName = components.find(component => component === tagName || hyphenateTag(component) === tagName);
8787
if (componentName) {
88-
const props = await tsPluginClient.getComponentProps(rootCode.fileName, componentName) ?? [];
88+
const props = await tsPluginClient?.getComponentProps(rootCode.fileName, componentName) ?? [];
8989
for (const [attrName, { offsets }] of attrs) {
9090
const propName = props.find(prop => prop === attrName || hyphenateAttr(prop) === attrName);
9191
if (propName) {

0 commit comments

Comments
 (0)