[folding] Deleting folded code will fold the code after it. Fixes #22824

This commit is contained in:
Martin Aeschlimann 2017-11-17 15:53:25 +01:00
parent c9a4b65b7f
commit 796d7fef4f
2 changed files with 52 additions and 7 deletions

View file

@ -95,13 +95,15 @@ export class FoldingModel {
let decRange = this._textModel.getDecorationRange(this._editorDecorationIds[collapsedIndex]);
if (decRange) {
let collapsedStartLineNumber = decRange.startLineNumber;
while (k < newRanges.length) {
let startLineNumber = newRanges.getStartLineNumber(k);
if (collapsedStartLineNumber >= startLineNumber) {
initRange(k, collapsedStartLineNumber === startLineNumber);
k++;
} else {
break;
if (this._textModel.getLineMaxColumn(collapsedStartLineNumber) === decRange.startColumn) { // test that the decoration is still at the end otherwise it got deleted
while (k < newRanges.length) {
let startLineNumber = newRanges.getStartLineNumber(k);
if (collapsedStartLineNumber >= startLineNumber) {
initRange(k, collapsedStartLineNumber === startLineNumber);
k++;
} else {
break;
}
}
}
}

View file

@ -12,6 +12,7 @@ import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDeco
import { TrackedRangeStickiness, IModelDeltaDecoration, IModel, IModelDecorationsChangeAccessor } from 'vs/editor/common/editorCommon';
import { EditOperation } from 'vs/editor/common/core/editOperation';
import { Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';
interface ExpectedRegion {
@ -201,6 +202,48 @@ suite('Folding Model', () => {
}
});
test('delete', () => {
let lines = [
/* 1*/ 'function foo() {',
/* 2*/ ' switch (x) {',
/* 3*/ ' case 1:',
/* 4*/ ' //hello1',
/* 5*/ ' break;',
/* 6*/ ' case 2:',
/* 7*/ ' //hello2',
/* 8*/ ' break;',
/* 9*/ ' case 3:',
/* 10*/ ' //hello3',
/* 11*/ ' break;',
/* 12*/ ' }',
/* 13*/ '}'];
let textModel = Model.createFromString(lines.join('\n'));
try {
let foldingModel = new FoldingModel(textModel, new TestDecorationProvider(textModel));
let ranges = computeRanges(textModel, false, null);
foldingModel.update(ranges);
let r1 = r(1, 12, false);
let r2 = r(2, 11, false);
let r3 = r(3, 5, false);
let r4 = r(6, 8, false);
let r5 = r(9, 11, false);
assertRanges(foldingModel, [r1, r2, r3, r4, r5]);
foldingModel.toggleCollapseState([foldingModel.getRegionAtLine(6)]);
textModel.applyEdits([EditOperation.delete(new Range(6, 11, 9, 0))]);
foldingModel.update(computeRanges(textModel, false, null));
assertRanges(foldingModel, [r(1, 9, false), r(2, 8, false), r(3, 5, false), r(6, 8, false)]);
} finally {
textModel.dispose();
}
});
test('getRegionsInside', () => {
let lines = [
/* 1*/ '/**',