From 6ea319fa68201e80fb194b6cb41df95051bdc8ae Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 25 Nov 2015 11:00:40 +0100 Subject: [PATCH] move the logic of getOutlineEntries into one place --- .../contrib/quickOpen/common/quickOpen.ts | 63 ++++++++++++++++++- .../workbench/api/common/languageFeatures.ts | 8 +-- .../quickopen/browser/gotoSymbolHandler.ts | 33 +--------- .../test/common/api/languageFeatures.test.ts | 14 ++--- 4 files changed, 75 insertions(+), 43 deletions(-) diff --git a/src/vs/editor/contrib/quickOpen/common/quickOpen.ts b/src/vs/editor/contrib/quickOpen/common/quickOpen.ts index cf5c24c299e..b4e2dc1c9ea 100644 --- a/src/vs/editor/contrib/quickOpen/common/quickOpen.ts +++ b/src/vs/editor/contrib/quickOpen/common/quickOpen.ts @@ -5,14 +5,73 @@ 'use strict'; +import {onUnexpectedError} from 'vs/base/common/errors'; +import {TPromise} from 'vs/base/common/winjs.base'; +import {Range} from 'vs/editor/common/core/range'; +import {IModel} from 'vs/editor/common/editorCommon'; import {IOutlineEntry, IOutlineSupport} from 'vs/editor/common/modes'; import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry'; -const QuickOutineRegistry = new LanguageFeatureRegistry('outlineSupport'); +const OutlineRegistry = new LanguageFeatureRegistry('outlineSupport'); export { + OutlineRegistry, IOutlineEntry, IOutlineSupport } -export default QuickOutineRegistry; \ No newline at end of file +export function getOutlineEntries(model: IModel): TPromise<{ entries: IOutlineEntry[], outlineGroupLabel: { [n: string]: string;} }> { + + let resource = model.getAssociatedResource(); + let groupLabels: { [n: string]: string } = Object.create(null); + let entries: IOutlineEntry[] = []; + + let promises = OutlineRegistry.all(model).map(support => { + + if (support.outlineGroupLabel) { + for (var key in support.outlineGroupLabel) { + if (Object.prototype.hasOwnProperty.call(support.outlineGroupLabel, key)) { + groupLabels[key] = support.outlineGroupLabel[key]; + } + } + } + + return support.getOutline(resource).then(result => { + if (Array.isArray(result)) { + entries.push(...result); + } + }, err => { + onUnexpectedError(err); + }); + }); + + return TPromise.join(promises).then(() => { + let flatEntries: IOutlineEntry[] = []; + flatten(flatEntries, entries, ''); + flatEntries.sort(compareEntriesUsingStart); + + return { + entries: flatEntries, + outlineGroupLabel: groupLabels + } + }); +} + +function compareEntriesUsingStart(a: IOutlineEntry, b: IOutlineEntry): number{ + return Range.compareRangesUsingStarts(a.range, b.range); +} + +function flatten(bucket: IOutlineEntry[], entries: IOutlineEntry[], overrideContainerLabel: string): void { + for (let entry of entries) { + bucket.push({ + type: entry.type, + range: entry.range, + label: entry.label, + icon: entry.icon, + containerLabel: entry.containerLabel || overrideContainerLabel + }); + if (entry.children) { + flatten(bucket, entry.children, entry.label); + } + } +} diff --git a/src/vs/workbench/api/common/languageFeatures.ts b/src/vs/workbench/api/common/languageFeatures.ts index b5caf5ddbd2..4fa0fb5ffc7 100644 --- a/src/vs/workbench/api/common/languageFeatures.ts +++ b/src/vs/workbench/api/common/languageFeatures.ts @@ -27,7 +27,7 @@ import ExtraInfoRegistry from 'vs/editor/contrib/hover/common/hover'; import DocumentHighlighterRegistry from 'vs/editor/contrib/wordHighlighter/common/wordHighlighter'; import ReferenceSearchRegistry from 'vs/editor/contrib/referenceSearch/common/referenceSearch'; import QuickFixRegistry from 'vs/editor/contrib/quickFix/common/quickFix'; -import QuickOutlineRegistry, {IOutlineEntry, IOutlineSupport} from 'vs/editor/contrib/quickOpen/common/quickOpen'; +import {OutlineRegistry, IOutlineEntry, IOutlineSupport} from 'vs/editor/contrib/quickOpen/common/quickOpen'; import LanguageFeatureRegistry from 'vs/editor/common/modes/languageFeatureRegistry'; import {NavigateTypesSupportRegistry, INavigateTypesSupport, ITypeBearing} from 'vs/workbench/parts/search/common/search' import {RenameRegistry} from 'vs/editor/contrib/rename/common/rename'; @@ -544,7 +544,7 @@ export class ExtensionHostDocumentSymbols extends AbstractExtensionHostFeature implements IOutlineSupport { constructor( @IThreadService threadService: IThreadService) { - super('vscode.executeDocumentSymbolProvider', QuickOutlineRegistry, threadService); + super('vscode.executeDocumentSymbolProvider', OutlineRegistry, threadService); } getOutline(resource: URI): TPromise{ @@ -1262,7 +1262,7 @@ export namespace LanguageFeatures { threadService.getRemotable(MainThreadReferenceSearch); threadService.getRemotable(MainThreadCodeActions); threadService.getRemotable(MainThreadCodeLens); - threadService.getRemotable(MainThreadDocumentSymbols); + // threadService.getRemotable(MainThreadDocumentSymbols); threadService.getRemotable(MainThreadWorkspaceSymbols); threadService.getRemotable(MainThreadRename); threadService.getRemotable(MainThreadFormatDocument); @@ -1280,7 +1280,7 @@ export namespace LanguageFeatures { referenceSearch: new ExtensionHostReferenceSearch(threadService), codeActions: new ExtensionHostCodeActions(threadService), codeLens: threadService.getRemotable(ExtensionHostCodeLens), - documentSymbols: new ExtensionHostDocumentSymbols(threadService), + // documentSymbols: new ExtensionHostDocumentSymbols(threadService), workspaceSymbols: new ExtensionHostWorkspaceSymbols(threadService), rename: new ExtensionHostRename(threadService), formatDocument: new ExtHostFormatDocument(threadService), diff --git a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts b/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts index 046dd4cc8d6..576ce3f82c2 100644 --- a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts @@ -31,7 +31,7 @@ import {IQuickOpenService} from 'vs/workbench/services/quickopen/browser/quickOp import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {Position} from 'vs/platform/editor/common/editor'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; -import QuickOpenRegistry from 'vs/editor/contrib/quickOpen/common/quickOpen'; +import {OutlineRegistry, getOutlineEntries} from 'vs/editor/contrib/quickOpen/common/quickOpen'; const ACTION_ID = 'workbench.action.gotoSymbol'; const ACTION_LABEL = nls.localize('gotoSymbol', "Go to Symbol..."); @@ -432,7 +432,7 @@ export class GotoSymbolHandler extends QuickOpenHandler { if (model && types.isFunction((model).getMode)) { - canRun = QuickOpenRegistry.has( model); + canRun = OutlineRegistry.has( model); } } @@ -527,34 +527,7 @@ export class GotoSymbolHandler extends QuickOpenHandler { return TPromise.as(this.outlineToModelCache[modelId]); } - let groupLabels: { [n: string]: string } = Object.create(null); - let entries: IOutlineEntry[] = []; - let resource = (model).getAssociatedResource(); - let promises = QuickOpenRegistry.all(model).map(support => { - - if (support.outlineGroupLabel) { - for (var key in support.outlineGroupLabel) { - if (Object.prototype.hasOwnProperty.call(support.outlineGroupLabel, key)) { - groupLabels[key] = support.outlineGroupLabel[key]; - } - } - } - - return support.getOutline(resource).then(result => { - if (Array.isArray(result)) { - entries.push(...result); - } - }, err => { - errors.onUnexpectedError(err); - }); - }); - - return TPromise.join(promises).then(() => { - - let outline = { - entries, - outlineGroupLabel: groupLabels - }; + return getOutlineEntries(model).then(outline => { let model = new OutlineModel(outline, this.toQuickOpenEntries(outline)); diff --git a/src/vs/workbench/test/common/api/languageFeatures.test.ts b/src/vs/workbench/test/common/api/languageFeatures.test.ts index 5ea693041f9..bf6a92187e6 100644 --- a/src/vs/workbench/test/common/api/languageFeatures.test.ts +++ b/src/vs/workbench/test/common/api/languageFeatures.test.ts @@ -18,7 +18,7 @@ import * as LF from 'vs/workbench/api/common/languageFeatures'; import {PluginHostCommands, MainThreadCommands} from 'vs/workbench/api/common/pluginHostCommands'; import {PluginHostModelService} from 'vs/workbench/api/common/pluginHostDocuments'; import {SyncDescriptor0} from 'vs/platform/instantiation/common/descriptors'; -import QuickOutlineRegistry from 'vs/editor/contrib/quickOpen/common/quickOpen'; +import {OutlineRegistry} from 'vs/editor/contrib/quickOpen/common/quickOpen'; import {LanguageSelector, ModelLike} from 'vs/editor/common/modes/languageSelector'; class ThreadService extends NullThreadService { @@ -85,17 +85,17 @@ suite('ExtHostLanguageFeatures', function() { // register - assert.equal(QuickOutlineRegistry.all(model).length, 0); + assert.equal(OutlineRegistry.all(model).length, 0); let disposable = extHost.register('far', { provideDocumentSymbols() { return []; } }); - assert.equal(QuickOutlineRegistry.all(model).length, 1); + assert.equal(OutlineRegistry.all(model).length, 1); // deregister disposable.dispose(); - assert.equal(QuickOutlineRegistry.all(model).length, 0); + assert.equal(OutlineRegistry.all(model).length, 0); // all extension host provider appear as one disposable = extHost.register('far', { @@ -108,12 +108,12 @@ suite('ExtHostLanguageFeatures', function() { return []; } }); - assert.equal(QuickOutlineRegistry.all(model).length, 1); + assert.equal(OutlineRegistry.all(model).length, 1); disposable.dispose(); - assert.equal(QuickOutlineRegistry.all(model).length, 1); + assert.equal(OutlineRegistry.all(model).length, 1); disposable2.dispose(); - assert.equal(QuickOutlineRegistry.all(model).length, 0); + assert.equal(OutlineRegistry.all(model).length, 0); }); test('DocumentSymbols, evil provider', function(done) { -- GitLab