Skip to content

Commit 06c034b

Browse files
committed
Use first lines with content to do special cases
1 parent 2bee07a commit 06c034b

2 files changed

Lines changed: 60 additions & 56 deletions

File tree

src/vs/editor/common/model/textModel.ts

Lines changed: 49 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2640,14 +2640,16 @@ export class TextModel extends Disposable implements model.ITextModel {
26402640
let goDown = true;
26412641
let indent = 0;
26422642

2643+
let initialIndent = 0;
2644+
26432645
for (let distance = 0; goUp || goDown; distance++) {
26442646
const upLineNumber = lineNumber - distance;
26452647
const downLineNumber = lineNumber + distance;
26462648

2647-
if (distance !== 0 && (upLineNumber < 1 || upLineNumber < minLineNumber)) {
2649+
if (distance > 1 && (upLineNumber < 1 || upLineNumber < minLineNumber)) {
26482650
goUp = false;
26492651
}
2650-
if (distance !== 0 && (downLineNumber > lineCount || downLineNumber > maxLineNumber)) {
2652+
if (distance > 1 && (downLineNumber > lineCount || downLineNumber > maxLineNumber)) {
26512653
goDown = false;
26522654
}
26532655
if (distance > 50000) {
@@ -2656,10 +2658,9 @@ export class TextModel extends Disposable implements model.ITextModel {
26562658
goDown = false;
26572659
}
26582660

2661+
let upLineIndentLevel: number = -1;
26592662
if (goUp) {
26602663
// compute indent level going up
2661-
let upLineIndentLevel: number;
2662-
26632664
const currentIndent = this._computeIndentLevel(upLineNumber - 1);
26642665
if (currentIndent >= 0) {
26652666
// This line has content (besides whitespace)
@@ -2671,51 +2672,11 @@ export class TextModel extends Disposable implements model.ITextModel {
26712672
up_resolveIndents(upLineNumber);
26722673
upLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, up_aboveContentLineIndent, up_belowContentLineIndent);
26732674
}
2674-
2675-
if (distance === 0) {
2676-
// This is the initial line number
2677-
if (currentIndent >= 0 && this._computeIndentLevel(upLineNumber) > currentIndent) {
2678-
// This is the beginning of a scope, we have special handling here, since we want the
2679-
// child scope indent to be active, not the parent scope
2680-
goUp = false;
2681-
startLineNumber = upLineNumber + 1;
2682-
endLineNumber = maxLineNumber;
2683-
indent = upLineIndentLevel + 1;
2684-
} else if (currentIndent >= 0 && this._computeIndentLevel(upLineNumber - 2) > currentIndent) {
2685-
// This is the end of a scope. Like above, but we walk backwards to find the parent scope start
2686-
endLineNumber = upLineNumber - 1;
2687-
startLineNumber = minLineNumber;
2688-
for (let offsetUp = endLineNumber; offsetUp >= minLineNumber; offsetUp--) {
2689-
if (this._computeIndentLevel(offsetUp - 1) === this._computeIndentLevel(upLineNumber - 1)) {
2690-
startLineNumber = offsetUp + 1;
2691-
break;
2692-
}
2693-
}
2694-
return { startLineNumber, endLineNumber, indent: upLineIndentLevel + 1 };
2695-
} else {
2696-
startLineNumber = upLineNumber;
2697-
endLineNumber = downLineNumber;
2698-
indent = upLineIndentLevel;
2699-
}
2700-
2701-
if (indent === 0) {
2702-
// No need to continue
2703-
return { startLineNumber, endLineNumber, indent };
2704-
}
2705-
continue;
2706-
}
2707-
2708-
if (upLineIndentLevel >= indent) {
2709-
startLineNumber = upLineNumber;
2710-
} else {
2711-
goUp = false;
2712-
}
27132675
}
27142676

2677+
let downLineIndentLevel = -1;
27152678
if (goDown) {
27162679
// compute indent level going down
2717-
let downLineIndentLevel: number;
2718-
27192680
const currentIndent = this._computeIndentLevel(downLineNumber - 1);
27202681
if (currentIndent >= 0) {
27212682
// This line has content (besides whitespace)
@@ -2727,7 +2688,50 @@ export class TextModel extends Disposable implements model.ITextModel {
27272688
down_resolveIndents(downLineNumber);
27282689
downLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, down_aboveContentLineIndent, down_belowContentLineIndent);
27292690
}
2691+
}
2692+
2693+
if (distance === 0) {
2694+
initialIndent = upLineIndentLevel;
2695+
continue;
2696+
}
2697+
2698+
if (distance === 1) {
2699+
if (downLineNumber <= lineCount && downLineIndentLevel >= 0 && initialIndent + 1 === downLineIndentLevel) {
2700+
// This is the beginning of a scope, we have special handling here, since we want the
2701+
// child scope indent to be active, not the parent scope
2702+
goUp = false;
2703+
startLineNumber = downLineNumber;
2704+
endLineNumber = downLineNumber;
2705+
indent = downLineIndentLevel;
2706+
continue;
2707+
}
27302708

2709+
if (upLineNumber >= 1 && upLineIndentLevel >= 0 && upLineIndentLevel - 1 === initialIndent) {
2710+
// This is the end of a scope, just like above
2711+
goDown = false;
2712+
startLineNumber = upLineNumber;
2713+
endLineNumber = upLineNumber;
2714+
indent = upLineIndentLevel;
2715+
continue;
2716+
}
2717+
2718+
startLineNumber = lineNumber;
2719+
endLineNumber = lineNumber;
2720+
indent = initialIndent;
2721+
if (indent === 0) {
2722+
// No need to continue
2723+
return { startLineNumber, endLineNumber, indent };
2724+
}
2725+
}
2726+
2727+
if (goUp) {
2728+
if (upLineIndentLevel >= indent) {
2729+
startLineNumber = upLineNumber;
2730+
} else {
2731+
goUp = false;
2732+
}
2733+
}
2734+
if (goDown) {
27312735
if (downLineIndentLevel >= indent) {
27322736
endLineNumber = downLineNumber;
27332737
} else {

src/vs/editor/test/common/model/textModelWithTokens.test.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ suite('TextModel.getLineIndentGuide', () => {
615615
[1, 3, 4, 2, ' A'],
616616
[2, 4, 4, 3, ' A'],
617617
[3, 4, 4, 3, ' A'],
618-
[0, 2, 4, 1, 'A'], // TODO => too big of a difference with the line above?
618+
[0, 5, 5, 0, 'A'],
619619
], 2);
620620
});
621621

@@ -659,27 +659,27 @@ suite('TextModel.getLineIndentGuide', () => {
659659

660660
test('getLineIndentGuide Whitespace', () => {
661661
assertIndentGuides([
662-
[0, 1, 1, 0, 'class A {'], // TODO => the next one is not working here
662+
[0, 2, 7, 1, 'class A {'],
663663
[1, 2, 7, 1, ''],
664-
[1, 2, 7, 1, ' void foo() {'], // TODO => also not working here
665-
[2, 4, 5, 2, ' '],
666-
[3, 5, 5, 3, ' return 1;'],
664+
[1, 4, 5, 2, ' void foo() {'],
665+
[2, 4, 5, 2, ' '],
666+
[2, 4, 5, 2, ' return 1;'],
667667
[1, 4, 5, 2, ' }'],
668668
[1, 2, 7, 1, ' '],
669-
[0, 8, 8, 0, '}']
669+
[0, 2, 7, 1, '}']
670670
], 2);
671671
});
672672

673673
test('getLineIndentGuide Tabs', () => {
674674
assertIndentGuides([
675-
[0, 1, 1, 0, 'class A {'], // TODO => not working here
675+
[0, 2, 7, 1, 'class A {'],
676676
[1, 2, 7, 1, '\t\t'],
677677
[1, 4, 5, 2, '\tvoid foo() {'],
678678
[2, 4, 5, 2, '\t \t//hello'],
679679
[2, 4, 5, 2, '\t return 2;'],
680680
[1, 4, 5, 2, ' \t}'],
681681
[1, 2, 7, 1, ' '],
682-
[0, 8, 8, 0, '}']
682+
[0, 2, 7, 1, '}']
683683
], 4);
684684
});
685685

@@ -721,7 +721,7 @@ suite('TextModel.getLineIndentGuide', () => {
721721
[2, 3, 5, 2, ' - bla'],
722722
[2, 5, 5, 3, ' - length:'],
723723
[3, 5, 5, 3, ' max: 255'],
724-
[0, 2, 5, 1, 'getters:']
724+
[0, 6, 6, 0, 'getters:']
725725
], 4);
726726
});
727727

@@ -733,7 +733,7 @@ suite('TextModel.getLineIndentGuide', () => {
733733
[3, 4, 4, 3, '\t\t\treturn 1;'],
734734
[2, 6, 6, 3, '\t\tcase 2:'],
735735
[3, 6, 6, 3, '\t\t\treturn 2;'],
736-
[1, 3, 6, 2, '\t}'],
736+
[1, 2, 7, 1, '\t}'],
737737
[0, 2, 7, 1, '}']
738738
], 4);
739739
});
@@ -742,7 +742,7 @@ suite('TextModel.getLineIndentGuide', () => {
742742
assertIndentGuides([
743743
[2, 2, 2, 3, '\t\t.bla'],
744744
[3, 2, 2, 3, '\t\t\tlabel(for)'],
745-
[0, 1, 2, 1, 'include script']
745+
[0, 3, 3, 0, 'include script']
746746
], 4);
747747
});
748748

0 commit comments

Comments
 (0)