allow to register for the same scheme twice. lifo behaviour

This commit is contained in:
Johannes Rieken
2016-01-25 16:12:26 +01:00
parent 078397f178
commit 74d033e92a
3 changed files with 158 additions and 66 deletions

View File

@@ -5,6 +5,7 @@
'use strict';
import {TPromise} from 'vs/base/common/winjs.base';
import {sequence} from 'vs/base/common/async';
import {EditorModel, EditorInput} from 'vs/workbench/common/editor';
import {ResourceEditorModel} from 'vs/workbench/common/editor/resourceEditorModel';
import {IModel} from 'vs/editor/common/editorCommon';
@@ -31,11 +32,28 @@ export class ResourceEditorInput extends EditorInput {
// todo@joh,ben this should maybe be a service that is in charge of loading/resolving a uri from a scheme
private static loadingModels: { [uri: string]: TPromise<IModel> } = Object.create(null);
private static registry: { [scheme: string]: IResourceEditorContentProvider } = Object.create(null);
private static registry: { [scheme: string]: IResourceEditorContentProvider[] } = Object.create(null);
public static registerResourceContentProvider(scheme: string, provider: IResourceEditorContentProvider): IDisposable {
ResourceEditorInput.registry[scheme] = provider;
return { dispose() { delete ResourceEditorInput.registry[scheme] } };
let array = ResourceEditorInput.registry[scheme];
if (!array) {
array = [provider];
ResourceEditorInput.registry[scheme] = array;
} else {
array.unshift(provider);
}
return {
dispose() {
let array = ResourceEditorInput.registry[scheme];
let idx = array.indexOf(provider);
if (idx >= 0) {
array.splice(idx, 1);
if (array.length === 0) {
delete ResourceEditorInput.registry[scheme];
}
}
}
};
}
private static getOrCreateModel(modelService: IModelService, resource: URI): TPromise<IModel> {
@@ -49,8 +67,8 @@ export class ResourceEditorInput extends EditorInput {
// make sure we have a provider this scheme
// the resource uses
const provider = ResourceEditorInput.registry[resource.scheme];
if (!provider) {
const array = ResourceEditorInput.registry[resource.scheme];
if (!array) {
return TPromise.wrapError(`No model with uri '${resource}' nor a resolver for the scheme '${resource.scheme}'.`);
}
@@ -59,7 +77,26 @@ export class ResourceEditorInput extends EditorInput {
// twice
ResourceEditorInput.loadingModels[resource.toString()] = loadingModel = new TPromise<IModel>((resolve, reject) => {
provider.provideTextContent(resource).then(resolve, reject);
let result: IModel;
let lastError: any;
sequence(array.map(provider => {
return () => {
if (!result) {
return provider.provideTextContent(resource).then(value => {
result = value;
}, err => {
lastError = err;
});
}
}
})).then(() => {
if (!result && lastError) {
reject(lastError);
} else {
resolve(result);
}
}, reject);
}, function() {
// no cancellation when caching promises