11/* eslint-disable sonarjs/no-duplicate-string */
22import * as monaco from 'monaco-editor' ;
3- import type * as vscode from 'vscode-languageserver-protocol' ;
3+ import * as vscode from 'vscode-languageserver-protocol' ;
44import * 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' ;
66import type { Ref } from 'vue' ;
77import { onBeforeUnmount , ref } from 'vue' ;
88import * as code2monaco from './code2monaco' ;
@@ -190,9 +190,11 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
190190 tsWithAny . setSys ( sys ) ;
191191
192192 const ls = createLanguageService ( { typescript : ts } , host , undefined , undefined , undefined , [ ] ) ;
193+ const ds = getDocumentService ( { typescript : ts } , undefined , undefined , [ ] ) ;
193194 disposables . value . push ( ls ) ;
194195
195196 const completionItems = new WeakMap < monaco . languages . CompletionItem , vscode . CompletionItem > ( ) ;
197+ const documents = new WeakMap < monaco . editor . ITextModel , vscode . TextDocument > ( ) ;
196198
197199 disposables . value . push (
198200 // TODO: registerTokensProviderFactory
@@ -222,6 +224,43 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
222224 }
223225 } ,
224226 } ) ,
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+ } ) ,
225264 monaco . languages . registerCompletionItemProvider ( lang , {
226265 // https://github.com/johnsoncodehk/volar/blob/2f786182250d27e99cc3714fbfc7d209616e2289/packages/vue-language-server/src/registers/registerlanguageFeatures.ts#L57
227266 triggerCharacters : '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ ' . split ( '' ) ,
@@ -249,17 +288,6 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
249288 return monacoItem ;
250289 } ,
251290 } ) ,
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- } ) ,
263291 monaco . languages . registerDefinitionProvider ( lang , {
264292 provideDefinition : async ( model , position ) => {
265293 const codeResult = await ls . findDefinition (
@@ -272,24 +300,23 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
272300 }
273301 } ,
274302 } ) ,
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- } ) ,
290303 ) ;
291304
292305 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+ }
293320}
294321
295322export function setupValidate ( editor : monaco . editor . IStandaloneCodeEditor , ls : LanguageService ) {
0 commit comments