mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-26 23:00:29 -04:00
* Merge from vscode 37cb23d3dd4f9433d56d4ba5ea3203580719a0bd * fix issues with merges * bump node version in azpipe * replace license headers * remove duplicate launch task * fix build errors * fix build errors * fix tslint issues * working through package and linux build issues * more work * wip * fix packaged builds * working through linux build errors * wip * wip * wip * fix mac and linux file limits * iterate linux pipeline * disable editor typing * revert series to parallel * remove optimize vscode from linux * fix linting issues * revert testing change * add work round for new node * readd packaging for extensions * fix issue with angular not resolving decorator dependencies
71 lines
2.6 KiB
TypeScript
71 lines
2.6 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { ITextModel } from 'vs/editor/common/model';
|
|
import { onUnexpectedExternalError } from 'vs/base/common/errors';
|
|
import { mergeSort } from 'vs/base/common/arrays';
|
|
import { Event } from 'vs/base/common/event';
|
|
import { CancellationToken } from 'vs/base/common/cancellation';
|
|
import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureRegistry';
|
|
import { ProviderResult } from 'vs/editor/common/modes';
|
|
import { IRange } from 'vs/editor/common/core/range';
|
|
|
|
export interface ICodeInsetSymbol {
|
|
id: string;
|
|
range: IRange;
|
|
height?: number;
|
|
}
|
|
|
|
export interface CodeInsetProvider {
|
|
onDidChange?: Event<this>;
|
|
provideCodeInsets(model: ITextModel, token: CancellationToken): ProviderResult<ICodeInsetSymbol[]>;
|
|
resolveCodeInset(model: ITextModel, codeInset: ICodeInsetSymbol, token: CancellationToken): ProviderResult<ICodeInsetSymbol>;
|
|
}
|
|
|
|
export const CodeInsetProviderRegistry = new LanguageFeatureRegistry<CodeInsetProvider>();
|
|
|
|
export interface ICodeInsetData {
|
|
symbol: ICodeInsetSymbol;
|
|
provider: CodeInsetProvider;
|
|
resolved?: boolean;
|
|
}
|
|
|
|
export function getCodeInsetData(model: ITextModel, token: CancellationToken): Promise<ICodeInsetData[]> {
|
|
|
|
const symbols: ICodeInsetData[] = [];
|
|
const providers = CodeInsetProviderRegistry.ordered(model);
|
|
|
|
const promises = providers.map(provider =>
|
|
Promise.resolve(provider.provideCodeInsets(model, token)).then(result => {
|
|
if (Array.isArray(result)) {
|
|
for (let symbol of result) {
|
|
symbols.push({ symbol, provider });
|
|
}
|
|
}
|
|
}).catch(onUnexpectedExternalError));
|
|
|
|
return Promise.all(promises).then(() => {
|
|
|
|
return mergeSort(symbols, (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 (providers.indexOf(a.provider) < providers.indexOf(b.provider)) {
|
|
return -1;
|
|
} else if (providers.indexOf(a.provider) > providers.indexOf(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;
|
|
}
|
|
});
|
|
});
|
|
}
|