提交 7a6d2cad 编写于 作者: J Johannes Rieken

💄 some code lens polish

上级 82aa8fc4
......@@ -36,44 +36,47 @@ export class CodeLensModel {
}
}
export function getCodeLensData(model: ITextModel, token: CancellationToken): Promise<CodeLensModel> {
export async function getCodeLensModel(model: ITextModel, token: CancellationToken): Promise<CodeLensModel> {
const provider = CodeLensProviderRegistry.ordered(model);
const providerRanks = new Map<CodeLensProvider, number>();
const result = new CodeLensModel();
const promises = provider.map((provider, i) => {
const promises = provider.map(async (provider, i) => {
providerRanks.set(provider, i);
return Promise.resolve(provider.provideCodeLenses(model, token))
.then(list => list && result.add(list, provider))
.catch(onUnexpectedExternalError);
});
return Promise.all(promises).then(() => {
result.lenses = mergeSort(result.lenses, (a, b) => {
// sort by lineNumber, provider-rank, and column
if (a.symbol.range.startLineNumber < b.symbol.range.startLineNumber) {
return -1;
} else if (a.symbol.range.startLineNumber > b.symbol.range.startLineNumber) {
return 1;
} else if (providerRanks.get(a.provider)! < providerRanks.get(b.provider)!) {
return -1;
} else if (providerRanks.get(a.provider)! > providerRanks.get(b.provider)!) {
return 1;
} else if (a.symbol.range.startColumn < b.symbol.range.startColumn) {
return -1;
} else if (a.symbol.range.startColumn > b.symbol.range.startColumn) {
return 1;
} else {
return 0;
try {
const list = await Promise.resolve(provider.provideCodeLenses(model, token));
if (list) {
result.add(list, provider);
}
});
} catch (err) {
onUnexpectedExternalError(err);
}
});
return result;
await Promise.all(promises);
result.lenses = mergeSort(result.lenses, (a, b) => {
// sort by lineNumber, provider-rank, and column
if (a.symbol.range.startLineNumber < b.symbol.range.startLineNumber) {
return -1;
} else if (a.symbol.range.startLineNumber > b.symbol.range.startLineNumber) {
return 1;
} else if ((providerRanks.get(a.provider)!) < (providerRanks.get(b.provider)!)) {
return -1;
} else if ((providerRanks.get(a.provider)!) > (providerRanks.get(b.provider)!)) {
return 1;
} else if (a.symbol.range.startColumn < b.symbol.range.startColumn) {
return -1;
} else if (a.symbol.range.startColumn > b.symbol.range.startColumn) {
return 1;
} else {
return 0;
}
});
return result;
}
registerLanguageCommand('_executeCodeLensProvider', function (accessor, args) {
......@@ -90,7 +93,7 @@ registerLanguageCommand('_executeCodeLensProvider', function (accessor, args) {
const result: CodeLens[] = [];
const disposables = new DisposableStore();
return getCodeLensData(model, CancellationToken.None).then(value => {
return getCodeLensModel(model, CancellationToken.None).then(value => {
disposables.add(value);
let resolve: Promise<any>[] = [];
......
......@@ -12,7 +12,7 @@ import { registerEditorContribution, ServicesAccessor, registerEditorAction, Edi
import { IEditorContribution } from 'vs/editor/common/editorCommon';
import { IModelDecorationsChangeAccessor } from 'vs/editor/common/model';
import { CodeLensProviderRegistry, CodeLens, Command } from 'vs/editor/common/modes';
import { CodeLensModel, getCodeLensData, CodeLensItem } from 'vs/editor/contrib/codelens/codelens';
import { CodeLensModel, getCodeLensModel, CodeLensItem } from 'vs/editor/contrib/codelens/codelens';
import { CodeLensWidget, CodeLensHelper } from 'vs/editor/contrib/codelens/codelensWidget';
import { ICommandService } from 'vs/platform/commands/common/commands';
import { INotificationService } from 'vs/platform/notification/common/notification';
......@@ -35,7 +35,7 @@ export class CodeLensContribution implements IEditorContribution {
private readonly _styleElement: HTMLStyleElement;
private readonly _styleClassName: string;
private _lenses: CodeLensWidget[] = [];
private _currentFindCodeLensSymbolsPromise: CancelablePromise<CodeLensModel> | undefined;
private _currentGetCodeLensModel: CancelablePromise<CodeLensModel> | undefined;
private _oldCodeLensModels = new DisposableStore();
private _currentCodeLensModel: CodeLensModel | undefined;
private _modelChangeCounter: number = 0;
......@@ -80,7 +80,7 @@ export class CodeLensContribution implements IEditorContribution {
this._localDispose();
this._globalToDispose.dispose();
this._oldCodeLensModels.dispose();
dispose(this._currentCodeLensModel);
this._currentCodeLensModel?.dispose();
}
private _updateLensStyle(): void {
......@@ -99,9 +99,9 @@ export class CodeLensContribution implements IEditorContribution {
}
private _localDispose(): void {
if (this._currentFindCodeLensSymbolsPromise) {
this._currentFindCodeLensSymbolsPromise.cancel();
this._currentFindCodeLensSymbolsPromise = undefined;
if (this._currentGetCodeLensModel) {
this._currentGetCodeLensModel.cancel();
this._currentGetCodeLensModel = undefined;
this._modelChangeCounter++;
}
if (this._currentResolveCodeLensSymbolsPromise) {
......@@ -157,13 +157,13 @@ export class CodeLensContribution implements IEditorContribution {
const scheduler = new RunOnceScheduler(() => {
const counterValue = ++this._modelChangeCounter;
if (this._currentFindCodeLensSymbolsPromise) {
this._currentFindCodeLensSymbolsPromise.cancel();
if (this._currentGetCodeLensModel) {
this._currentGetCodeLensModel.cancel();
}
this._currentFindCodeLensSymbolsPromise = createCancelablePromise(token => getCodeLensData(model, token));
this._currentGetCodeLensModel = createCancelablePromise(token => getCodeLensModel(model, token));
this._currentFindCodeLensSymbolsPromise.then(result => {
this._currentGetCodeLensModel.then(result => {
if (counterValue === this._modelChangeCounter) { // only the last one wins
if (this._currentCodeLensModel) {
this._oldCodeLensModels.add(this._currentCodeLensModel);
......
......@@ -22,7 +22,7 @@ import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments';
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
import { getDocumentSymbols } from 'vs/editor/contrib/gotoSymbol/documentSymbols';
import * as modes from 'vs/editor/common/modes';
import { getCodeLensData } from 'vs/editor/contrib/codelens/codelens';
import { getCodeLensModel } from 'vs/editor/contrib/codelens/codelens';
import { getDefinitionsAtPosition, getImplementationsAtPosition, getTypeDefinitionsAtPosition, getDeclarationsAtPosition, getReferencesAtPosition } from 'vs/editor/contrib/gotoSymbol/goToSymbol';
import { getHover } from 'vs/editor/contrib/hover/getHover';
import { getOccurrencesAtPosition } from 'vs/editor/contrib/wordHighlighter/wordHighlighter';
......@@ -189,7 +189,7 @@ suite('ExtHostLanguageFeatures', function () {
}));
await rpcProtocol.sync();
const value = await getCodeLensData(model, CancellationToken.None);
const value = await getCodeLensModel(model, CancellationToken.None);
assert.equal(value.lenses.length, 1);
});
......@@ -207,7 +207,7 @@ suite('ExtHostLanguageFeatures', function () {
}));
await rpcProtocol.sync();
const value = await getCodeLensData(model, CancellationToken.None);
const value = await getCodeLensModel(model, CancellationToken.None);
assert.equal(value.lenses.length, 1);
const [data] = value.lenses;
const symbol = await Promise.resolve(data.provider.resolveCodeLens!(model, data.symbol, CancellationToken.None));
......@@ -224,7 +224,7 @@ suite('ExtHostLanguageFeatures', function () {
}));
await rpcProtocol.sync();
const value = await getCodeLensData(model, CancellationToken.None);
const value = await getCodeLensModel(model, CancellationToken.None);
assert.equal(value.lenses.length, 1);
let [data] = value.lenses;
const symbol = await Promise.resolve(data.provider.resolveCodeLens!(model, data.symbol, CancellationToken.None));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册