Skip to content

Commit 66100a3

Browse files
committed
wip
1 parent b574019 commit 66100a3

5 files changed

Lines changed: 28 additions & 8 deletions

File tree

packages/ts-plugin/src/index.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,19 @@ const plugin = createLanguageServicePlugin((ts, info) => {
7070
config,
7171
);
7272
if (info.session) {
73+
// Register protocol handlers for "Request Forwarding to tsserver".
74+
// See https://github.com/mizdra/css-modules-kit/pull/207 for more details.
75+
76+
// `info.session.addProtocolHandler` cannot register multiple handlers with the same command name.
77+
// Attempting to do so will result in an error.
78+
//
79+
// By the way, tsserver creates one ConfiguredProject for each tsconfig.json file. Then, tsserver
80+
// initializes each plugin for each ConfiguredProject. This means that if there are multiple
81+
// tsconfig.json files, the handler will be registered multiple times.
82+
//
83+
// Therefore, we will do the following:
84+
// - Implement the handler to handle files from different projects
85+
// - Skip registration if the handler is already registered
7386
try {
7487
info.session.addProtocolHandler('_css-modules-kit:rename', createRenameHandler(ts, info.project));
7588
info.session.addProtocolHandler('_css-modules-kit:renameInfo', createRenameInfoHandler(ts, info.project));
@@ -83,6 +96,8 @@ const plugin = createLanguageServicePlugin((ts, info) => {
8396
);
8497
}
8598
} else {
99+
// When a plugin is used via tsserver from the editor, the session is always available.
100+
// However, when a plugin is used via the TypeScript Compiler API, the session may not be available.
86101
info.project.projectService.logger.info(
87102
'[@css-modules-kit/ts-plugin] info: Skipping protocol handler registration because session is not available.',
88103
);

packages/ts-plugin/src/protocol-handler/documentLink.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ export function createDocumentLinkHandler(
1616
resolver: Resolver,
1717
) {
1818
return (request: CSSModulesKitDocumentLinkRequest): CSSModulesKitDocumentLinkHandlerResponse => {
19-
const project = getConfiguredProjectForFile(_ts, _project, request.arguments.fileName);
19+
const { fileName } = request.arguments;
20+
const project = getConfiguredProjectForFile(_ts, _project, fileName);
2021
if (!project) return {};
2122
const language = projectToLanguage.get(project);
2223
if (!language) return {};
23-
const { fileName } = request.arguments;
2424
const script = language.scripts.get(fileName);
2525
const links: DocumentLink[] = [];
2626
if (isCSSModuleScript(script)) {

packages/ts-plugin/src/protocol-handler/rename.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import { getConfiguredProjectForFile } from '../util.js';
44

55
export function createRenameHandler(_ts: typeof ts, _project: ts.server.Project) {
66
return (request: CSSModulesKitRenameRequest): CSSModulesKitRenameHandlerResponse => {
7-
const project = getConfiguredProjectForFile(_ts, _project, request.arguments.fileName);
7+
const { fileName, position } = request.arguments;
8+
const project = getConfiguredProjectForFile(_ts, _project, fileName);
89
if (!project) return {};
910
const languageService = project.getLanguageService();
10-
const { fileName, position } = request.arguments;
11-
const result = languageService.findRenameLocations(fileName, position, false, false, {});
11+
const preference = project.projectService.getPreferences(_ts.server.toNormalizedPath(fileName));
12+
const result = languageService.findRenameLocations(fileName, position, false, false, preference);
1213
return { response: { result } };
1314
};
1415
}

packages/ts-plugin/src/protocol-handler/renameInfo.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import { getConfiguredProjectForFile } from '../util.js';
44

55
export function createRenameInfoHandler(_ts: typeof ts, _project: ts.server.Project) {
66
return (request: CSSModulesKitRenameInfoRequest): CSSModulesKitRenameInfoHandlerResponse => {
7-
const project = getConfiguredProjectForFile(_ts, _project, request.arguments.fileName);
7+
const { fileName, position } = request.arguments;
8+
const project = getConfiguredProjectForFile(_ts, _project, fileName);
89
if (!project) return {};
910
const languageService = project.getLanguageService();
10-
const { fileName, position } = request.arguments;
11-
const result = languageService.getRenameInfo(fileName, position, {});
11+
const preference = project.projectService.getPreferences(_ts.server.toNormalizedPath(fileName));
12+
const result = languageService.getRenameInfo(fileName, position, preference);
1213
return { response: { result } };
1314
};
1415
}

packages/vscode/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ export function activate(context: vscode.ExtensionContext) {
2222
}
2323

2424
context.subscriptions.push(
25+
// In VS Code, tsserver typically conflicts with the standard CSS Language Server, causing some language features to malfunction.
26+
// Therefore, an approach called "Request Forwarding to tsserver" is used to avoid this conflict.
27+
// See https://github.com/mizdra/css-modules-kit/pull/207 for more details.
2528
vscode.languages.registerRenameProvider(
2629
{ scheme: 'file', language: 'css' },
2730
{

0 commit comments

Comments
 (0)