From 706ada461250bafabd0c600be7c7f26908e622ac Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 1 Oct 2018 12:27:33 +0200 Subject: [PATCH] debt - let sequence and first use native promises --- src/vs/base/common/async.ts | 36 ++++--------------- src/vs/editor/contrib/format/format.ts | 6 ++-- .../parameterHints/provideSignatureHelp.ts | 4 +-- src/vs/editor/contrib/suggest/suggest.ts | 4 +-- .../wordHighlighter/wordHighlighter.ts | 4 +-- .../test/textModelResolverService.test.ts | 14 +++++--- 6 files changed, 26 insertions(+), 42 deletions(-) diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index 7e4a656d421..466cbc5ee42 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -333,7 +333,7 @@ export function always(winjsPromiseOrThenable: Thenable, callback: () => v * promise will complete to an array of results from each promise. */ -export function sequence(promiseFactories: ITask>[]): TPromise { +export function sequence(promiseFactories: ITask>[]): Promise { const results: T[] = []; let index = 0; const len = promiseFactories.length; @@ -352,49 +352,27 @@ export function sequence(promiseFactories: ITask>[]): TPromise(promiseFactories: ITask>[], shouldStop: (t: T) => boolean = t => !!t, defaultValue: T = null): Promise { - +export function first(promiseFactories: ITask>[], shouldStop: (t: T) => boolean = t => !!t, defaultValue: T = null): Promise { let index = 0; const len = promiseFactories.length; - const loop = () => { + const loop: () => Promise = () => { if (index >= len) { return Promise.resolve(defaultValue); } - const factory = promiseFactories[index++]; - const promise = factory(); - return promise.then(result => { - if (shouldStop(result)) { - return Promise.resolve(result); - } - return loop(); - }); - }; - - return loop(); -} - -export function first(promiseFactories: ITask>[], shouldStop: (t: T) => boolean = t => !!t, defaultValue: T = null): TPromise { - let index = 0; - const len = promiseFactories.length; - - const loop: () => TPromise = () => { - if (index >= len) { - return TPromise.as(defaultValue); - } const factory = promiseFactories[index++]; - const promise = factory(); + const promise = Promise.resolve(factory()); return promise.then(result => { if (shouldStop(result)) { - return TPromise.as(result); + return Promise.resolve(result); } return loop(); diff --git a/src/vs/editor/contrib/format/format.ts b/src/vs/editor/contrib/format/format.ts index ea25a1e2086..c87f023886f 100644 --- a/src/vs/editor/contrib/format/format.ts +++ b/src/vs/editor/contrib/format/format.ts @@ -11,7 +11,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { registerDefaultLanguageCommand, registerLanguageCommand } from 'vs/editor/browser/editorExtensions'; import { DocumentFormattingEditProviderRegistry, DocumentRangeFormattingEditProviderRegistry, OnTypeFormattingEditProviderRegistry, FormattingOptions, TextEdit } from 'vs/editor/common/modes'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { first2 } from 'vs/base/common/async'; +import { first } from 'vs/base/common/async'; import { Position } from 'vs/editor/common/core/position'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -34,7 +34,7 @@ export function getDocumentRangeFormattingEdits(model: ITextModel, range: Range, return Promise.reject(new NoProviderError()); } - return first2(providers.map(provider => () => { + return first(providers.map(provider => () => { return Promise.resolve(provider.provideDocumentRangeFormattingEdits(model, range, options, token)) .then(undefined, onUnexpectedExternalError); }), result => !isFalsyOrEmpty(result)); @@ -48,7 +48,7 @@ export function getDocumentFormattingEdits(model: ITextModel, options: Formattin return getDocumentRangeFormattingEdits(model, model.getFullModelRange(), options, token); } - return first2(providers.map(provider => () => { + return first(providers.map(provider => () => { return Promise.resolve(provider.provideDocumentFormattingEdits(model, options, token)) .then(undefined, onUnexpectedExternalError); }), result => !isFalsyOrEmpty(result)); diff --git a/src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts b/src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts index c75a78f58f9..586746f07ee 100644 --- a/src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts +++ b/src/vs/editor/contrib/parameterHints/provideSignatureHelp.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { first2 } from 'vs/base/common/async'; +import { first } from 'vs/base/common/async'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { registerDefaultLanguageCommand } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; @@ -21,7 +21,7 @@ export function provideSignatureHelp(model: ITextModel, position: Position, cont const supports = modes.SignatureHelpProviderRegistry.ordered(model); - return first2(supports.map(support => () => { + return first(supports.map(support => () => { return Promise.resolve(support.provideSignatureHelp(model, position, token, context)).catch(onUnexpectedExternalError); })); } diff --git a/src/vs/editor/contrib/suggest/suggest.ts b/src/vs/editor/contrib/suggest/suggest.ts index 8ffed9216b9..744a1983392 100644 --- a/src/vs/editor/contrib/suggest/suggest.ts +++ b/src/vs/editor/contrib/suggest/suggest.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { first2 } from 'vs/base/common/async'; +import { first } from 'vs/base/common/async'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { compareIgnoreCase } from 'vs/base/common/strings'; import { assign } from 'vs/base/common/objects'; @@ -111,7 +111,7 @@ export function provideSuggestionItems( })); }); - const result = first2(factory, () => { + const result = first(factory, () => { // stop on result or cancellation return hasResult || token.isCancellationRequested; }).then(() => { diff --git a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts index 7414728d2b7..fb48ab55019 100644 --- a/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/wordHighlighter.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; -import { first2, createCancelablePromise, CancelablePromise, timeout } from 'vs/base/common/async'; +import { first, createCancelablePromise, CancelablePromise, timeout } from 'vs/base/common/async'; import { onUnexpectedExternalError, onUnexpectedError } from 'vs/base/common/errors'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -45,7 +45,7 @@ export function getOccurrencesAtPosition(model: ITextModel, position: Position, // in order of score ask the occurrences provider // until someone response with a good result // (good = none empty array) - return first2(orderedByScore.map(provider => () => { + return first(orderedByScore.map(provider => () => { return Promise.resolve(provider.provideDocumentHighlights(model, position, token)) .then(undefined, onUnexpectedExternalError); }), result => !isFalsyOrEmpty(result)); diff --git a/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts b/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts index db48a7cf3cf..c933bacaa33 100644 --- a/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts +++ b/src/vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts @@ -72,16 +72,19 @@ suite('Workbench - TextModelResolverService', () => { let resource = URI.from({ scheme: 'test', authority: null, path: 'thePath' }); let input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, 'The Name', 'The Description', resource); - return input.resolve().then(model => { + return input.resolve().then(async model => { assert.ok(model); assert.equal(snapshotToString((model as ResourceEditorModel).createSnapshot()), 'Hello Test'); let disposed = false; - once(model.onDispose)(() => { - disposed = true; + let disposedPromise = new Promise(resolve => { + once(model.onDispose)(() => { + disposed = true; + resolve(); + }); }); - input.dispose(); + await disposedPromise; assert.equal(disposed, true); dispose.dispose(); @@ -161,7 +164,10 @@ suite('Workbench - TextModelResolverService', () => { modelRef1.dispose(); assert(!textModel.isDisposed(), 'the text model should still not be disposed'); + let p1 = new Promise(resolve => textModel.onWillDispose(resolve)); modelRef2.dispose(); + + await p1; assert(textModel.isDisposed(), 'the text model should finally be disposed'); disposable.dispose(); -- GitLab