@@ -4,9 +4,11 @@ import { TsConfigFileNotFoundError } from '@css-modules-kit/core';
44import type { Language } from '@volar/language-core' ;
55import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/createLanguageServicePlugin.js' ;
66import type ts from 'typescript' ;
7- import { CMK_DATA_KEY , createCSSLanguagePlugin , isCSSModuleScript } from './language-plugin.js' ;
7+ import { createCSSLanguagePlugin } from './language-plugin.js' ;
88import { 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
1113const 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 } ;
0 commit comments