mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 03:29:00 +01:00
allow to register for the same scheme twice. lifo behaviour
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user