sort code lenses by range and provider rank, #10061

This commit is contained in:
Johannes Rieken 2016-08-04 11:55:27 +02:00
parent 92aafee3cc
commit 55ff6262bd
3 changed files with 21 additions and 23 deletions

View file

@ -508,11 +508,6 @@ export class CodeLensContribution implements editorCommon.IEditorContribution {
if (!this._editor.getModel()) {
return;
}
if (!symbols) {
symbols = [];
} else {
symbols = symbols.sort((a, b) => Range.compareRangesUsingStarts(Range.lift(a.symbol.range), Range.lift(b.symbol.range)));
}
let maxLineNumber = this._editor.getModel().getLineCount();
let groups: ICodeLensData[][] = [];
@ -611,7 +606,7 @@ export class CodeLensContribution implements editorCommon.IEditorContribution {
const resolvedSymbols = new Array<ICodeLensSymbol>(request.length);
const promises = request.map((request, i) => {
return asWinJsPromise((token) => {
return request.support.resolveCodeLens(model, request.symbol, token);
return request.provider.resolveCodeLens(model, request.symbol, token);
}).then(symbol => {
resolvedSymbols[i] = symbol;
});

View file

@ -5,10 +5,11 @@
'use strict';
import {illegalArgument, isPromiseCanceledError, onUnexpectedError} from 'vs/base/common/errors';
import {illegalArgument, onUnexpectedError} from 'vs/base/common/errors';
import URI from 'vs/base/common/uri';
import {TPromise} from 'vs/base/common/winjs.base';
import {IModel} from 'vs/editor/common/editorCommon';
import {Range} from 'vs/editor/common/core/range';
import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
import {CodeLensProviderRegistry, CodeLensProvider, ICodeLensSymbol} from 'vs/editor/common/modes';
import {IModelService} from 'vs/editor/common/services/modelService';
@ -16,30 +17,32 @@ import {asWinJsPromise} from 'vs/base/common/async';
export interface ICodeLensData {
symbol: ICodeLensSymbol;
support: CodeLensProvider;
provider: CodeLensProvider;
}
export function getCodeLensData(model: IModel): TPromise<ICodeLensData[]> {
const symbols: ICodeLensData[] = [];
const promises = CodeLensProviderRegistry.all(model).map(support => {
return asWinJsPromise((token) => {
return support.provideCodeLenses(model, token);
}).then(result => {
if (!Array.isArray(result)) {
return;
}
const provider = CodeLensProviderRegistry.ordered(model);
const promises = provider.map(provider => asWinJsPromise(token => provider.provideCodeLenses(model, token)).then(result => {
if (Array.isArray(result)) {
for (let symbol of result) {
symbols.push({ symbol, support });
symbols.push({ symbol, provider });
}
}, err => {
if (!isPromiseCanceledError(err)) {
onUnexpectedError(err);
}
}, onUnexpectedError));
return TPromise.join(promises).then(() => {
return symbols.sort((a, b) => {
// sort by range and provider rank
let ret = Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range);
if (ret === 0) {
ret = provider.indexOf(a.provider) - provider.indexOf(b.provider);
}
return ret;
});
});
return TPromise.join(promises).then(() => symbols);
}
CommonEditorRegistry.registerLanguageCommand('_executeCodeLensProvider', function(accessor, args) {

View file

@ -214,7 +214,7 @@ suite('ExtHostLanguageFeatures', function() {
let data = value[0];
return asWinJsPromise((token) => {
return data.support.resolveCodeLens(model, data.symbol, token);
return data.provider.resolveCodeLens(model, data.symbol, token);
}).then(symbol => {
assert.equal(symbol.command.id, 'id');
assert.equal(symbol.command.title, 'Title');
@ -238,7 +238,7 @@ suite('ExtHostLanguageFeatures', function() {
let data = value[0];
return asWinJsPromise((token) => {
return data.support.resolveCodeLens(model, data.symbol, token);
return data.provider.resolveCodeLens(model, data.symbol, token);
}).then(symbol => {
assert.equal(symbol.command.id, 'missing');