[folding] Deleting folded code will fold the code after it. Fixes #22824
This commit is contained in:
parent
c9a4b65b7f
commit
796d7fef4f
2 changed files with 52 additions and 7 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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*/ '/**',
|
||||
|
|
Loading…
Reference in a new issue