Skip to content

Commit 94ebd82

Browse files
committed
refactor
1 parent b849de7 commit 94ebd82

4 files changed

Lines changed: 92 additions & 55 deletions

File tree

packages/ts-plugin/src/index.ts

Lines changed: 19 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import { TsConfigFileNotFoundError } from '@css-modules-kit/core';
44
import type { Language } from '@volar/language-core';
55
import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin.js';
66
import type ts from 'typescript';
7-
import { CMK_DATA_KEY, createCSSLanguagePlugin, isCSSModuleScript } from './language-plugin.js';
7+
import { createCSSLanguagePlugin } from './language-plugin.js';
88
import { proxyLanguageService } from './language-service/proxy.js';
9-
import type { DocumentLink } from './type.js';
9+
import { createDocumentLinkHandler } from './protocol-handler/documentLink.js';
10+
import { createRenameHandler } from './protocol-handler/rename.js';
11+
import { createRenameInfoHandler } from './protocol-handler/renameInfo.js';
1012

1113
const projectToLanguage = new WeakMap<ts.server.Project, Language<string>>();
1214

@@ -16,12 +18,6 @@ const plugin = createLanguageServicePlugin((ts, info) => {
1618
return { languagePlugins: [] };
1719
}
1820

19-
if (!info.session) {
20-
info.project.projectService.logger.info('[@css-modules-kit/ts-plugin] info: Session is not available');
21-
return { languagePlugins: [] };
22-
}
23-
const session = info.session;
24-
2521
let config: CMKConfig;
2622
try {
2723
config = readConfigFile(info.project.getProjectName());
@@ -73,55 +69,23 @@ const plugin = createLanguageServicePlugin((ts, info) => {
7369
matchesPattern,
7470
config,
7571
);
76-
try {
77-
session.addProtocolHandler('_css-modules-kit:rename', (request) => {
78-
const project = info.project.projectService.getDefaultProjectForFile(
79-
ts.server.toNormalizedPath(request.arguments.fileName),
80-
true,
81-
);
82-
if (!project) return {};
83-
const languageService = project.getLanguageService();
84-
const { fileName, position } = request.arguments;
85-
const result = languageService.findRenameLocations(fileName, position, false, false, {});
86-
return { response: { result } };
87-
});
88-
session.addProtocolHandler('_css-modules-kit:renameInfo', (request) => {
89-
const project = info.project.projectService.getDefaultProjectForFile(
90-
ts.server.toNormalizedPath(request.arguments.fileName),
91-
true,
72+
if (info.session) {
73+
try {
74+
info.session.addProtocolHandler('_css-modules-kit:rename', createRenameHandler(ts, info.project));
75+
info.session.addProtocolHandler('_css-modules-kit:renameInfo', createRenameInfoHandler(ts, info.project));
76+
info.session.addProtocolHandler(
77+
'_css-modules-kit:documentLink',
78+
createDocumentLinkHandler(ts, info.project, projectToLanguage, resolver),
9279
);
93-
if (!project) return {};
94-
const languageService = project.getLanguageService();
95-
const { fileName, position } = request.arguments;
96-
const result = languageService.getRenameInfo(fileName, position, {});
97-
return { response: { result } };
98-
});
99-
session.addProtocolHandler('_css-modules-kit:documentLink', (request) => {
100-
const project = info.project.projectService.getDefaultProjectForFile(
101-
ts.server.toNormalizedPath(request.arguments.fileName),
102-
true,
80+
} catch {
81+
info.project.projectService.logger.info(
82+
`[@css-modules-kit/ts-plugin] Skipping protocol handler registration because the handlers are already registered.`,
10383
);
104-
if (!project) return {};
105-
const language = projectToLanguage.get(project);
106-
if (!language) return {};
107-
const { fileName } = request.arguments;
108-
const script = language.scripts.get(fileName);
109-
const links: DocumentLink[] = [];
110-
if (isCSSModuleScript(script)) {
111-
const { tokenImporters } = script.generated.root[CMK_DATA_KEY].cssModule;
112-
for (const { from, fromLoc } of tokenImporters) {
113-
const resolved = resolver(from, { request: fileName });
114-
if (!resolved) continue;
115-
links.push({
116-
fileName: resolved,
117-
textSpan: { start: fromLoc.start.offset, length: fromLoc.end.offset - fromLoc.start.offset },
118-
});
119-
}
120-
}
121-
return { response: { result: links } };
122-
});
123-
} catch {
124-
console.log('already registered');
84+
}
85+
} else {
86+
info.project.projectService.logger.info(
87+
'[@css-modules-kit/ts-plugin] info: Skipping protocol handler registration because session is not available.',
88+
);
12589
}
12690
},
12791
};
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import type { Resolver } from '@css-modules-kit/core';
2+
import type { Language } from '@volar/language-core';
3+
import type ts from 'typescript';
4+
import { CMK_DATA_KEY, isCSSModuleScript } from '../language-plugin.js';
5+
import type {
6+
CSSModulesKitDocumentLinkHandlerResponse,
7+
CSSModulesKitDocumentLinkRequest,
8+
DocumentLink,
9+
} from '../type.js';
10+
11+
export function createDocumentLinkHandler(
12+
_ts: typeof ts,
13+
_project: ts.server.Project,
14+
projectToLanguage: WeakMap<ts.server.Project, Language<string>>,
15+
resolver: Resolver,
16+
) {
17+
return (request: CSSModulesKitDocumentLinkRequest): CSSModulesKitDocumentLinkHandlerResponse => {
18+
const project = _project.projectService.getDefaultProjectForFile(
19+
_ts.server.toNormalizedPath(request.arguments.fileName),
20+
true,
21+
);
22+
if (!project) return {};
23+
const language = projectToLanguage.get(project);
24+
if (!language) return {};
25+
const { fileName } = request.arguments;
26+
const script = language.scripts.get(fileName);
27+
const links: DocumentLink[] = [];
28+
if (isCSSModuleScript(script)) {
29+
const { tokenImporters } = script.generated.root[CMK_DATA_KEY].cssModule;
30+
for (const { from, fromLoc } of tokenImporters) {
31+
const resolved = resolver(from, { request: fileName });
32+
if (!resolved) continue;
33+
links.push({
34+
fileName: resolved,
35+
textSpan: { start: fromLoc.start.offset, length: fromLoc.end.offset - fromLoc.start.offset },
36+
});
37+
}
38+
}
39+
return { response: { result: links } };
40+
};
41+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type ts from 'typescript';
2+
import type { CSSModulesKitRenameHandlerResponse, CSSModulesKitRenameRequest } from '../type.js';
3+
4+
export function createRenameHandler(_ts: typeof ts, _project: ts.server.Project) {
5+
return (request: CSSModulesKitRenameRequest): CSSModulesKitRenameHandlerResponse => {
6+
const project = _project.projectService.getDefaultProjectForFile(
7+
_ts.server.toNormalizedPath(request.arguments.fileName),
8+
true,
9+
);
10+
if (!project) return {};
11+
const languageService = project.getLanguageService();
12+
const { fileName, position } = request.arguments;
13+
const result = languageService.findRenameLocations(fileName, position, false, false, {});
14+
return { response: { result } };
15+
};
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type ts from 'typescript';
2+
import type { CSSModulesKitRenameInfoHandlerResponse, CSSModulesKitRenameInfoRequest } from '../type.js';
3+
4+
export function createRenameInfoHandler(_ts: typeof ts, _project: ts.server.Project) {
5+
return (request: CSSModulesKitRenameInfoRequest): CSSModulesKitRenameInfoHandlerResponse => {
6+
const project = _project.projectService.getDefaultProjectForFile(
7+
_ts.server.toNormalizedPath(request.arguments.fileName),
8+
true,
9+
);
10+
if (!project) return {};
11+
const languageService = project.getLanguageService();
12+
const { fileName, position } = request.arguments;
13+
const result = languageService.getRenameInfo(fileName, position, {});
14+
return { response: { result } };
15+
};
16+
}

0 commit comments

Comments
 (0)