[Code] improve lsp proxy state management (#47580) (#47651)

This commit is contained in:
Yulong 2019-10-09 19:32:56 +08:00 committed by GitHub
parent 6ca794326c
commit b91356118d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 8 deletions

View file

@ -43,6 +43,8 @@ export abstract class AbstractLauncher implements ILanguageServerLauncher {
log.debug('Detach mode, expected language server launch externally');
proxy.onConnected(() => {
this.running = true;
// reset spawn times
this.spawnTimes = 0;
});
proxy.onDisconnected(() => {
this.running = false;
@ -81,6 +83,8 @@ export abstract class AbstractLauncher implements ILanguageServerLauncher {
await new Promise((resolve, reject) => {
proxy.onConnected(() => {
this.proxyConnected = true;
// reset spawn times
this.spawnTimes = 0;
resolve();
});
this.launchReject = err => {

View file

@ -93,9 +93,10 @@ export class LanguageServerProxy implements ILanguageServerHandler {
this.eventEmitter.on('err', error =>
reject(new ResponseError(InternalError, 'Server error', error))
);
this.eventEmitter.on('exit', () =>
reject(new ResponseError(RequestCancelled, 'Server closed'))
);
this.eventEmitter.on('exit', () => {
reject(new ResponseError(RequestCancelled, 'Server closed'));
this.initialized = false;
});
this.eventEmitter.on('connect', () => resolve(this.clientConnection!));
});
}
@ -164,6 +165,7 @@ export class LanguageServerProxy implements ILanguageServerHandler {
clientConn.sendNotification(ExitNotification.type);
}
this.eventEmitter.emit('exit');
this.initialized = false;
}
public startServerConnection() {
@ -246,6 +248,7 @@ export class LanguageServerProxy implements ILanguageServerHandler {
private onSocketClosed() {
this.clientConnection = null;
this.initialized = false;
this.eventEmitter.emit('close');
}

View file

@ -56,9 +56,12 @@ export class RequestExpander implements ILanguageServerHandler {
readonly log: Logger
) {
this.proxy = proxy;
proxy.onDisconnected(() => {
const clearListener = () => {
this.log.debug('proxy disconnected, clearing workspace status');
this.workspaces.clear();
});
};
proxy.onDisconnected(clearListener);
proxy.onExit(clearListener);
this.workspaceRoot = fs.realpathSync(this.serverOptions.workspacePath);
}
@ -260,9 +263,10 @@ export class RequestExpander implements ILanguageServerHandler {
}
initializeState(workspaceDir: string): WorkspaceStatus {
if (this.hasWorkspacePath(workspaceDir)) {
return this.getWorkspace(workspaceDir).status;
const ws = this.getWorkspace(workspaceDir);
if (ws.status === WorkspaceStatus.Uninitialized) {
ws.initPromise = Cancelable.fromPromise(this.initialize(workspaceDir));
}
return WorkspaceStatus.Uninitialized;
return ws.status;
}
}

View file

@ -158,6 +158,9 @@ export class WorkspaceHandler {
}
public handleResponse(request: LspRequest, response: ResponseMessage): ResponseMessage {
if (!response.result) {
return response;
}
const { method } = request;
switch (method) {
case 'textDocument/hover': {