in client/src/common/client.ts [3324:3438]
public start(): Disposable {
if (this._onReadyCallbacks.isUsed) {
this._onReady = new Promise((resolve, reject) => {
this._onReadyCallbacks = new OnReady(resolve, reject);
});
}
this._listeners = [];
this._providers = [];
// If we restart then the diagnostics collection is reused.
if (!this._diagnostics) {
this._diagnostics = this._clientOptions.diagnosticCollectionName
? Languages.createDiagnosticCollection(this._clientOptions.diagnosticCollectionName)
: Languages.createDiagnosticCollection();
}
this.state = ClientState.Starting;
this.resolveConnection().then((connection) => {
connection.onLogMessage((message) => {
switch (message.type) {
case MessageType.Error:
this.error(message.message, undefined, false);
break;
case MessageType.Warning:
this.warn(message.message, undefined, false);
break;
case MessageType.Info:
this.info(message.message, undefined, false);
break;
default:
this.outputChannel.appendLine(message.message);
}
});
connection.onShowMessage((message) => {
switch (message.type) {
case MessageType.Error:
void Window.showErrorMessage(message.message);
break;
case MessageType.Warning:
void Window.showWarningMessage(message.message);
break;
case MessageType.Info:
void Window.showInformationMessage(message.message);
break;
default:
void Window.showInformationMessage(message.message);
}
});
connection.onRequest(ShowMessageRequest.type, (params) => {
let messageFunc: <T extends MessageItem>(message: string, ...items: T[]) => Thenable<T>;
switch (params.type) {
case MessageType.Error:
messageFunc = Window.showErrorMessage;
break;
case MessageType.Warning:
messageFunc = Window.showWarningMessage;
break;
case MessageType.Info:
messageFunc = Window.showInformationMessage;
break;
default:
messageFunc = Window.showInformationMessage;
}
let actions = params.actions || [];
return messageFunc(params.message, ...actions);
});
connection.onTelemetry((data) => {
this._telemetryEmitter.fire(data);
});
connection.onRequest(ShowDocumentRequest.type, async (params): Promise<ShowDocumentResult> => {
const showDocument = async (params: ShowDocumentParams): Promise<ShowDocumentResult> => {
const uri = this.protocol2CodeConverter.asUri(params.uri);
try {
if (params.external === true) {
const success = await Env.openExternal(uri);
return { success };
} else {
const options: TextDocumentShowOptions = {};
if (params.selection !== undefined) {
options.selection = this.protocol2CodeConverter.asRange(params.selection);
}
if (params.takeFocus === undefined || params.takeFocus === false) {
options.preserveFocus = true;
} else if (params.takeFocus === true) {
options.preserveFocus = false;
}
await Window.showTextDocument(uri, options);
return { success: true };
}
} catch (error) {
return { success: true };
}
};
const middleware = this._clientOptions.middleware.window?.showDocument;
if (middleware !== undefined) {
return middleware(params, showDocument);
} else {
return showDocument(params);
}
});
connection.listen();
// Error is handled in the initialize call.
return this.initialize(connection);
}).catch((error) => {
this.state = ClientState.StartFailed;
this._onReadyCallbacks.reject(error);
this.error(`${this._name} client: couldn't create connection to server`, error, 'force');
});
return new Disposable(() => {
if (this.needsStop()) {
this.stop().catch((error) => {
this.error(`Stopping server failed.`, error, false);
});
}
});
}