sort code lenses by range and provider rank, #10061
This commit is contained in:
parent
92aafee3cc
commit
55ff6262bd
|
@ -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;
|
||||
});
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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');
|
||||
|
|
Loading…
Reference in a new issue