1
- import type { LanguageServer , Position , TextDocumentIdentifier } from '@volar/language-server' ;
2
- import { type Range , TextDocument } from '@volar/language-server' ;
1
+ import type { LanguageServer , TextDocumentIdentifier } from '@volar/language-server' ;
3
2
import { createLanguageServiceEnvironment } from '@volar/language-server/lib/project/simpleProject' ;
4
3
import { createConnection , createServer } from '@volar/language-server/node' ;
5
4
import {
@@ -8,20 +7,15 @@ import {
8
7
createParsedCommandLineByJson ,
9
8
createVueLanguagePlugin ,
10
9
forEachEmbeddedCode ,
11
- isReferencesEnabled ,
12
10
} from '@vue/language-core' ;
13
11
import {
14
12
createLanguageService ,
15
13
createUriMap ,
16
14
createVueLanguageServicePlugins ,
17
- type DocumentsAndMap ,
18
- getSourceRange ,
19
15
type LanguageService ,
20
16
} from '@vue/language-service' ;
21
17
import * as ts from 'typescript' ;
22
18
import { URI } from 'vscode-uri' ;
23
- import { analyze } from './lib/reactivityAnalyze' ;
24
- import { getLanguageService } from './lib/reactivityAnalyzeLS' ;
25
19
26
20
const connection = createConnection ( ) ;
27
21
const server = createServer ( connection ) ;
@@ -129,6 +123,9 @@ connection.onInitialize(params => {
129
123
getImportPathForFile ( ...args ) {
130
124
return sendTsServerRequest ( '_vue:getImportPathForFile' , args ) ;
131
125
} ,
126
+ getReactiveReferences ( ...args ) {
127
+ return sendTsServerRequest ( '_vue:getReactiveReferences' , args ) ;
128
+ } ,
132
129
isRefAtPosition ( ...args ) {
133
130
return sendTsServerRequest ( '_vue:isRefAtPosition' , args ) ;
134
131
} ,
@@ -246,154 +243,3 @@ connection.onRequest('vue/interpolationRanges', async (params: {
246
243
}
247
244
return [ ] ;
248
245
} ) ;
249
-
250
- const cacheDocuments = new Map < string , [ TextDocument , import ( 'typescript' ) . IScriptSnapshot ] > ( ) ;
251
-
252
- connection . onRequest ( 'vue/reactivityAnalyze' , async ( params : {
253
- textDocument : TextDocumentIdentifier ;
254
- position : Position ;
255
- syncDocument ?: {
256
- content : string ;
257
- languageId : string ;
258
- } ;
259
- } ) : Promise <
260
- {
261
- subscribers : Range [ ] ;
262
- dependencies : Range [ ] ;
263
- } | undefined
264
- > => {
265
- if ( params . syncDocument ) {
266
- const document = TextDocument . create (
267
- params . textDocument . uri ,
268
- params . syncDocument . languageId ,
269
- 0 ,
270
- params . syncDocument . content ,
271
- ) ;
272
- const snapshot = ts . ScriptSnapshot . fromString ( params . syncDocument . content ) ;
273
- cacheDocuments . set ( params . textDocument . uri , [ document , snapshot ] ) ;
274
- }
275
- const uri = URI . parse ( params . textDocument . uri ) ;
276
- const languageService = await server . project . getLanguageService ( uri ) ;
277
- const sourceScript = languageService . context . language . scripts . get ( uri ) ;
278
- let document : TextDocument | undefined ;
279
- let snapshot : import ( 'typescript' ) . IScriptSnapshot | undefined ;
280
- if ( sourceScript ) {
281
- document = languageService . context . documents . get ( sourceScript . id , sourceScript . languageId , sourceScript . snapshot ) ;
282
- snapshot = sourceScript . snapshot ;
283
- }
284
- else if ( cacheDocuments . has ( params . textDocument . uri ) ) {
285
- const [ doc , snap ] = cacheDocuments . get ( params . textDocument . uri ) ! ;
286
- document = doc ;
287
- snapshot = snap ;
288
- }
289
- if ( ! document || ! snapshot ) {
290
- return ;
291
- }
292
- let offset = document . offsetAt ( params . position ) ;
293
- if ( sourceScript ?. generated ) {
294
- const serviceScript = sourceScript . generated . languagePlugin . typescript ?. getServiceScript (
295
- sourceScript . generated . root ,
296
- ) ;
297
- if ( ! serviceScript ) {
298
- return ;
299
- }
300
- const map = languageService . context . language . maps . get ( serviceScript . code , sourceScript ) ;
301
- let embeddedOffset : number | undefined ;
302
- for ( const [ mapped , mapping ] of map . toGeneratedLocation ( offset ) ) {
303
- if ( isReferencesEnabled ( mapping . data ) ) {
304
- embeddedOffset = mapped ;
305
- break ;
306
- }
307
- }
308
- if ( embeddedOffset === undefined ) {
309
- return ;
310
- }
311
- offset = embeddedOffset ;
312
-
313
- const embeddedUri = languageService . context . encodeEmbeddedDocumentUri ( sourceScript . id , serviceScript . code . id ) ;
314
- document = languageService . context . documents . get (
315
- embeddedUri ,
316
- serviceScript . code . languageId ,
317
- serviceScript . code . snapshot ,
318
- ) ;
319
- snapshot = serviceScript . code . snapshot ;
320
- }
321
- const { languageService : tsLs , fileName } = getLanguageService ( ts , snapshot , document . languageId ) ;
322
- const result = analyze ( ts , tsLs , fileName , offset ) ;
323
- if ( ! result ) {
324
- return ;
325
- }
326
- const subscribers : Range [ ] = [ ] ;
327
- const dependencies : Range [ ] = [ ] ;
328
- if ( sourceScript ?. generated ) {
329
- const serviceScript = sourceScript . generated . languagePlugin . typescript ?. getServiceScript (
330
- sourceScript . generated . root ,
331
- ) ;
332
- if ( ! serviceScript ) {
333
- return ;
334
- }
335
- const docs : DocumentsAndMap = [
336
- languageService . context . documents . get ( sourceScript . id , sourceScript . languageId , sourceScript . snapshot ) ,
337
- document ,
338
- languageService . context . language . maps . get ( serviceScript . code , sourceScript ) ,
339
- ] ;
340
- for ( const dependency of result . dependencies ) {
341
- let start = document . positionAt ( dependency . getStart ( result . sourceFile ) ) ;
342
- let end = document . positionAt ( dependency . getEnd ( ) ) ;
343
- if ( ts . isBlock ( dependency ) && dependency . statements . length ) {
344
- const { statements } = dependency ;
345
- start = document . positionAt ( statements [ 0 ] ! . getStart ( result . sourceFile ) ) ;
346
- end = document . positionAt ( statements [ statements . length - 1 ] ! . getEnd ( ) ) ;
347
- }
348
- const sourceRange = getSourceRange ( docs , { start, end } ) ;
349
- if ( sourceRange ) {
350
- dependencies . push ( sourceRange ) ;
351
- }
352
- }
353
- for ( const subscriber of result . subscribers ) {
354
- if ( ! subscriber . sideEffectInfo ) {
355
- continue ;
356
- }
357
- let start = document . positionAt ( subscriber . sideEffectInfo . handler . getStart ( result . sourceFile ) ) ;
358
- let end = document . positionAt ( subscriber . sideEffectInfo . handler . getEnd ( ) ) ;
359
- if ( ts . isBlock ( subscriber . sideEffectInfo . handler ) && subscriber . sideEffectInfo . handler . statements . length ) {
360
- const { statements } = subscriber . sideEffectInfo . handler ;
361
- start = document . positionAt ( statements [ 0 ] ! . getStart ( result . sourceFile ) ) ;
362
- end = document . positionAt ( statements [ statements . length - 1 ] ! . getEnd ( ) ) ;
363
- }
364
- const sourceRange = getSourceRange ( docs , { start, end } ) ;
365
- if ( sourceRange ) {
366
- subscribers . push ( sourceRange ) ;
367
- }
368
- }
369
- }
370
- else {
371
- for ( const dependency of result . dependencies ) {
372
- let start = document . positionAt ( dependency . getStart ( result . sourceFile ) ) ;
373
- let end = document . positionAt ( dependency . getEnd ( ) ) ;
374
- if ( ts . isBlock ( dependency ) && dependency . statements . length ) {
375
- const { statements } = dependency ;
376
- start = document . positionAt ( statements [ 0 ] ! . getStart ( result . sourceFile ) ) ;
377
- end = document . positionAt ( statements [ statements . length - 1 ] ! . getEnd ( ) ) ;
378
- }
379
- dependencies . push ( { start, end } ) ;
380
- }
381
- for ( const subscriber of result . subscribers ) {
382
- if ( ! subscriber . sideEffectInfo ) {
383
- continue ;
384
- }
385
- let start = document . positionAt ( subscriber . sideEffectInfo . handler . getStart ( result . sourceFile ) ) ;
386
- let end = document . positionAt ( subscriber . sideEffectInfo . handler . getEnd ( ) ) ;
387
- if ( ts . isBlock ( subscriber . sideEffectInfo . handler ) && subscriber . sideEffectInfo . handler . statements . length ) {
388
- const { statements } = subscriber . sideEffectInfo . handler ;
389
- start = document . positionAt ( statements [ 0 ] ! . getStart ( result . sourceFile ) ) ;
390
- end = document . positionAt ( statements [ statements . length - 1 ] ! . getEnd ( ) ) ;
391
- }
392
- subscribers . push ( { start, end } ) ;
393
- }
394
- }
395
- return {
396
- subscribers,
397
- dependencies,
398
- } ;
399
- } ) ;
0 commit comments