diff --git a/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts b/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts index 2d81bca99b8..1eb5b7bc391 100644 --- a/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts +++ b/src/vs/workbench/api/common/extHostDocumentSaveParticipant.ts @@ -5,7 +5,6 @@ import { Event } from 'vs/base/common/event'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { sequence } from 'vs/base/common/async'; import { illegalState } from 'vs/base/common/errors'; import { ExtHostDocumentSaveParticipantShape, MainThreadTextEditorsShape, IWorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { TextEdit } from 'vs/workbench/api/common/extHostTypes'; @@ -48,26 +47,27 @@ export class ExtHostDocumentSaveParticipant implements ExtHostDocumentSavePartic }; } - $participateInSave(data: UriComponents, reason: SaveReason): Promise { + async $participateInSave(data: UriComponents, reason: SaveReason): Promise { const resource = URI.revive(data); - const entries = this._callbacks.toArray(); let didTimeout = false; const didTimeoutHandle = setTimeout(() => didTimeout = true, this._thresholds.timeout); - const promise = sequence(entries.map(listener => { - return () => { - + const results: boolean[] = []; + try { + for (let listener of [...this._callbacks]) { // copy to prevent concurrent modifications if (didTimeout) { // timeout - no more listeners - return Promise.resolve(); + break; } - const document = this._documents.getDocument(resource); - return this._deliverEventAsyncAndBlameBadListeners(listener, { document, reason: TextDocumentSaveReason.to(reason) }); - }; - })); - return promise.finally(() => clearTimeout(didTimeoutHandle)); + const success = await this._deliverEventAsyncAndBlameBadListeners(listener, { document, reason: TextDocumentSaveReason.to(reason) }); + results.push(success); + } + } finally { + clearTimeout(didTimeoutHandle); + } + return results; } private _deliverEventAsyncAndBlameBadListeners([listener, thisArg, extension]: Listener, stubEvent: vscode.TextDocumentWillSaveEvent): Promise { diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index bfc6050de83..e0a8e353551 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { first } from 'vs/base/common/async'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITextModel } from 'vs/editor/common/model'; import { IDisposable, toDisposable, IReference, ReferenceCollection, ImmortalReference } from 'vs/base/common/lifecycle'; @@ -110,7 +109,6 @@ class ResourceModelCollection extends ReferenceCollection { const resource = URI.parse(key); const providers = this.providers[resource.scheme] || []; - const factories = providers.map(p => () => Promise.resolve(p.provideTextContent(resource))); if (resource.query || resource.fragment) { type TextModelResolverUri = { @@ -127,12 +125,13 @@ class ResourceModelCollection extends ReferenceCollection