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' ;
32import { createLanguageServiceEnvironment } from '@volar/language-server/lib/project/simpleProject' ;
43import { createConnection , createServer } from '@volar/language-server/node' ;
54import {
@@ -8,20 +7,15 @@ import {
87 createParsedCommandLineByJson ,
98 createVueLanguagePlugin ,
109 forEachEmbeddedCode ,
11- isReferencesEnabled ,
1210} from '@vue/language-core' ;
1311import {
1412 createLanguageService ,
1513 createUriMap ,
1614 createVueLanguageServicePlugins ,
17- type DocumentsAndMap ,
18- getSourceRange ,
1915 type LanguageService ,
2016} from '@vue/language-service' ;
2117import * as ts from 'typescript' ;
2218import { URI } from 'vscode-uri' ;
23- import { analyze } from './lib/reactivityAnalyze' ;
24- import { getLanguageService } from './lib/reactivityAnalyzeLS' ;
2519
2620const connection = createConnection ( ) ;
2721const server = createServer ( connection ) ;
@@ -129,6 +123,9 @@ connection.onInitialize(params => {
129123 getImportPathForFile ( ...args ) {
130124 return sendTsServerRequest ( '_vue:getImportPathForFile' , args ) ;
131125 } ,
126+ getReactiveReferences ( ...args ) {
127+ return sendTsServerRequest ( '_vue:getReactiveReferences' , args ) ;
128+ } ,
132129 isRefAtPosition ( ...args ) {
133130 return sendTsServerRequest ( '_vue:isRefAtPosition' , args ) ;
134131 } ,
@@ -246,154 +243,3 @@ connection.onRequest('vue/interpolationRanges', async (params: {
246243 }
247244 return [ ] ;
248245} ) ;
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