提交 40479e9d 编写于 作者: A Alex Dima

Add TextModel.getLineIndentGuide

上级 f97350e0
......@@ -1574,6 +1574,11 @@ export interface ITextModel {
*/
getIndentRanges(): IndentRange[];
/**
* @internal
*/
getLineIndentGuide(lineNumber:number): number;
/**
* Get the text for all lines.
*/
......
......@@ -480,11 +480,34 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
this._indentRanges = null;
}
public getIndentRanges(): IndentRange[] {
private _getIndentRanges(): IndentRange[] {
if (!this._indentRanges) {
this._indentRanges = computeRanges(this);
}
return IndentRange.deepCloneArr(this._indentRanges);
return this._indentRanges;
}
public getIndentRanges(): IndentRange[] {
let indentRanges = this._getIndentRanges();
return IndentRange.deepCloneArr(indentRanges);
}
public getLineIndentGuide(lineNumber:number): number {
if (lineNumber < 1 || lineNumber > this.getLineCount()) {
throw new Error('Illegal value ' + lineNumber + ' for `lineNumber`');
}
let indentRanges = this._getIndentRanges();
for (let i = indentRanges.length - 1; i >= 0; i--) {
let rng = indentRanges[i];
if (rng.startLineNumber < lineNumber && lineNumber <= rng.endLineNumber) {
return 1 + Math.floor(rng.indent / this._options.tabSize);
}
}
return 0;
}
public getLinesContent(): string[] {
......
......@@ -556,3 +556,136 @@ suite('Editor Model - TextModel', () => {
model.dispose();
});
});
suite('TextModel.getLineIndentGuide', () => {
function assertIndentGuides(lines:[number,string][]): void {
let text = lines.map(l => l[1]).join('\n');
let model = new TextModel([], TextModel.toRawText(text, TextModel.DEFAULT_CREATION_OPTIONS));
let actual: [number,string][] = [];
for (let line = 1; line <= model.getLineCount(); line++) {
actual[line - 1] = [model.getLineIndentGuide(line), model.getLineContent(line)];
}
// let expected = lines.map(l => l[0]);
assert.deepEqual(actual, lines);
model.dispose();
}
test('getLineIndentGuide one level', () => {
assertIndentGuides([
[0, 'A'],
[1, ' A'],
[1, ' A'],
[1, ' A'],
]);
});
test('getLineIndentGuide two levels', () => {
assertIndentGuides([
[0, 'A'],
[1, ' A'],
[1, ' A'],
[1, ' A'],
[1, ' A'],
]);
});
test('getLineIndentGuide three levels', () => {
assertIndentGuides([
[0, 'A'],
[1, ' A'],
[1, ' A'],
[2, ' A'],
[0, 'A'],
]);
});
test('getLineIndentGuide decreasing indent', () => {
assertIndentGuides([
[0, ' A'],
[0, ' A'],
[0, 'A'],
]);
});
test('getLineIndentGuide Java', () => {
assertIndentGuides([
[0, 'class A {'],
[1, ' void foo() {'],
[1, ' console.log(1);'],
[1, ' console.log(2);'],
[1, ' }'],
[1, ''],
[1, ' void bar() {'],
[1, ' console.log(3);'],
[1, ' }'],
[0, '}'],
[0, 'interface B {'],
[1, ' void bar();'],
[0, '}'],
]);
});
test('getLineIndentGuide Javadoc', () => {
assertIndentGuides([
[0, '/**'],
[1, ' * Comment'],
[1, ' */'],
[0, 'class A {'],
[1, ' void foo() {'],
[1, ' }'],
[0, '}'],
]);
});
test('getLineIndentGuide Whitespace', () => {
assertIndentGuides([
[0, 'class A {'],
[1, ''],
[1, ' void foo() {'],
[1, ' '],
[1, ' return 1;'],
[1, ' }'],
[1, ' '],
[0, '}'],
]);
});
test('getLineIndentGuide Tabs', () => {
assertIndentGuides([
[0, 'class A {'],
[1, '\t\t'],
[1, '\tvoid foo() {'],
[2, '\t \t//hello'],
[2, '\t return 2;'],
[1, ' \t}'],
[1, ' '],
[0, '}'],
]);
});
test('getLineIndentGuide checker.ts', () => {
assertIndentGuides([
/* 1*/[ 0, '/// <reference path="binder.ts"/>'],
/* 2*/[ 0, ''],
/* 3*/[ 0, '/* @internal */'],
/* 4*/[ 0, 'namespace ts {'],
/* 5*/[ 1, ' let nextSymbolId = 1;'],
/* 6*/[ 1, ' let nextNodeId = 1;'],
/* 7*/[ 1, ' let nextMergeId = 1;'],
/* 8*/[ 1, ' let nextFlowId = 1;'],
/* 9*/[ 1, ''],
/*10*/[ 1, ' export function getNodeId(node: Node): number {'],
/*11*/[ 2, ' if (!node.id) {'],
/*12*/[ 3, ' node.id = nextNodeId;'],
/*13*/[ 3, ' nextNodeId++;'],
/*14*/[ 2, ' }'],
/*15*/[ 2, ' return node.id;'],
/*16*/[ 1, ' }'],
/*17*/[ 0, '}'],
]);
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册