1
1
import * as embedded from '@volar/language-service' ;
2
2
import * as vscode from 'vscode-languageserver' ;
3
3
import { AutoInsertRequest , FindFileReferenceRequest , ShowReferencesNotification } from '../protocol' ;
4
+ import { CancellactionTokenHost } from '../utils/cancellationPipe' ;
4
5
import type { Workspaces } from '../utils/workspaces' ;
6
+ import * as shared from '@volar/shared' ;
5
7
6
8
export function register (
7
9
connection : vscode . Connection ,
8
10
projects : Workspaces ,
9
11
initParams : vscode . InitializeParams ,
12
+ cancelHost : CancellactionTokenHost ,
10
13
) {
11
14
12
15
let lastCompleteUri : string ;
@@ -15,7 +18,7 @@ export function register(
15
18
let lastCodeActionLs : embedded . LanguageService ;
16
19
let lastCallHierarchyLs : embedded . LanguageService ;
17
20
18
- connection . onCompletion ( async params => {
21
+ connection . onCompletion ( async ( params ) => {
19
22
return worker ( params . textDocument . uri , async vueLs => {
20
23
lastCompleteUri = params . textDocument . uri ;
21
24
lastCompleteLs = vueLs ;
@@ -32,44 +35,43 @@ export function register(
32
35
return list ;
33
36
} ) ;
34
37
} ) ;
35
- connection . onCompletionResolve ( async item => {
38
+ connection . onCompletionResolve ( async ( item ) => {
36
39
if ( lastCompleteUri && lastCompleteLs ) {
37
40
item = await lastCompleteLs . doCompletionResolve ( item ) ;
38
41
fixTextEdit ( item ) ;
39
42
}
40
43
return item ;
41
44
} ) ;
42
- connection . onHover ( async params => {
45
+ connection . onHover ( async ( params ) => {
43
46
return worker ( params . textDocument . uri , vueLs => {
44
47
return vueLs . doHover ( params . textDocument . uri , params . position ) ;
45
48
} ) ;
46
49
} ) ;
47
- connection . onSignatureHelp ( async params => {
50
+ connection . onSignatureHelp ( async ( params ) => {
48
51
return worker ( params . textDocument . uri , vueLs => {
49
52
return vueLs . getSignatureHelp ( params . textDocument . uri , params . position , params . context ) ;
50
53
} ) ;
51
54
} ) ;
52
- connection . onPrepareRename ( async params => {
55
+ connection . onPrepareRename ( async ( params ) => {
53
56
return worker ( params . textDocument . uri , vueLs => {
54
57
return vueLs . prepareRename ( params . textDocument . uri , params . position ) ;
55
58
} ) ;
56
59
} ) ;
57
- connection . onRenameRequest ( async params => {
60
+ connection . onRenameRequest ( async ( params ) => {
58
61
return worker ( params . textDocument . uri , vueLs => {
59
62
return vueLs . doRename ( params . textDocument . uri , params . position , params . newName ) ;
60
63
} ) ;
61
64
} ) ;
62
- connection . onCodeLens ( async params => {
65
+ connection . onCodeLens ( async ( params ) => {
63
66
return worker ( params . textDocument . uri , async vueLs => {
64
67
lastCodeLensLs = vueLs ;
65
68
return vueLs . doCodeLens ( params . textDocument . uri ) ;
66
69
} ) ;
67
70
} ) ;
68
- connection . onCodeLensResolve ( async codeLens => {
71
+ connection . onCodeLensResolve ( async ( codeLens ) => {
69
72
return await lastCodeLensLs ?. doCodeLensResolve ( codeLens ) ?? codeLens ;
70
73
} ) ;
71
74
connection . onExecuteCommand ( async ( params , token , workDoneProgress ) => {
72
-
73
75
if ( params . command === embedded . executePluginCommand ) {
74
76
75
77
const args = params . arguments as embedded . ExecutePluginCommandArgs | undefined ;
@@ -87,7 +89,7 @@ export function register(
87
89
} ) ;
88
90
}
89
91
} ) ;
90
- connection . onCodeAction ( async params => {
92
+ connection . onCodeAction ( async ( params ) => {
91
93
return worker ( params . textDocument . uri , async vueLs => {
92
94
lastCodeActionLs = vueLs ;
93
95
let codeActions = await vueLs . doCodeActions ( params . textDocument . uri , params . range , params . context ) ?? [ ] ;
@@ -105,46 +107,47 @@ export function register(
105
107
return codeActions ;
106
108
} ) ;
107
109
} ) ;
108
- connection . onCodeActionResolve ( async codeAction => {
110
+ connection . onCodeActionResolve ( async ( codeAction ) => {
109
111
return await lastCodeActionLs . doCodeActionResolve ( codeAction ) ?? codeAction ;
110
112
} ) ;
111
- connection . onReferences ( async params => {
113
+ connection . onReferences ( async ( params ) => {
112
114
return worker ( params . textDocument . uri , vueLs => {
113
115
return vueLs . findReferences ( params . textDocument . uri , params . position ) ;
114
116
} ) ;
115
117
} ) ;
116
- connection . onRequest ( FindFileReferenceRequest . type , async params => {
118
+ connection . onRequest ( FindFileReferenceRequest . type , async ( params ) => {
117
119
return worker ( params . textDocument . uri , vueLs => {
118
120
return vueLs . findFileReferences ( params . textDocument . uri ) ;
119
121
} ) ;
120
122
} ) ;
121
- connection . onImplementation ( async params => {
123
+ connection . onImplementation ( async ( params ) => {
122
124
return worker ( params . textDocument . uri , vueLs => {
123
125
return vueLs . findImplementations ( params . textDocument . uri , params . position ) ;
124
126
} ) ;
125
127
} ) ;
126
- connection . onDefinition ( async params => {
128
+ connection . onDefinition ( async ( params ) => {
127
129
return worker ( params . textDocument . uri , vueLs => {
128
130
return vueLs . findDefinition ( params . textDocument . uri , params . position ) ;
129
131
} ) ;
130
132
} ) ;
131
- connection . onTypeDefinition ( async params => {
133
+ connection . onTypeDefinition ( async ( params ) => {
132
134
return worker ( params . textDocument . uri , vueLs => {
133
135
return vueLs . findTypeDefinition ( params . textDocument . uri , params . position ) ;
134
136
} ) ;
135
137
} ) ;
136
- connection . onDocumentHighlight ( async params => {
138
+ connection . onDocumentHighlight ( async ( params ) => {
137
139
return worker ( params . textDocument . uri , vueLs => {
138
140
return vueLs . findDocumentHighlights ( params . textDocument . uri , params . position ) ;
139
141
} ) ;
140
142
} ) ;
141
- connection . onDocumentLinks ( async params => {
143
+ connection . onDocumentLinks ( async ( params ) => {
142
144
return worker ( params . textDocument . uri , vueLs => {
143
145
return vueLs . findDocumentLinks ( params . textDocument . uri ) ;
144
146
} ) ;
145
147
} ) ;
146
148
connection . onWorkspaceSymbol ( async ( params , token ) => {
147
149
150
+
148
151
let results : vscode . SymbolInformation [ ] = [ ] ;
149
152
150
153
for ( const _workspace of projects . workspaces . values ( ) ) {
@@ -164,19 +167,21 @@ export function register(
164
167
165
168
return results ;
166
169
} ) ;
167
- connection . languages . callHierarchy . onPrepare ( async params => {
170
+ connection . languages . callHierarchy . onPrepare ( async ( params ) => {
168
171
return await worker ( params . textDocument . uri , async vueLs => {
169
172
lastCallHierarchyLs = vueLs ;
170
173
return vueLs . callHierarchy . doPrepare ( params . textDocument . uri , params . position ) ;
171
174
} ) ?? [ ] ;
172
175
} ) ;
173
- connection . languages . callHierarchy . onIncomingCalls ( async params => {
176
+ connection . languages . callHierarchy . onIncomingCalls ( async ( params ) => {
174
177
return await lastCallHierarchyLs ?. callHierarchy . getIncomingCalls ( params . item ) ?? [ ] ;
175
178
} ) ;
176
- connection . languages . callHierarchy . onOutgoingCalls ( async params => {
179
+ connection . languages . callHierarchy . onOutgoingCalls ( async ( params ) => {
177
180
return await lastCallHierarchyLs ?. callHierarchy . getOutgoingCalls ( params . item ) ?? [ ] ;
178
181
} ) ;
179
182
connection . languages . semanticTokens . on ( async ( params , token , _ , resultProgress ) => {
183
+ await shared . sleep ( 200 ) ;
184
+ if ( token . isCancellationRequested ) return buildTokens ( [ ] ) ;
180
185
return await worker ( params . textDocument . uri , async vueLs => {
181
186
182
187
const result = await vueLs ?. getSemanticTokens (
@@ -190,6 +195,8 @@ export function register(
190
195
} ) ?? buildTokens ( [ ] ) ;
191
196
} ) ;
192
197
connection . languages . semanticTokens . onRange ( async ( params , token , _ , resultProgress ) => {
198
+ await shared . sleep ( 200 ) ;
199
+ if ( token . isCancellationRequested ) return buildTokens ( [ ] ) ;
193
200
return await worker ( params . textDocument . uri , async vueLs => {
194
201
195
202
const result = await vueLs ?. getSemanticTokens (
@@ -202,9 +209,10 @@ export function register(
202
209
return buildTokens ( result ) ;
203
210
} ) ?? buildTokens ( [ ] ) ;
204
211
} ) ;
205
- connection . languages . diagnostics . on ( async ( params , cancellationToken , workDoneProgressReporter , resultProgressReporter ) => {
212
+ connection . languages . diagnostics . on ( async ( params , token , workDoneProgressReporter , resultProgressReporter ) => {
213
+ token = cancelHost . createCancellactionToken ( token ) ;
206
214
const result = await worker ( params . textDocument . uri , vueLs => {
207
- return vueLs . doValidation ( params . textDocument . uri , errors => {
215
+ return vueLs . doValidation ( params . textDocument . uri , token , errors => {
208
216
// resultProgressReporter is undefined in vscode
209
217
resultProgressReporter ?. report ( {
210
218
relatedDocuments : {
@@ -214,15 +222,15 @@ export function register(
214
222
} ,
215
223
} ,
216
224
} ) ;
217
- } , cancellationToken ) ;
225
+ } ) ;
218
226
} ) ;
219
227
return {
220
228
kind : vscode . DocumentDiagnosticReportKind . Full ,
221
229
items : result ?? [ ] ,
222
230
} ;
223
231
} ) ;
224
232
connection . languages . inlayHint . on ( async params => {
225
- return worker ( params . textDocument . uri , vueLs => {
233
+ return worker ( params . textDocument . uri , async vueLs => {
226
234
return vueLs . getInlayHints ( params . textDocument . uri , params . range ) ;
227
235
} ) ;
228
236
} ) ;
@@ -253,7 +261,12 @@ export function register(
253
261
async function worker < T > ( uri : string , cb : ( vueLs : embedded . LanguageService ) => T ) {
254
262
const vueLs = await getLanguageService ( uri ) ;
255
263
if ( vueLs ) {
256
- return cb ( vueLs ) ;
264
+ try {
265
+ return cb ( vueLs ) ; // handle for TS cancel throw
266
+ }
267
+ catch {
268
+ return undefined ;
269
+ }
257
270
}
258
271
}
259
272
function buildTokens ( tokens : embedded . SemanticToken [ ] ) {
0 commit comments