From 43392774fee35c9d3b651db13a6f3a3cba658159 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 16 Mar 2018 11:41:15 +0100 Subject: [PATCH] [json] update sefeRunner --- extensions/json/server/src/jsonServerMain.ts | 24 +++++++++------- .../server/src/utils/{errors.ts => runner.ts} | 28 ++++++++++++++----- 2 files changed, 35 insertions(+), 17 deletions(-) rename extensions/json/server/src/utils/{errors.ts => runner.ts} (74%) diff --git a/extensions/json/server/src/jsonServerMain.ts b/extensions/json/server/src/jsonServerMain.ts index 7fe4a8a2122..28625bbaae4 100644 --- a/extensions/json/server/src/jsonServerMain.ts +++ b/extensions/json/server/src/jsonServerMain.ts @@ -15,7 +15,7 @@ import * as fs from 'fs'; import URI from 'vscode-uri'; import * as URL from 'url'; import { startsWith } from './utils/strings'; -import { formatError, runSafe, runSafeAsync } from './utils/errors'; +import { formatError, runSafe, runSafeAsync } from './utils/runner'; import { JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration } from 'vscode-json-languageservice'; import { getLanguageModelCache } from './languageModelCache'; import { getFoldingRegions } from './jsonFolding'; @@ -42,8 +42,12 @@ namespace SchemaContentChangeNotification { let connection: IConnection = createConnection(); process.on('unhandledRejection', (e: any) => { - connection.console.error(formatError(`Unhandled exception`, e)); + console.error(formatError(`Unhandled exception`, e)); }); +process.on('uncaughtException', (e: any) => { + console.error(formatError(`Unhandled exception`, e)); +}); + console.log = connection.console.log.bind(connection.console); console.error = connection.console.error.bind(connection.console); @@ -302,26 +306,26 @@ function getJSONDocument(document: TextDocument): JSONDocument { return jsonDocuments.get(document); } -connection.onCompletion(textDocumentPosition => { +connection.onCompletion((textDocumentPosition, token) => { return runSafeAsync(() => { let document = documents.get(textDocumentPosition.textDocument.uri); let jsonDocument = getJSONDocument(document); return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); - }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`); + }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); }); -connection.onCompletionResolve(completionItem => { +connection.onCompletionResolve((completionItem, token) => { return runSafeAsync(() => { return languageService.doResolve(completionItem); - }, completionItem, `Error while resolving completion proposal`); + }, completionItem, `Error while resolving completion proposal`, token); }); -connection.onHover(textDocumentPositionParams => { +connection.onHover((textDocumentPositionParams, token) => { return runSafeAsync(() => { let document = documents.get(textDocumentPositionParams.textDocument.uri); let jsonDocument = getJSONDocument(document); return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); - }, null, `Error while computing hover for ${textDocumentPositionParams.textDocument.uri}`); + }, null, `Error while computing hover for ${textDocumentPositionParams.textDocument.uri}`, token); }); connection.onDocumentSymbol((documentSymbolParams, token) => { @@ -339,7 +343,7 @@ connection.onDocumentRangeFormatting((formatParams, token) => { }, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token); }); -connection.onRequest(DocumentColorRequest.type, params => { +connection.onRequest(DocumentColorRequest.type, (params, token) => { return runSafeAsync(() => { let document = documents.get(params.textDocument.uri); if (document) { @@ -347,7 +351,7 @@ connection.onRequest(DocumentColorRequest.type, params => { return languageService.findDocumentColors(document, jsonDocument); } return Promise.resolve([]); - }, [], `Error while computing document colors for ${params.textDocument.uri}`); + }, [], `Error while computing document colors for ${params.textDocument.uri}`, token); }); connection.onRequest(ColorPresentationRequest.type, (params, token) => { diff --git a/extensions/json/server/src/utils/errors.ts b/extensions/json/server/src/utils/runner.ts similarity index 74% rename from extensions/json/server/src/utils/errors.ts rename to extensions/json/server/src/utils/runner.ts index c7e78cec6df..f7c75361e34 100644 --- a/extensions/json/server/src/utils/errors.ts +++ b/extensions/json/server/src/utils/runner.ts @@ -18,16 +18,30 @@ export function formatError(message: string, err: any): string { return message; } -export function runSafeAsync(func: () => Thenable, errorVal: T, errorMessage: string): Thenable { - let t = func(); - return t.then(void 0, e => { - console.error(formatError(errorMessage, e)); - return errorVal; +export function runSafeAsync(func: () => Thenable, errorVal: T, errorMessage: string, token: CancellationToken): Thenable> { + return new Promise>((resolve, reject) => { + setImmediate(() => { + if (token.isCancellationRequested) { + resolve(cancelValue()); + } + return func().then(result => { + if (token.isCancellationRequested) { + resolve(cancelValue()); + return; + } else { + resolve(result); + } + }, e => { + console.error(formatError(errorMessage, e)); + resolve(errorVal); + }); + }); }); } + export function runSafe(func: () => T, errorVal: T, errorMessage: string, token: CancellationToken): Thenable> { return new Promise>((resolve, reject) => { - setTimeout(() => { + setImmediate(() => { if (token.isCancellationRequested) { resolve(cancelValue()); } else { @@ -45,7 +59,7 @@ export function runSafe(func: () => T, errorVal: T, errorMessage: string, resolve(errorVal); } } - }, 100); + }); }); } -- GitLab