Skip to content

Commit 5eab51b

Browse files
authored
fix: check that a language service exists for discovered projects (#562)
It appears that in some cases, a language service might not exist for a project (https://github.com/microsoft/TypeScript/blob/d2c5d54242c69effbed0ebb27033047e0c995589/src/testRunner/unittests/tsserver/typingsInstaller.ts#L1951) even if the `languageServiceEnabled` property on the project is `true` (#557). To fix this, bail out of providing language service features anytime a language service is not found by performing a strict null check. Closes #557.
1 parent 42efe24 commit 5eab51b

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

server/src/project_service.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,14 @@ export class ProjectService {
116116

117117
return project;
118118
}
119+
120+
/**
121+
* Returns a language service for a default project created for the specified `scriptInfo`. If the
122+
* project does not support a language service, nothing is returned.
123+
*/
124+
getDefaultLanguageService(scriptInfo: ts.server.ScriptInfo): ts.LanguageService|undefined {
125+
const project = this.getDefaultProjectForScriptInfo(scriptInfo);
126+
if (!project?.languageServiceEnabled) return;
127+
return project.getLanguageService();
128+
}
119129
}

server/src/session.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,12 @@ export class Session {
133133
if (!scriptInfo) {
134134
continue;
135135
}
136-
const project = this.projectService.getDefaultProjectForScriptInfo(scriptInfo);
137-
if (!project || !project.languageServiceEnabled) {
136+
137+
const ngLS = this.projectService.getDefaultLanguageService(scriptInfo);
138+
if (!ngLS) {
138139
continue;
139140
}
140-
const ngLS = project.getLanguageService();
141+
141142
const diagnostics = ngLS.getSemanticDiagnostics(fileName);
142143
// Need to send diagnostics even if it's empty otherwise editor state will
143144
// not be updated.
@@ -269,13 +270,12 @@ export class Session {
269270
}
270271

271272
const {fileName} = scriptInfo;
272-
const project = this.projectService.getDefaultProjectForScriptInfo(scriptInfo);
273-
if (!project || !project.languageServiceEnabled) {
273+
const langSvc = this.projectService.getDefaultLanguageService(scriptInfo);
274+
if (!langSvc) {
274275
return;
275276
}
276277

277278
const offset = lspPositionToTsPosition(scriptInfo, position);
278-
const langSvc = project.getLanguageService();
279279
const definition = langSvc.getDefinitionAndBoundSpan(fileName, offset);
280280
if (!definition || !definition.definitions) {
281281
return;
@@ -316,12 +316,11 @@ export class Session {
316316
if (!scriptInfo) {
317317
return;
318318
}
319-
const project = this.projectService.getDefaultProjectForScriptInfo(scriptInfo);
320-
if (!project || !project.languageServiceEnabled) {
319+
const langSvc = this.projectService.getDefaultLanguageService(scriptInfo);
320+
if (!langSvc) {
321321
return;
322322
}
323323
const offset = lspPositionToTsPosition(scriptInfo, position);
324-
const langSvc = project.getLanguageService();
325324
const info = langSvc.getQuickInfoAtPosition(scriptInfo.fileName, offset);
326325
if (!info) {
327326
return;
@@ -361,12 +360,11 @@ export class Session {
361360
return;
362361
}
363362
const {fileName} = scriptInfo;
364-
const project = this.projectService.getDefaultProjectForScriptInfo(scriptInfo);
365-
if (!project || !project.languageServiceEnabled) {
363+
const langSvc = this.projectService.getDefaultLanguageService(scriptInfo);
364+
if (!langSvc) {
366365
return;
367366
}
368367
const offset = lspPositionToTsPosition(scriptInfo, position);
369-
const langSvc = project.getLanguageService();
370368
const completions = langSvc.getCompletionsAtPosition(
371369
fileName, offset,
372370
{

0 commit comments

Comments
 (0)