@@ -14,12 +14,6 @@ import { getElementNames } from './lib/requests/getElementNames';
14
14
import { getImportPathForFile } from './lib/requests/getImportPathForFile' ;
15
15
import { isRefAtPosition } from './lib/requests/isRefAtPosition' ;
16
16
17
- const windowsPathReg = / \\ / g;
18
- const project2Service = new WeakMap <
19
- ts . server . Project ,
20
- [ vue . Language < string > , ts . LanguageServiceHost , ts . LanguageService ]
21
- > ( ) ;
22
-
23
17
export = createLanguageServicePlugin (
24
18
( ts , info ) => {
25
19
const vueOptions = getVueCompilerOptions ( ) ;
@@ -36,30 +30,21 @@ export = createLanguageServicePlugin(
36
30
return {
37
31
languagePlugins : [ languagePlugin ] ,
38
32
setup : language => {
39
- project2Service . set ( info . project , [ language , info . languageServiceHost , info . languageService ] ) ;
40
-
41
33
info . languageService = createVueLanguageServiceProxy (
42
34
ts ,
43
35
language ,
44
36
info . languageService ,
45
37
vueOptions ,
46
38
fileName => fileName ,
47
39
) ;
48
-
49
- // #3963
50
- const timer = setInterval ( ( ) => {
51
- if ( info . project [ 'program' ] ) {
52
- clearInterval ( timer ) ;
53
- info . project [ 'program' ] . __vue__ = { language } ;
54
- }
55
- } , 50 ) ;
40
+ ( info . project as any ) . __vue__ = { language } ;
56
41
} ,
57
42
} ;
58
43
59
44
function getVueCompilerOptions ( ) {
60
45
if ( info . project . projectKind === ts . server . ProjectKind . Configured ) {
61
46
const tsconfig = info . project . getProjectName ( ) ;
62
- return vue . createParsedCommandLine ( ts , ts . sys , tsconfig . replace ( windowsPathReg , '/' ) ) . vueOptions ;
47
+ return vue . createParsedCommandLine ( ts , ts . sys , tsconfig . replace ( / \\ / g , '/' ) ) . vueOptions ;
63
48
}
64
49
else {
65
50
return vue . createParsedCommandLineByJson ( ts , ts . sys , info . languageServiceHost . getCurrentDirectory ( ) , { } )
@@ -107,12 +92,12 @@ export = createLanguageServicePlugin(
107
92
'_vue:collectExtractProps' ,
108
93
request => {
109
94
const [ fileName , templateCodeRange ] : Parameters < Requests [ 'collectExtractProps' ] > = request . arguments ;
110
- const { language , languageService , sourceScript, virtualCode } = getLanguageServiceAndVirtualCode ( fileName ) ;
95
+ const { project , language , sourceScript, virtualCode } = getProjectAndVirtualCode ( fileName ) ;
111
96
return createResponse (
112
97
collectExtractProps (
113
98
ts ,
114
99
language ,
115
- languageService . getProgram ( ) ! ,
100
+ project . getLanguageService ( ) . getProgram ( ) ! ,
116
101
sourceScript ,
117
102
virtualCode ,
118
103
templateCodeRange ,
@@ -124,12 +109,12 @@ export = createLanguageServicePlugin(
124
109
session . addProtocolHandler ( '_vue:getImportPathForFile' , request => {
125
110
const [ fileName , incomingFileName , preferences ] : Parameters < Requests [ 'getImportPathForFile' ] > =
126
111
request . arguments ;
127
- const { languageServiceHost , languageService } = getLanguageService ( fileName ) ;
112
+ const { project } = getProject ( fileName ) ;
128
113
return createResponse (
129
114
getImportPathForFile (
130
115
ts ,
131
- languageServiceHost ,
132
- languageService . getProgram ( ) ! ,
116
+ project ,
117
+ project . getLanguageService ( ) . getProgram ( ) ! ,
133
118
fileName ,
134
119
incomingFileName ,
135
120
preferences ,
@@ -138,12 +123,12 @@ export = createLanguageServicePlugin(
138
123
} ) ;
139
124
session . addProtocolHandler ( '_vue:isRefAtPosition' , request => {
140
125
const [ fileName , position ] : Parameters < Requests [ 'isRefAtPosition' ] > = request . arguments ;
141
- const { language , languageService , sourceScript, virtualCode } = getLanguageServiceAndVirtualCode ( fileName ) ;
126
+ const { project , language , sourceScript, virtualCode } = getProjectAndVirtualCode ( fileName ) ;
142
127
return createResponse (
143
128
isRefAtPosition (
144
129
ts ,
145
130
language ,
146
- languageService . getProgram ( ) ! ,
131
+ project . getLanguageService ( ) . getProgram ( ) ! ,
147
132
sourceScript ,
148
133
virtualCode ,
149
134
position ,
@@ -153,38 +138,38 @@ export = createLanguageServicePlugin(
153
138
} ) ;
154
139
session . addProtocolHandler ( '_vue:getComponentDirectives' , request => {
155
140
const [ fileName ] : Parameters < Requests [ 'getComponentDirectives' ] > = request . arguments ;
156
- const { languageService } = getLanguageService ( fileName ) ;
157
- return createResponse ( getComponentDirectives ( ts , languageService . getProgram ( ) ! , fileName ) ) ;
141
+ const { project } = getProject ( fileName ) ;
142
+ return createResponse ( getComponentDirectives ( ts , project . getLanguageService ( ) . getProgram ( ) ! , fileName ) ) ;
158
143
} ) ;
159
144
session . addProtocolHandler ( '_vue:getComponentEvents' , request => {
160
145
const [ fileName , tag ] : Parameters < Requests [ 'getComponentEvents' ] > = request . arguments ;
161
- const { languageService } = getLanguageService ( fileName ) ;
162
- return createResponse ( getComponentEvents ( ts , languageService . getProgram ( ) ! , fileName , tag ) ) ;
146
+ const { project } = getProject ( fileName ) ;
147
+ return createResponse ( getComponentEvents ( ts , project . getLanguageService ( ) . getProgram ( ) ! , fileName , tag ) ) ;
163
148
} ) ;
164
149
session . addProtocolHandler ( '_vue:getComponentNames' , request => {
165
150
const [ fileName ] : Parameters < Requests [ 'getComponentNames' ] > = request . arguments ;
166
- const { languageService } = getLanguageService ( fileName ) ;
167
- return createResponse ( getComponentNames ( ts , languageService . getProgram ( ) ! , fileName ) ) ;
151
+ const { project } = getProject ( fileName ) ;
152
+ return createResponse ( getComponentNames ( ts , project . getLanguageService ( ) . getProgram ( ) ! , fileName ) ) ;
168
153
} ) ;
169
154
session . addProtocolHandler ( '_vue:getComponentProps' , request => {
170
155
const [ fileName , tag ] : Parameters < Requests [ 'getComponentProps' ] > = request . arguments ;
171
- const { languageService } = getLanguageService ( fileName ) ;
172
- return createResponse ( getComponentProps ( ts , languageService . getProgram ( ) ! , fileName , tag ) ) ;
156
+ const { project } = getProject ( fileName ) ;
157
+ return createResponse ( getComponentProps ( ts , project . getLanguageService ( ) . getProgram ( ) ! , fileName , tag ) ) ;
173
158
} ) ;
174
159
session . addProtocolHandler ( '_vue:getComponentSlots' , request => {
175
160
const [ fileName ] : Parameters < Requests [ 'getComponentSlots' ] > = request . arguments ;
176
- const { languageService , virtualCode } = getLanguageServiceAndVirtualCode ( fileName ) ;
177
- return createResponse ( getComponentSlots ( ts , languageService . getProgram ( ) ! , virtualCode ) ) ;
161
+ const { project , virtualCode } = getProjectAndVirtualCode ( fileName ) ;
162
+ return createResponse ( getComponentSlots ( ts , project . getLanguageService ( ) . getProgram ( ) ! , virtualCode ) ) ;
178
163
} ) ;
179
164
session . addProtocolHandler ( '_vue:getElementAttrs' , request => {
180
165
const [ fileName , tag ] : Parameters < Requests [ 'getElementAttrs' ] > = request . arguments ;
181
- const { languageService } = getLanguageService ( fileName ) ;
182
- return createResponse ( getElementAttrs ( ts , languageService . getProgram ( ) ! , fileName , tag ) ) ;
166
+ const { project } = getProject ( fileName ) ;
167
+ return createResponse ( getElementAttrs ( ts , project . getLanguageService ( ) . getProgram ( ) ! , fileName , tag ) ) ;
183
168
} ) ;
184
169
session . addProtocolHandler ( '_vue:getElementNames' , request => {
185
170
const [ fileName ] : Parameters < Requests [ 'getElementNames' ] > = request . arguments ;
186
- const { languageService } = getLanguageService ( fileName ) ;
187
- return createResponse ( getElementNames ( ts , languageService . getProgram ( ) ! , fileName ) ) ;
171
+ const { project } = getProject ( fileName ) ;
172
+ return createResponse ( getElementNames ( ts , project . getLanguageService ( ) . getProgram ( ) ! , fileName ) ) ;
188
173
} ) ;
189
174
190
175
projectService . logger . info ( 'Vue specific commands are successfully added.' ) ;
@@ -196,8 +181,8 @@ export = createLanguageServicePlugin(
196
181
} ;
197
182
}
198
183
199
- function getLanguageServiceAndVirtualCode ( fileName : string ) {
200
- const service = getLanguageService ( fileName ) ;
184
+ function getProjectAndVirtualCode ( fileName : string ) {
185
+ const service = getProject ( fileName ) ;
201
186
const sourceScript = service . language . scripts . get ( fileName ) ;
202
187
if ( ! sourceScript ) {
203
188
throw new Error ( 'No source script found for file: ' + fileName ) ;
@@ -213,24 +198,20 @@ export = createLanguageServicePlugin(
213
198
} ;
214
199
}
215
200
216
- function getLanguageService ( fileName : string ) {
201
+ function getProject ( fileName : string ) {
217
202
const { project } = session [ 'getFileAndProject' ] ( {
218
203
file : fileName ,
219
204
projectFileName : undefined ,
220
205
} ) as {
221
206
file : ts . server . NormalizedPath ;
222
207
project : ts . server . Project ;
223
208
} ;
224
- const service = project2Service . get ( project ) ;
225
- if ( ! service ) {
226
- throw new Error ( 'No vue service for project: ' + project . getProjectName ( ) ) ;
209
+ if ( ! ( '__vue__' in project ) ) {
210
+ throw new Error ( 'No vue project info for project: ' + project . getProjectName ( ) ) ;
227
211
}
228
- const [ language , languageServiceHost , languageService ] = service ;
229
212
return {
230
- typescript : ts ,
231
- languageService,
232
- languageServiceHost,
233
- language,
213
+ project,
214
+ language : ( project as any ) . __vue__ . language ,
234
215
} ;
235
216
}
236
217
}
0 commit comments