@@ -2,6 +2,7 @@ import { createLanguageServicePlugin } from '@volar/typescript/lib/quickstart/cr
22import * as vue from '@vue/language-core' ;
33import type * as ts from 'typescript' ;
44import { createVueLanguageServiceProxy } from './lib/common' ;
5+ import type { Requests } from './lib/requests' ;
56import { collectExtractProps } from './lib/requests/collectExtractProps' ;
67import { getComponentDirectives } from './lib/requests/getComponentDirectives' ;
78import { getComponentEvents } from './lib/requests/getComponentEvents' ;
@@ -12,7 +13,6 @@ import { getElementAttrs } from './lib/requests/getElementAttrs';
1213import { getElementNames } from './lib/requests/getElementNames' ;
1314import { getImportPathForFile } from './lib/requests/getImportPathForFile' ;
1415import { getPropertiesAtLocation } from './lib/requests/getPropertiesAtLocation' ;
15- import type { RequestContext } from './lib/requests/types' ;
1616
1717const windowsPathReg = / \\ / g;
1818const project2Service = new WeakMap <
@@ -43,6 +43,7 @@ export = createLanguageServicePlugin(
4343 language ,
4444 info . languageService ,
4545 vueOptions ,
46+ fileName => fileName ,
4647 ) ;
4748
4849 // #3963
@@ -85,89 +86,131 @@ export = createLanguageServicePlugin(
8586 return ;
8687 }
8788
88- session . addProtocolHandler ( '_vue:projectInfo' , ( { arguments : args } ) => {
89- return ( session as any ) . handlers . get ( 'projectInfo' ) ?.( { arguments : args } ) ;
89+ session . addProtocolHandler ( '_vue:projectInfo' , request => {
90+ return ( session as any ) . handlers . get ( 'projectInfo' ) ?.( request ) ;
9091 } ) ;
91- session . addProtocolHandler ( '_vue:documentHighlights-full' , ( { arguments : args } ) => {
92- return ( session as any ) . handlers . get ( 'documentHighlights-full' ) ?.( { arguments : args } ) ;
92+ session . addProtocolHandler ( '_vue:documentHighlights-full' , request => {
93+ return ( session as any ) . handlers . get ( 'documentHighlights-full' ) ?.( request ) ;
9394 } ) ;
94- session . addProtocolHandler ( '_vue:encodedSemanticClassifications-full' , ( { arguments : args } ) => {
95- return ( session as any ) . handlers . get ( 'encodedSemanticClassifications-full' ) ?.( { arguments : args } ) ;
95+ session . addProtocolHandler ( '_vue:encodedSemanticClassifications-full' , request => {
96+ return ( session as any ) . handlers . get ( 'encodedSemanticClassifications-full' ) ?.( request ) ;
9697 } ) ;
97- session . addProtocolHandler ( '_vue:quickinfo' , ( { arguments : args } ) => {
98- return ( session as any ) . handlers . get ( 'quickinfo' ) ?.( { arguments : args } ) ;
98+ session . addProtocolHandler ( '_vue:quickinfo' , request => {
99+ return ( session as any ) . handlers . get ( 'quickinfo' ) ?.( request ) ;
99100 } ) ;
100- session . addProtocolHandler ( '_vue:collectExtractProps' , ( { arguments : args } ) => {
101+ session . addProtocolHandler (
102+ '_vue:collectExtractProps' ,
103+ request => {
104+ const [ fileName , templateCodeRange ] : Parameters < Requests [ 'collectExtractProps' ] > = request . arguments ;
105+ const { language, program, sourceScript, virtualCode } = getLanguageServiceAndVirtualCode ( fileName ) ;
106+ return {
107+ response : collectExtractProps ( ts , language , program , sourceScript , virtualCode , templateCodeRange ) ,
108+ } ;
109+ } ,
110+ ) ;
111+ session . addProtocolHandler ( '_vue:getImportPathForFile' , request => {
112+ const [ fileName , incomingFileName , preferences ] : Parameters < Requests [ 'getImportPathForFile' ] > =
113+ request . arguments ;
114+ const { languageServiceHost, program } = getLanguageService ( fileName ) ;
101115 return {
102- response : collectExtractProps . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
116+ response : getImportPathForFile ( ts , languageServiceHost , program , fileName , incomingFileName , preferences ) ,
103117 } ;
104118 } ) ;
105- session . addProtocolHandler ( '_vue:getImportPathForFile' , ( { arguments : args } ) => {
119+ session . addProtocolHandler ( '_vue:getPropertiesAtLocation' , request => {
120+ const [ fileName , position ] : Parameters < Requests [ 'getPropertiesAtLocation' ] > = request . arguments ;
121+ const { language, program, sourceScript, virtualCode } = getLanguageServiceAndVirtualCode ( fileName ) ;
106122 return {
107- response : getImportPathForFile . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
123+ response : getPropertiesAtLocation ( ts , language , program , sourceScript , virtualCode , position ) ,
108124 } ;
109125 } ) ;
110- session . addProtocolHandler ( '_vue:getPropertiesAtLocation' , ( { arguments : args } ) => {
126+ session . addProtocolHandler ( '_vue:getComponentDirectives' , request => {
127+ const [ fileName ] : Parameters < Requests [ 'getComponentDirectives' ] > = request . arguments ;
128+ const { program } = getLanguageService ( fileName ) ;
111129 return {
112- response : getPropertiesAtLocation . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
130+ response : getComponentDirectives ( ts , program , fileName ) ,
113131 } ;
114132 } ) ;
115- session . addProtocolHandler ( '_vue:getComponentDirectives' , ( { arguments : args } ) => {
133+ session . addProtocolHandler ( '_vue:getComponentEvents' , request => {
134+ const [ fileName , tag ] : Parameters < Requests [ 'getComponentEvents' ] > = request . arguments ;
135+ const { program } = getLanguageService ( fileName ) ;
116136 return {
117- response : getComponentDirectives . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
137+ response : getComponentEvents ( ts , program , fileName , tag ) ,
118138 } ;
119139 } ) ;
120- session . addProtocolHandler ( '_vue:getComponentEvents' , ( { arguments : args } ) => {
140+ session . addProtocolHandler ( '_vue:getComponentNames' , request => {
141+ const [ fileName ] : Parameters < Requests [ 'getComponentNames' ] > = request . arguments ;
142+ const { program } = getLanguageService ( fileName ) ;
121143 return {
122- response : getComponentEvents . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
144+ response : getComponentNames ( ts , program , fileName ) ,
123145 } ;
124146 } ) ;
125- session . addProtocolHandler ( '_vue:getComponentNames' , ( { arguments : args } ) => {
147+ session . addProtocolHandler ( '_vue:getComponentProps' , request => {
148+ const [ fileName , tag ] : Parameters < Requests [ 'getComponentProps' ] > = request . arguments ;
149+ const { program } = getLanguageService ( fileName ) ;
126150 return {
127- response : getComponentNames . apply ( getRequestContext ( args [ 0 ] ) , args ) ?? [ ] ,
151+ response : getComponentProps ( ts , program , fileName , tag ) ,
128152 } ;
129153 } ) ;
130- session . addProtocolHandler ( '_vue:getComponentProps' , ( { arguments : args } ) => {
154+ session . addProtocolHandler ( '_vue:getComponentSlots' , request => {
155+ const [ fileName ] : Parameters < Requests [ 'getComponentSlots' ] > = request . arguments ;
156+ const { program, virtualCode } = getLanguageServiceAndVirtualCode ( fileName ) ;
131157 return {
132- response : getComponentProps . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
158+ response : getComponentSlots ( ts , program , virtualCode ) ,
133159 } ;
134160 } ) ;
135- session . addProtocolHandler ( '_vue:getComponentSlots' , ( { arguments : args } ) => {
161+ session . addProtocolHandler ( '_vue:getElementAttrs' , request => {
162+ const [ fileName , tag ] : Parameters < Requests [ 'getElementAttrs' ] > = request . arguments ;
163+ const { program } = getLanguageService ( fileName ) ;
136164 return {
137- response : getComponentSlots . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
165+ response : getElementAttrs ( ts , program , fileName , tag ) ,
138166 } ;
139167 } ) ;
140- session . addProtocolHandler ( '_vue:getElementAttrs' , ( { arguments : args } ) => {
168+ session . addProtocolHandler ( '_vue:getElementNames' , request => {
169+ const [ fileName ] : Parameters < Requests [ 'getElementNames' ] > = request . arguments ;
170+ const { program } = getLanguageService ( fileName ) ;
141171 return {
142- response : getElementAttrs . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
143- } ;
144- } ) ;
145- session . addProtocolHandler ( '_vue:getElementNames' , ( { arguments : args } ) => {
146- return {
147- response : getElementNames . apply ( getRequestContext ( args [ 0 ] ) , args ) ,
172+ response : getElementNames ( ts , program , fileName ) ,
148173 } ;
149174 } ) ;
150175
151176 projectService . logger . info ( 'Vue specific commands are successfully added.' ) ;
152177 }
153178
154- function getRequestContext ( fileName : string ) : RequestContext {
155- const fileAndProject = ( info . session as any ) . getFileAndProject ( {
179+ function getLanguageServiceAndVirtualCode ( fileName : string ) {
180+ const service = getLanguageService ( fileName ) ;
181+ const sourceScript = service ?. language . scripts . get ( fileName ) ;
182+ if ( ! sourceScript ) {
183+ throw new Error ( 'No source script found for file: ' + fileName ) ;
184+ }
185+ const virtualCode = sourceScript . generated ?. root ;
186+ if ( ! ( virtualCode instanceof vue . VueVirtualCode ) ) {
187+ throw new Error ( 'No virtual code found for file: ' + fileName ) ;
188+ }
189+ return {
190+ ...service ,
191+ sourceScript,
192+ virtualCode,
193+ } ;
194+ }
195+
196+ function getLanguageService ( fileName : string ) {
197+ const { project } = ( info . session as any ) . getFileAndProject ( {
156198 file : fileName ,
157199 projectFileName : undefined ,
158200 } ) as {
159201 file : ts . server . NormalizedPath ;
160202 project : ts . server . Project ;
161203 } ;
162- const service = project2Service . get ( fileAndProject . project ) ;
204+ const service = project2Service . get ( project ) ;
163205 if ( ! service ) {
164- throw 'No RequestContext' ;
206+ throw new Error ( 'No vue service for project: ' + project . getProjectName ( ) ) ;
165207 }
208+ const [ language , languageServiceHost , languageService ] = service ;
166209 return {
167210 typescript : ts ,
168- languageService : service [ 2 ] ,
169- languageServiceHost : service [ 1 ] ,
170- language : service [ 0 ] ,
211+ program : languageService . getProgram ( ) ! ,
212+ languageServiceHost,
213+ language,
171214 } ;
172215 }
173216 } ,
0 commit comments