@@ -18,23 +18,22 @@ export function register(
18
18
params : vscode . InitializeParams ,
19
19
) {
20
20
connection . onCompletion ( async handler => {
21
- const list = await getProjects ( )
22
- ?. get ( handler . textDocument . uri ) ?. service
23
- . doComplete (
24
- handler . textDocument . uri ,
25
- handler . position ,
26
- handler . context ,
27
- async ( ) => await configuration ?. getConfiguration ( 'volar.completion.autoImportComponent' ) ?? true ,
28
- async ( uri ) => {
29
- if ( features . completion ?. getDocumentNameCasesRequest ) {
30
- return await connection . sendRequest ( shared . GetDocumentNameCasesRequest . type , { uri } ) ;
31
- }
32
- return {
33
- tagNameCase : features . completion ! . defaultTagNameCase ,
34
- attrNameCase : features . completion ! . defaultAttrNameCase ,
35
- } ;
36
- } ,
37
- ) ;
21
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
22
+ const list = await languageService ?. doComplete (
23
+ handler . textDocument . uri ,
24
+ handler . position ,
25
+ handler . context ,
26
+ async ( ) => await configuration ?. getConfiguration ( 'volar.completion.autoImportComponent' ) ?? true ,
27
+ async ( uri ) => {
28
+ if ( features . completion ?. getDocumentNameCasesRequest ) {
29
+ return await connection . sendRequest ( shared . GetDocumentNameCasesRequest . type , { uri } ) ;
30
+ }
31
+ return {
32
+ tagNameCase : features . completion ! . defaultTagNameCase ,
33
+ attrNameCase : features . completion ! . defaultAttrNameCase ,
34
+ } ;
35
+ } ,
36
+ ) ;
38
37
const insertReplaceSupport = params . capabilities . textDocument ?. completion ?. completionItem ?. insertReplaceSupport ?? false ;
39
38
if ( ! insertReplaceSupport && list ) {
40
39
for ( const item of list . items ) {
@@ -52,50 +51,44 @@ export function register(
52
51
? await connection . sendRequest ( shared . GetEditorSelectionRequest . type )
53
52
: undefined ;
54
53
const newPosition = activeSel ?. textDocument . uri . toLowerCase ( ) === uri . toLowerCase ( ) ? activeSel . position : undefined ;
55
- return getProjects ( ) ?. get ( uri ) ?. service . doCompletionResolve ( item , newPosition ) ?? item ;
54
+ const languageService = await getLanguageService ( uri ) ;
55
+ return languageService ?. doCompletionResolve ( item , newPosition ) ?? item ;
56
56
} ) ;
57
57
connection . onHover ( async handler => {
58
- return await getProjects ( )
59
- ?. get ( handler . textDocument . uri ) ?. service
60
- . doHover ( handler . textDocument . uri , handler . position ) ;
58
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
59
+ return languageService ?. doHover ( handler . textDocument . uri , handler . position ) ;
61
60
} ) ;
62
- connection . onSignatureHelp ( handler => {
63
- return getProjects ( )
64
- ?. get ( handler . textDocument . uri ) ?. service
65
- . getSignatureHelp ( handler . textDocument . uri , handler . position , handler . context ) ;
61
+ connection . onSignatureHelp ( async handler => {
62
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
63
+ return languageService ?. getSignatureHelp ( handler . textDocument . uri , handler . position , handler . context ) ;
66
64
} ) ;
67
- connection . onPrepareRename ( handler => {
68
- return getProjects ( )
69
- ?. get ( handler . textDocument . uri ) ?. service
70
- . prepareRename ( handler . textDocument . uri , handler . position ) ;
65
+ connection . onPrepareRename ( async handler => {
66
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
67
+ return languageService ?. prepareRename ( handler . textDocument . uri , handler . position ) ;
71
68
} ) ;
72
69
connection . onRenameRequest ( async handler => {
73
- return await getProjects ( )
74
- ?. get ( handler . textDocument . uri ) ?. service
75
- . doRename ( handler . textDocument . uri , handler . position , handler . newName ) ;
70
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
71
+ return languageService ?. doRename ( handler . textDocument . uri , handler . position , handler . newName ) ;
76
72
} ) ;
77
73
connection . onCodeLens ( async handler => {
78
- return getProjects ( )
79
- ?. get ( handler . textDocument . uri ) ?. service
80
- . getCodeLens ( handler . textDocument . uri , await lsConfigs ?. getCodeLensConfigs ( ) ) ;
74
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
75
+ return languageService ?. getCodeLens ( handler . textDocument . uri , await lsConfigs ?. getCodeLensConfigs ( ) ) ;
81
76
} ) ;
82
- connection . onCodeLensResolve ( codeLens => {
77
+ connection . onCodeLensResolve ( async codeLens => {
83
78
const uri = codeLens . data ?. uri ;
84
- return getProjects ( )
85
- ?. get ( uri ) ?. service
86
- . doCodeLensResolve ( codeLens , typeof features . codeLens === 'object' && features . codeLens . showReferencesNotification ) ?? codeLens ;
79
+ const languageService = await getLanguageService ( uri ) ;
80
+ return languageService ?. doCodeLensResolve ( codeLens , typeof features . codeLens === 'object' && features . codeLens . showReferencesNotification ) ?? codeLens ;
87
81
} ) ;
88
- connection . onExecuteCommand ( handler => {
82
+ connection . onExecuteCommand ( async handler => {
89
83
const uri = handler . arguments ?. [ 0 ] ;
90
- return getProjects ( )
91
- ?. get ( uri ) ?. service
92
- . __internal__ . executeCommand ( uri , handler . command , handler . arguments , connection ) ;
84
+ const languageService = await getLanguageService ( uri ) ;
85
+ languageService ?. __internal__ . executeCommand ( uri , handler . command , handler . arguments , connection ) ;
93
86
} ) ;
94
87
connection . onCodeAction ( async handler => {
95
88
const uri = handler . textDocument . uri ;
96
- const project = getProjects ( ) ?. get ( uri ) ;
97
- if ( project ) {
98
- const codeActions = await project . service . getCodeActions ( uri , handler . range , handler . context ) ;
89
+ const languageService = await getLanguageService ( uri ) ;
90
+ if ( languageService ) {
91
+ const codeActions = await languageService . getCodeActions ( uri , handler . range , handler . context ) ;
99
92
for ( const codeAction of codeActions ) {
100
93
if ( codeAction . data && typeof codeAction . data === 'object' ) {
101
94
( codeAction . data as any ) . uri = uri ;
@@ -109,59 +102,60 @@ export function register(
109
102
} ) ;
110
103
connection . onCodeActionResolve ( async codeAction => {
111
104
const uri : string | undefined = ( codeAction . data as any ) ?. uri ;
112
- const project = uri ? getProjects ( ) ?. get ( uri ) : undefined ;
113
- if ( project ) {
114
- return await project . service . doCodeActionResolve ( codeAction ) ;
105
+ if ( uri ) {
106
+ const languageService = await getLanguageService ( uri ) ;
107
+ if ( languageService ) {
108
+ return languageService . doCodeActionResolve ( codeAction ) ;
109
+ }
115
110
}
116
111
return codeAction ;
117
112
} ) ;
118
113
connection . onReferences ( async handler => {
119
- return await getProjects ( )
120
- ?. get ( handler . textDocument . uri ) ?. service
121
- . findReferences ( handler . textDocument . uri , handler . position ) ;
114
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
115
+ return languageService ?. findReferences ( handler . textDocument . uri , handler . position ) ;
122
116
} ) ;
123
117
connection . onDefinition ( async handler => {
124
- return await getProjects ( )
125
- ?. get ( handler . textDocument . uri ) ?. service
126
- . findDefinition ( handler . textDocument . uri , handler . position ) ;
118
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
119
+ return languageService ?. findDefinition ( handler . textDocument . uri , handler . position ) ;
127
120
} ) ;
128
- connection . onTypeDefinition ( handler => {
129
- return getProjects ( )
130
- ?. get ( handler . textDocument . uri ) ?. service
131
- . findTypeDefinition ( handler . textDocument . uri , handler . position ) ;
121
+ connection . onTypeDefinition ( async handler => {
122
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
123
+ return languageService ?. findTypeDefinition ( handler . textDocument . uri , handler . position ) ;
132
124
} ) ;
133
- connection . onDocumentHighlight ( handler => {
134
- return getProjects ( )
135
- ?. get ( handler . textDocument . uri ) ?. service
136
- . findDocumentHighlights ( handler . textDocument . uri , handler . position ) ;
125
+ connection . onDocumentHighlight ( async handler => {
126
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
127
+ return languageService ?. findDocumentHighlights ( handler . textDocument . uri , handler . position ) ;
137
128
} ) ;
138
129
connection . onDocumentLinks ( async handler => {
139
- return await getProjects ( )
140
- ?. get ( handler . textDocument . uri ) ?. service
141
- . findDocumentLinks ( handler . textDocument . uri ) ;
130
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
131
+ return languageService ?. findDocumentLinks ( handler . textDocument . uri ) ;
142
132
} ) ;
143
133
connection . onWorkspaceSymbol ( async ( handler , token ) => {
144
134
const projects = getProjects ( ) ;
145
135
if ( projects ) {
146
136
147
- const _projects = projects . projects . size ? projects . projects : projects . inferredProjects ;
148
137
let results : vscode . SymbolInformation [ ] = [ ] ;
149
138
150
- for ( const [ _ , project ] of _projects ) {
139
+ for ( const workspace of projects . workspaces . values ( ) ) {
140
+ let projects = [ ...workspace . projects . values ( ) ] ;
141
+ projects = projects . length ? projects : [ workspace . getInferredProject ( ) ] ;
142
+ for ( const project of projects ) {
151
143
152
- if ( token . isCancellationRequested )
153
- return ;
144
+ if ( token . isCancellationRequested )
145
+ return ;
154
146
155
- results = results . concat ( await project . getLanguageService ( ) . findWorkspaceSymbols ( handler . query ) ) ;
147
+ const languageService = await ( await project ) . getLanguageService ( ) ;
148
+
149
+ results = results . concat ( await languageService . findWorkspaceSymbols ( handler . query ) ) ;
150
+ }
156
151
}
157
152
158
153
return results ;
159
154
}
160
155
} ) ;
161
156
connection . languages . callHierarchy . onPrepare ( async handler => {
162
- const items = await getProjects ( )
163
- ?. get ( handler . textDocument . uri ) ?. service
164
- . callHierarchy . doPrepare ( handler . textDocument . uri , handler . position ) ;
157
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
158
+ const items = await languageService ?. callHierarchy . doPrepare ( handler . textDocument . uri , handler . position ) ;
165
159
if ( items ) {
166
160
for ( const item of items ) {
167
161
if ( typeof item . data !== 'object' ) item . data = { } ;
@@ -170,33 +164,29 @@ export function register(
170
164
}
171
165
return items ?. length ? items : null ;
172
166
} ) ;
173
- connection . languages . callHierarchy . onIncomingCalls ( handler => {
167
+ connection . languages . callHierarchy . onIncomingCalls ( async handler => {
174
168
const data = handler . item . data as { __uri ?: string } | undefined ;
175
169
const uri = data ?. __uri ?? handler . item . uri ;
176
- return getProjects ( )
177
- ?. get ( uri ) ?. service
178
- . callHierarchy . getIncomingCalls ( handler . item ) ?? [ ] ;
170
+ const languageService = await getLanguageService ( uri ) ;
171
+ return languageService ?. callHierarchy . getIncomingCalls ( handler . item ) ?? [ ] ;
179
172
} ) ;
180
- connection . languages . callHierarchy . onOutgoingCalls ( handler => {
173
+ connection . languages . callHierarchy . onOutgoingCalls ( async handler => {
181
174
const data = handler . item . data as { __uri ?: string } | undefined ;
182
175
const uri = data ?. __uri ?? handler . item . uri ;
183
- return getProjects ( )
184
- ?. get ( uri ) ?. service
185
- . callHierarchy . getOutgoingCalls ( handler . item ) ?? [ ] ;
176
+ const languageService = await getLanguageService ( uri ) ;
177
+ return languageService ?. callHierarchy . getOutgoingCalls ( handler . item ) ?? [ ] ;
186
178
} ) ;
187
179
connection . languages . semanticTokens . on ( async ( handler , token , _ , resultProgress ) => {
188
- const result = await getProjects ( )
189
- ?. get ( handler . textDocument . uri ) ?. service
190
- . getSemanticTokens ( handler . textDocument . uri , undefined , token , resultProgress ) ;
180
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
181
+ const result = await languageService ?. getSemanticTokens ( handler . textDocument . uri , undefined , token , resultProgress ) ;
191
182
return {
192
183
resultId : result ?. resultId ,
193
184
data : result ?. data ?? [ ] ,
194
185
} ;
195
186
} ) ;
196
187
connection . languages . semanticTokens . onRange ( async ( handler , token , _ , resultProgress ) => {
197
- const result = await getProjects ( )
198
- ?. get ( handler . textDocument . uri ) ?. service
199
- . getSemanticTokens ( handler . textDocument . uri , handler . range , token , resultProgress ) ;
188
+ const languageService = await getLanguageService ( handler . textDocument . uri ) ;
189
+ const result = await languageService ?. getSemanticTokens ( handler . textDocument . uri , handler . range , token , resultProgress ) ;
200
190
return {
201
191
resultId : result ?. resultId ,
202
192
data : result ?. data ?? [ ] ,
@@ -210,7 +200,7 @@ export function register(
210
200
if ( config === 'always' ) {
211
201
const renaming = new Promise < void > ( async resolve => {
212
202
for ( const file of handler . files ) {
213
- const renameFileContent = getScriptText ( ts , documents , shared . uriToFsPath ( file . oldUri ) ) ;
203
+ const renameFileContent = getScriptText ( documents , shared . uriToFsPath ( file . oldUri ) , ts . sys ) ;
214
204
if ( renameFileContent ) {
215
205
renameFileContentCache . set ( file . oldUri , renameFileContent ) ;
216
206
}
@@ -250,7 +240,8 @@ export function register(
250
240
async function worker ( ) {
251
241
const edits = ( await Promise . all ( handler . files
252
242
. map ( async file => {
253
- return await getProjects ( ) ?. get ( file . oldUri ) ?. service . getEditsForFileRename ( file . oldUri , file . newUri ) ;
243
+ const languageService = await getLanguageService ( file . oldUri ) ;
244
+ return languageService ?. getEditsForFileRename ( file . oldUri , file . newUri ) ;
254
245
} ) ) ) . filter ( shared . notEmpty ) ;
255
246
if ( edits . length ) {
256
247
const result = edits [ 0 ] ;
@@ -260,4 +251,10 @@ export function register(
260
251
return null ;
261
252
}
262
253
} ) ;
254
+
255
+ async function getLanguageService ( uri : string ) {
256
+ const projects = await getProjects ( ) ;
257
+ const project = ( await projects ?. getProject ( uri ) ) ?. project ;
258
+ return project ?. getLanguageService ( ) ;
259
+ }
263
260
}
0 commit comments