diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 5da61fd542a..a210349c146 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -698,7 +698,8 @@ namespace Harness.LanguageService { /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, - process.hrtime, serverHost); + process.hrtime, serverHost, + /*canUseEvents*/ true); // Fake the connection between the client and the server serverHost.writeMessage = client.onMessage.bind(client); diff --git a/src/harness/unittests/session.ts b/src/harness/unittests/session.ts index 0d1fb3681e0..abfac4b082d 100644 --- a/src/harness/unittests/session.ts +++ b/src/harness/unittests/session.ts @@ -44,7 +44,7 @@ namespace ts.server { let lastSent: protocol.Message; beforeEach(() => { - session = new Session(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, process.hrtime, mockLogger); + session = new Session(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, process.hrtime, mockLogger, /*canUseEvents*/ true); session.send = (msg: protocol.Message) => { lastSent = msg; }; @@ -269,7 +269,7 @@ namespace ts.server { lastSent: protocol.Message; customHandler = "testhandler"; constructor() { - super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, process.hrtime, mockLogger); + super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, process.hrtime, mockLogger, /*canUseEvents*/ true); this.addProtocolHandler(this.customHandler, () => { return { response: undefined, responseRequired: true }; }); @@ -327,7 +327,7 @@ namespace ts.server { class InProcSession extends Session { private queue: protocol.Request[] = []; constructor(private client: InProcClient) { - super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, process.hrtime, mockLogger); + super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, process.hrtime, mockLogger, /*canUseEvents*/ true); this.addProtocolHandler("echo", (req: protocol.Request) => ({ response: req.arguments, responseRequired: true diff --git a/src/server/server.ts b/src/server/server.ts index b52db6f517e..11cc4b94740 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -232,8 +232,22 @@ namespace ts.server { } class IOSession extends Session { - constructor(host: ServerHost, cancellationToken: HostCancellationToken, eventPort: number, useSingleInferredProject: boolean, logger: server.Logger) { - super(host, cancellationToken, useSingleInferredProject, new NodeTypingsInstaller(logger, eventPort, host.newLine), Buffer.byteLength, process.hrtime, logger); + constructor( + host: ServerHost, + cancellationToken: HostCancellationToken, + installerEventPort: number, + canUseEvents: boolean, + useSingleInferredProject: boolean, + logger: server.Logger) { + super( + host, + cancellationToken, + useSingleInferredProject, + new NodeTypingsInstaller(logger, installerEventPort, host.newLine), + Buffer.byteLength, + process.hrtime, + logger, + canUseEvents); } exit() { @@ -477,7 +491,7 @@ namespace ts.server { } const useSingleInferredProject = sys.args.indexOf("--useSingleInferredProject") >= 0; - const ioSession = new IOSession(sys, cancellationToken, eventPort, useSingleInferredProject, logger); + const ioSession = new IOSession(sys, cancellationToken, eventPort, /*canUseEvents*/ eventPort === undefined, useSingleInferredProject, logger); process.on("uncaughtException", function (err: Error) { ioSession.logError(err, "unknown"); }); diff --git a/src/server/session.ts b/src/server/session.ts index 860e90a1a57..5ae7307737e 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -158,11 +158,14 @@ namespace ts.server { protected readonly typingsInstaller: ITypingsInstaller, private byteLength: (buf: string, encoding?: string) => number, private hrtime: (start?: number[]) => number[], - protected logger: Logger) { - this.projectService = - new ProjectService(host, logger, cancellationToken, useSingleInferredProject, typingsInstaller, (eventName, project, fileName) => { - this.handleEvent(eventName, project, fileName); - }); + protected logger: Logger, + protected readonly canUseEvents: boolean) { + + const eventHandler: ProjectServiceEventHandler = canUseEvents + ? (eventName, project, fileName) => this.handleEvent(eventName, project, fileName) + : undefined; + + this.projectService = new ProjectService(host, logger, cancellationToken, useSingleInferredProject, typingsInstaller, eventHandler); this.gcTimer = new GcTimer(host, /*delay*/ 15000, logger); } @@ -186,6 +189,12 @@ namespace ts.server { } public send(msg: protocol.Message) { + if (msg.type === "event" && !this.canUseEvents) { + if (this.logger.hasLevel(LogLevel.verbose)) { + this.logger.info(`Session does not support events: ignored event: ${JSON.stringify(msg)}`); + } + return; + } this.host.write(formatMessage(msg, this.logger, this.byteLength, this.host.newLine)); }