提交 43392774 编写于 作者: M Martin Aeschlimann

[json] update sefeRunner

上级 18bde2a5
...@@ -15,7 +15,7 @@ import * as fs from 'fs'; ...@@ -15,7 +15,7 @@ import * as fs from 'fs';
import URI from 'vscode-uri'; import URI from 'vscode-uri';
import * as URL from 'url'; import * as URL from 'url';
import { startsWith } from './utils/strings'; 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 { JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration } from 'vscode-json-languageservice';
import { getLanguageModelCache } from './languageModelCache'; import { getLanguageModelCache } from './languageModelCache';
import { getFoldingRegions } from './jsonFolding'; import { getFoldingRegions } from './jsonFolding';
...@@ -42,8 +42,12 @@ namespace SchemaContentChangeNotification { ...@@ -42,8 +42,12 @@ namespace SchemaContentChangeNotification {
let connection: IConnection = createConnection(); let connection: IConnection = createConnection();
process.on('unhandledRejection', (e: any) => { 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.log = connection.console.log.bind(connection.console);
console.error = connection.console.error.bind(connection.console); console.error = connection.console.error.bind(connection.console);
...@@ -302,26 +306,26 @@ function getJSONDocument(document: TextDocument): JSONDocument { ...@@ -302,26 +306,26 @@ function getJSONDocument(document: TextDocument): JSONDocument {
return jsonDocuments.get(document); return jsonDocuments.get(document);
} }
connection.onCompletion(textDocumentPosition => { connection.onCompletion((textDocumentPosition, token) => {
return runSafeAsync(() => { return runSafeAsync(() => {
let document = documents.get(textDocumentPosition.textDocument.uri); let document = documents.get(textDocumentPosition.textDocument.uri);
let jsonDocument = getJSONDocument(document); let jsonDocument = getJSONDocument(document);
return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); 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 runSafeAsync(() => {
return languageService.doResolve(completionItem); 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(() => { return runSafeAsync(() => {
let document = documents.get(textDocumentPositionParams.textDocument.uri); let document = documents.get(textDocumentPositionParams.textDocument.uri);
let jsonDocument = getJSONDocument(document); let jsonDocument = getJSONDocument(document);
return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); 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) => { connection.onDocumentSymbol((documentSymbolParams, token) => {
...@@ -339,7 +343,7 @@ connection.onDocumentRangeFormatting((formatParams, token) => { ...@@ -339,7 +343,7 @@ connection.onDocumentRangeFormatting((formatParams, token) => {
}, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token); }, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token);
}); });
connection.onRequest(DocumentColorRequest.type, params => { connection.onRequest(DocumentColorRequest.type, (params, token) => {
return runSafeAsync(() => { return runSafeAsync(() => {
let document = documents.get(params.textDocument.uri); let document = documents.get(params.textDocument.uri);
if (document) { if (document) {
...@@ -347,7 +351,7 @@ connection.onRequest(DocumentColorRequest.type, params => { ...@@ -347,7 +351,7 @@ connection.onRequest(DocumentColorRequest.type, params => {
return languageService.findDocumentColors(document, jsonDocument); return languageService.findDocumentColors(document, jsonDocument);
} }
return Promise.resolve([]); 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) => { connection.onRequest(ColorPresentationRequest.type, (params, token) => {
......
...@@ -18,16 +18,30 @@ export function formatError(message: string, err: any): string { ...@@ -18,16 +18,30 @@ export function formatError(message: string, err: any): string {
return message; return message;
} }
export function runSafeAsync<T>(func: () => Thenable<T>, errorVal: T, errorMessage: string): Thenable<T> { export function runSafeAsync<T>(func: () => Thenable<T>, errorVal: T, errorMessage: string, token: CancellationToken): Thenable<T | ResponseError<any>> {
let t = func(); return new Promise<T | ResponseError<any>>((resolve, reject) => {
return t.then(void 0, e => { setImmediate(() => {
console.error(formatError(errorMessage, e)); if (token.isCancellationRequested) {
return errorVal; 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<T, E>(func: () => T, errorVal: T, errorMessage: string, token: CancellationToken): Thenable<T | ResponseError<E>> { export function runSafe<T, E>(func: () => T, errorVal: T, errorMessage: string, token: CancellationToken): Thenable<T | ResponseError<E>> {
return new Promise<T | ResponseError<E>>((resolve, reject) => { return new Promise<T | ResponseError<E>>((resolve, reject) => {
setTimeout(() => { setImmediate(() => {
if (token.isCancellationRequested) { if (token.isCancellationRequested) {
resolve(cancelValue()); resolve(cancelValue());
} else { } else {
...@@ -45,7 +59,7 @@ export function runSafe<T, E>(func: () => T, errorVal: T, errorMessage: string, ...@@ -45,7 +59,7 @@ export function runSafe<T, E>(func: () => T, errorVal: T, errorMessage: string,
resolve(errorVal); resolve(errorVal);
} }
} }
}, 100); });
}); });
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册