Skip to content

Commit 7a75463

Browse files
fix(typescript-plugin): place __vue__ in project instead of program (#5690)
1 parent a7e820a commit 7a75463

File tree

2 files changed

+31
-50
lines changed

2 files changed

+31
-50
lines changed

extensions/vscode/reactivityAnalysis/plugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ function getReactivityAnalysis(
4545
project: ts.server.Project;
4646
};
4747

48-
const language: Language<string> | undefined = project['program']?.__vue__?.language;
48+
const language: Language<string> | undefined = (project as any).__vue__?.language;
4949
if (!language) {
5050
return;
5151
}

packages/typescript-plugin/index.ts

Lines changed: 30 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,6 @@ import { getElementNames } from './lib/requests/getElementNames';
1414
import { getImportPathForFile } from './lib/requests/getImportPathForFile';
1515
import { isRefAtPosition } from './lib/requests/isRefAtPosition';
1616

17-
const windowsPathReg = /\\/g;
18-
const project2Service = new WeakMap<
19-
ts.server.Project,
20-
[vue.Language<string>, ts.LanguageServiceHost, ts.LanguageService]
21-
>();
22-
2317
export = createLanguageServicePlugin(
2418
(ts, info) => {
2519
const vueOptions = getVueCompilerOptions();
@@ -36,30 +30,21 @@ export = createLanguageServicePlugin(
3630
return {
3731
languagePlugins: [languagePlugin],
3832
setup: language => {
39-
project2Service.set(info.project, [language, info.languageServiceHost, info.languageService]);
40-
4133
info.languageService = createVueLanguageServiceProxy(
4234
ts,
4335
language,
4436
info.languageService,
4537
vueOptions,
4638
fileName => fileName,
4739
);
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 };
5641
},
5742
};
5843

5944
function getVueCompilerOptions() {
6045
if (info.project.projectKind === ts.server.ProjectKind.Configured) {
6146
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;
6348
}
6449
else {
6550
return vue.createParsedCommandLineByJson(ts, ts.sys, info.languageServiceHost.getCurrentDirectory(), {})
@@ -107,12 +92,12 @@ export = createLanguageServicePlugin(
10792
'_vue:collectExtractProps',
10893
request => {
10994
const [fileName, templateCodeRange]: Parameters<Requests['collectExtractProps']> = request.arguments;
110-
const { language, languageService, sourceScript, virtualCode } = getLanguageServiceAndVirtualCode(fileName);
95+
const { project, language, sourceScript, virtualCode } = getProjectAndVirtualCode(fileName);
11196
return createResponse(
11297
collectExtractProps(
11398
ts,
11499
language,
115-
languageService.getProgram()!,
100+
project.getLanguageService().getProgram()!,
116101
sourceScript,
117102
virtualCode,
118103
templateCodeRange,
@@ -124,12 +109,12 @@ export = createLanguageServicePlugin(
124109
session.addProtocolHandler('_vue:getImportPathForFile', request => {
125110
const [fileName, incomingFileName, preferences]: Parameters<Requests['getImportPathForFile']> =
126111
request.arguments;
127-
const { languageServiceHost, languageService } = getLanguageService(fileName);
112+
const { project } = getProject(fileName);
128113
return createResponse(
129114
getImportPathForFile(
130115
ts,
131-
languageServiceHost,
132-
languageService.getProgram()!,
116+
project,
117+
project.getLanguageService().getProgram()!,
133118
fileName,
134119
incomingFileName,
135120
preferences,
@@ -138,12 +123,12 @@ export = createLanguageServicePlugin(
138123
});
139124
session.addProtocolHandler('_vue:isRefAtPosition', request => {
140125
const [fileName, position]: Parameters<Requests['isRefAtPosition']> = request.arguments;
141-
const { language, languageService, sourceScript, virtualCode } = getLanguageServiceAndVirtualCode(fileName);
126+
const { project, language, sourceScript, virtualCode } = getProjectAndVirtualCode(fileName);
142127
return createResponse(
143128
isRefAtPosition(
144129
ts,
145130
language,
146-
languageService.getProgram()!,
131+
project.getLanguageService().getProgram()!,
147132
sourceScript,
148133
virtualCode,
149134
position,
@@ -153,38 +138,38 @@ export = createLanguageServicePlugin(
153138
});
154139
session.addProtocolHandler('_vue:getComponentDirectives', request => {
155140
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));
158143
});
159144
session.addProtocolHandler('_vue:getComponentEvents', request => {
160145
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));
163148
});
164149
session.addProtocolHandler('_vue:getComponentNames', request => {
165150
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));
168153
});
169154
session.addProtocolHandler('_vue:getComponentProps', request => {
170155
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));
173158
});
174159
session.addProtocolHandler('_vue:getComponentSlots', request => {
175160
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));
178163
});
179164
session.addProtocolHandler('_vue:getElementAttrs', request => {
180165
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));
183168
});
184169
session.addProtocolHandler('_vue:getElementNames', request => {
185170
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));
188173
});
189174

190175
projectService.logger.info('Vue specific commands are successfully added.');
@@ -196,8 +181,8 @@ export = createLanguageServicePlugin(
196181
};
197182
}
198183

199-
function getLanguageServiceAndVirtualCode(fileName: string) {
200-
const service = getLanguageService(fileName);
184+
function getProjectAndVirtualCode(fileName: string) {
185+
const service = getProject(fileName);
201186
const sourceScript = service.language.scripts.get(fileName);
202187
if (!sourceScript) {
203188
throw new Error('No source script found for file: ' + fileName);
@@ -213,24 +198,20 @@ export = createLanguageServicePlugin(
213198
};
214199
}
215200

216-
function getLanguageService(fileName: string) {
201+
function getProject(fileName: string) {
217202
const { project } = session['getFileAndProject']({
218203
file: fileName,
219204
projectFileName: undefined,
220205
}) as {
221206
file: ts.server.NormalizedPath;
222207
project: ts.server.Project;
223208
};
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());
227211
}
228-
const [language, languageServiceHost, languageService] = service;
229212
return {
230-
typescript: ts,
231-
languageService,
232-
languageServiceHost,
233-
language,
213+
project,
214+
language: (project as any).__vue__.language,
234215
};
235216
}
236217
}

0 commit comments

Comments
 (0)