1
1
/* eslint-disable sonarjs/no-duplicate-string */
2
2
import * as monaco from 'monaco-editor' ;
3
- import type * as vscode from 'vscode-languageserver-protocol' ;
3
+ import * as vscode from 'vscode-languageserver-protocol' ;
4
4
import * as ts from 'typescript/lib/tsserverlibrary' ;
5
- import { createLanguageService , type LanguageService , type LanguageServiceHost } from '@volar/vue-language-service' ;
5
+ import { createLanguageService , getDocumentService , type LanguageService , type LanguageServiceHost } from '@volar/vue-language-service' ;
6
6
import type { Ref } from 'vue' ;
7
7
import { onBeforeUnmount , ref } from 'vue' ;
8
8
import * as code2monaco from './code2monaco' ;
@@ -190,9 +190,11 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
190
190
tsWithAny . setSys ( sys ) ;
191
191
192
192
const ls = createLanguageService ( { typescript : ts } , host , undefined , undefined , undefined , [ ] ) ;
193
+ const ds = getDocumentService ( { typescript : ts } , undefined , undefined , [ ] ) ;
193
194
disposables . value . push ( ls ) ;
194
195
195
196
const completionItems = new WeakMap < monaco . languages . CompletionItem , vscode . CompletionItem > ( ) ;
197
+ const documents = new WeakMap < monaco . editor . ITextModel , vscode . TextDocument > ( ) ;
196
198
197
199
disposables . value . push (
198
200
// TODO: registerTokensProviderFactory
@@ -222,6 +224,43 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
222
224
}
223
225
} ,
224
226
} ) ,
227
+ monaco . languages . registerSignatureHelpProvider ( lang , {
228
+ signatureHelpTriggerCharacters : [ '(' , ',' ] ,
229
+ provideSignatureHelp : async ( model , position ) => {
230
+ const codeResult = await ls . getSignatureHelp (
231
+ model . uri . toString ( ) ,
232
+ monaco2code . asPosition ( position ) ,
233
+ ) ;
234
+ if ( codeResult ) {
235
+ return {
236
+ value : code2monaco . asSignatureHelp ( codeResult ) ,
237
+ dispose : ( ) => { } ,
238
+ } ;
239
+ }
240
+ } ,
241
+ } ) ,
242
+ monaco . languages . registerHoverProvider ( lang , {
243
+ provideHover : async ( model , position ) => {
244
+ const codeResult = await ls . doHover (
245
+ model . uri . toString ( ) ,
246
+ monaco2code . asPosition ( position ) ,
247
+ ) ;
248
+ if ( codeResult ) {
249
+ return code2monaco . asHover ( codeResult ) ;
250
+ }
251
+ } ,
252
+ } ) ,
253
+ monaco . languages . registerDocumentSymbolProvider ( lang , {
254
+ provideDocumentSymbols : async ( model ) => {
255
+ const document = documents . get ( model ) ;
256
+ if ( document ) {
257
+ const codeResult = await ds . findDocumentSymbols ( document ) ;
258
+ if ( codeResult ) {
259
+ return codeResult . map ( code2monaco . asDocumentSymbol ) ;
260
+ }
261
+ }
262
+ } ,
263
+ } ) ,
225
264
monaco . languages . registerCompletionItemProvider ( lang , {
226
265
// https://github.com/johnsoncodehk/volar/blob/2f786182250d27e99cc3714fbfc7d209616e2289/packages/vue-language-server/src/registers/registerlanguageFeatures.ts#L57
227
266
triggerCharacters : '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ ' . split ( '' ) ,
@@ -249,17 +288,6 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
249
288
return monacoItem ;
250
289
} ,
251
290
} ) ,
252
- monaco . languages . registerHoverProvider ( lang , {
253
- provideHover : async ( model , position ) => {
254
- const codeResult = await ls . doHover (
255
- model . uri . toString ( ) ,
256
- monaco2code . asPosition ( position ) ,
257
- ) ;
258
- if ( codeResult ) {
259
- return code2monaco . asHover ( codeResult ) ;
260
- }
261
- } ,
262
- } ) ,
263
291
monaco . languages . registerDefinitionProvider ( lang , {
264
292
provideDefinition : async ( model , position ) => {
265
293
const codeResult = await ls . findDefinition (
@@ -272,24 +300,23 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
272
300
}
273
301
} ,
274
302
} ) ,
275
- monaco . languages . registerSignatureHelpProvider ( lang , {
276
- signatureHelpTriggerCharacters : [ '(' , ',' ] ,
277
- provideSignatureHelp : async ( model , position ) => {
278
- const codeResult = await ls . getSignatureHelp (
279
- model . uri . toString ( ) ,
280
- monaco2code . asPosition ( position ) ,
281
- ) ;
282
- if ( codeResult ) {
283
- return {
284
- value : code2monaco . asSignatureHelp ( codeResult ) ,
285
- dispose : ( ) => { } ,
286
- } ;
287
- }
288
- } ,
289
- } ) ,
290
303
) ;
291
304
292
305
return ls ;
306
+
307
+ function getTextDocument ( model : monaco . editor . ITextModel ) {
308
+ let document = documents . get ( model ) ;
309
+ if ( ! document || document . version !== model . getVersionId ( ) ) {
310
+ document = vscode . TextDocument . create (
311
+ model . uri . toString ( ) ,
312
+ model . getLanguageId ( ) ,
313
+ model . getVersionId ( ) ,
314
+ model . getValue ( ) ,
315
+ ) ;
316
+ documents . set ( model , document ) ;
317
+ }
318
+ return document ;
319
+ }
293
320
}
294
321
295
322
export function setupValidate ( editor : monaco . editor . IStandaloneCodeEditor , ls : LanguageService ) {
0 commit comments