Skip to content

Commit 635313e

Browse files
committed
Port #11285 to release-2.0.5
1 parent 81fc759 commit 635313e

File tree

3 files changed

+124
-15
lines changed

3 files changed

+124
-15
lines changed

src/harness/unittests/tsserverProjectSystem.ts

Lines changed: 104 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/// <reference path="..\harness.ts" />
1+
/// <reference path="..\harness.ts" />
22
/// <reference path="../../server/typingsInstaller/typingsInstaller.ts" />
33

44
namespace ts.projectSystem {
@@ -137,6 +137,19 @@ namespace ts.projectSystem {
137137
return map(fileNames, toExternalFile);
138138
}
139139

140+
export class TestServerEventManager {
141+
private events: server.ProjectServiceEvent[] = [];
142+
143+
handler: server.ProjectServiceEventHandler = (event: server.ProjectServiceEvent) => {
144+
this.events.push(event);
145+
}
146+
147+
checkEventCountOfType(eventType: "context" | "configFileDiag", expectedCount: number) {
148+
const eventsOfType = filter(this.events, e => e.eventName === eventType);
149+
assert.equal(eventsOfType.length, expectedCount, `The actual event counts of type ${eventType} is ${eventsOfType.length}, while expected ${expectedCount}`);
150+
}
151+
}
152+
140153
export interface TestServerHostCreationParameters {
141154
useCaseSensitiveFileNames?: boolean;
142155
executingFilePath?: string;
@@ -160,11 +173,11 @@ namespace ts.projectSystem {
160173
return host;
161174
}
162175

163-
export function createSession(host: server.ServerHost, typingsInstaller?: server.ITypingsInstaller) {
176+
export function createSession(host: server.ServerHost, typingsInstaller?: server.ITypingsInstaller, projectServiceEventHandler?: server.ProjectServiceEventHandler) {
164177
if (typingsInstaller === undefined) {
165178
typingsInstaller = new TestTypingsInstaller("/a/data/", /*throttleLimit*/5, host);
166179
}
167-
return new server.Session(host, nullCancellationToken, /*useSingleInferredProject*/ false, typingsInstaller, Utils.byteLength, process.hrtime, nullLogger, /*canUseEvents*/ false);
180+
return new server.Session(host, nullCancellationToken, /*useSingleInferredProject*/ false, typingsInstaller, Utils.byteLength, process.hrtime, nullLogger, /*canUseEvents*/ projectServiceEventHandler !== undefined, projectServiceEventHandler);
168181
}
169182

170183
export interface CreateProjectServiceParameters {
@@ -2065,4 +2078,92 @@ namespace ts.projectSystem {
20652078
assert.equal(snap.getLength(), expectedLength, "Incorrect snapshot size");
20662079
}
20672080
});
2081+
2082+
describe("Configure file diagnostics events", () => {
2083+
2084+
it("are generated when the config file has errors", () => {
2085+
const serverEventManager = new TestServerEventManager();
2086+
const file = {
2087+
path: "/a/b/app.ts",
2088+
content: "let x = 10"
2089+
};
2090+
const configFile = {
2091+
path: "/a/b/tsconfig.json",
2092+
content: `{
2093+
"compilerOptions": {
2094+
"foo": "bar",
2095+
"allowJS": true
2096+
}
2097+
}`
2098+
};
2099+
2100+
const host = createServerHost([file, configFile]);
2101+
const session = createSession(host, /*typingsInstaller*/ undefined, serverEventManager.handler);
2102+
openFilesForSession([file], session);
2103+
serverEventManager.checkEventCountOfType("configFileDiag", 1);
2104+
});
2105+
2106+
it("are generated when the config file doesn't have errors", () => {
2107+
const serverEventManager = new TestServerEventManager();
2108+
const file = {
2109+
path: "/a/b/app.ts",
2110+
content: "let x = 10"
2111+
};
2112+
const configFile = {
2113+
path: "/a/b/tsconfig.json",
2114+
content: `{
2115+
"compilerOptions": {}
2116+
}`
2117+
};
2118+
2119+
const host = createServerHost([file, configFile]);
2120+
const session = createSession(host, /*typingsInstaller*/ undefined, serverEventManager.handler);
2121+
openFilesForSession([file], session);
2122+
serverEventManager.checkEventCountOfType("configFileDiag", 1);
2123+
});
2124+
});
2125+
2126+
describe("Configure file diagnostics events", () => {
2127+
2128+
it("are generated when the config file has errors", () => {
2129+
const serverEventManager = new TestServerEventManager();
2130+
const file = {
2131+
path: "/a/b/app.ts",
2132+
content: "let x = 10"
2133+
};
2134+
const configFile = {
2135+
path: "/a/b/tsconfig.json",
2136+
content: `{
2137+
"compilerOptions": {
2138+
"foo": "bar",
2139+
"allowJS": true
2140+
}
2141+
}`
2142+
};
2143+
2144+
const host = createServerHost([file, configFile]);
2145+
const session = createSession(host, /*typingsInstaller*/ undefined, serverEventManager.handler);
2146+
openFilesForSession([file], session);
2147+
serverEventManager.checkEventCountOfType("configFileDiag", 1);
2148+
});
2149+
2150+
it("are generated when the config file doesn't have errors", () => {
2151+
const serverEventManager = new TestServerEventManager();
2152+
const file = {
2153+
path: "/a/b/app.ts",
2154+
content: "let x = 10"
2155+
};
2156+
const configFile = {
2157+
path: "/a/b/tsconfig.json",
2158+
content: `{
2159+
"compilerOptions": {}
2160+
}`
2161+
};
2162+
2163+
const host = createServerHost([file, configFile]);
2164+
const session = createSession(host, /*typingsInstaller*/ undefined, serverEventManager.handler);
2165+
openFilesForSession([file], session);
2166+
serverEventManager.checkEventCountOfType("configFileDiag", 1);
2167+
});
2168+
});
20682169
}

src/server/editorServices.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -754,12 +754,14 @@ namespace ts.server {
754754
}
755755

756756
private reportConfigFileDiagnostics(configFileName: string, diagnostics: Diagnostic[], triggerFile?: string) {
757-
if (diagnostics && diagnostics.length > 0) {
758-
this.eventHandler({
759-
eventName: "configFileDiag",
760-
data: { configFileName, diagnostics, triggerFile }
761-
});
757+
if (!this.eventHandler) {
758+
return;
762759
}
760+
761+
this.eventHandler({
762+
eventName: "configFileDiag",
763+
data: { configFileName, diagnostics: diagnostics || [], triggerFile }
764+
});
763765
}
764766

765767
private createAndAddConfiguredProject(configFileName: NormalizedPath, projectOptions: ProjectOptions, configFileErrors: Diagnostic[], clientFileName?: string) {

src/server/session.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ namespace ts.server {
155155
private immediateId: any;
156156
private changeSeq = 0;
157157

158+
private eventHander: ProjectServiceEventHandler;
159+
158160
constructor(
159161
private host: ServerHost,
160162
cancellationToken: HostCancellationToken,
@@ -163,17 +165,18 @@ namespace ts.server {
163165
private byteLength: (buf: string, encoding?: string) => number,
164166
private hrtime: (start?: number[]) => number[],
165167
protected logger: Logger,
166-
protected readonly canUseEvents: boolean) {
168+
protected readonly canUseEvents: boolean,
169+
eventHandler?: ProjectServiceEventHandler) {
167170

168-
const eventHandler: ProjectServiceEventHandler = canUseEvents
169-
? event => this.handleEvent(event)
171+
this.eventHander = canUseEvents
172+
? eventHandler || (event => this.defaultEventHandler(event))
170173
: undefined;
171174

172-
this.projectService = new ProjectService(host, logger, cancellationToken, useSingleInferredProject, typingsInstaller, eventHandler);
175+
this.projectService = new ProjectService(host, logger, cancellationToken, useSingleInferredProject, typingsInstaller, this.eventHander);
173176
this.gcTimer = new GcTimer(host, /*delay*/ 7000, logger);
174177
}
175178

176-
private handleEvent(event: ProjectServiceEvent) {
179+
private defaultEventHandler(event: ProjectServiceEvent) {
177180
switch (event.eventName) {
178181
case "context":
179182
const { project, fileName } = event.data;
@@ -714,8 +717,11 @@ namespace ts.server {
714717
*/
715718
private openClientFile(fileName: NormalizedPath, fileContent?: string, scriptKind?: ScriptKind) {
716719
const { configFileName, configFileErrors } = this.projectService.openClientFileWithNormalizedPath(fileName, fileContent, scriptKind);
717-
if (configFileErrors) {
718-
this.configFileDiagnosticEvent(fileName, configFileName, configFileErrors);
720+
if (this.eventHander) {
721+
this.eventHander({
722+
eventName: "configFileDiag",
723+
data: { fileName, configFileName, diagnostics: configFileErrors || [] }
724+
});
719725
}
720726
}
721727

0 commit comments

Comments
 (0)