From 2295b67e9b2c53a892d62bfe85886f69268e61b0 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 28 Sep 2017 11:39:54 +0200 Subject: [PATCH] Regions are not folding correctly in off-side languages. Fixes #35091 --- src/vs/editor/common/model/indentRanges.ts | 23 ++++++++----------- .../test/common/model/indentRanges.test.ts | 21 +++++++++++++++++ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/common/model/indentRanges.ts b/src/vs/editor/common/model/indentRanges.ts index 99396d38f0f..3a7773f592e 100644 --- a/src/vs/editor/common/model/indentRanges.ts +++ b/src/vs/editor/common/model/indentRanges.ts @@ -32,7 +32,7 @@ export class IndentRange { } } -interface PreviousRegion { indent: number; line: number; marker: RegExp; }; +interface PreviousRegion { indent: number; line: number; marker: boolean; }; export function computeRanges(model: ITextModel, offSide: boolean, markers?: FoldingMarkers, minimumRangeSize: number = 1): IndentRange[] { @@ -44,13 +44,13 @@ export function computeRanges(model: ITextModel, offSide: boolean, markers?: Fol } let previousRegions: PreviousRegion[] = []; - previousRegions.push({ indent: -1, line: model.getLineCount() + 1, marker: null }); // sentinel, to make sure there's at least one entry + previousRegions.push({ indent: -1, line: model.getLineCount() + 1, marker: false }); // sentinel, to make sure there's at least one entry for (let line = model.getLineCount(); line > 0; line--) { let indent = model.getIndentLevel(line); let previous = previousRegions[previousRegions.length - 1]; if (indent === -1) { - if (offSide) { + if (offSide && !previous.marker) { // for offSide languages, empty lines are associated to the next block previous.line = line; } @@ -60,23 +60,20 @@ export function computeRanges(model: ITextModel, offSide: boolean, markers?: Fol if (pattern && (m = model.getLineContent(line).match(pattern))) { // folding pattern match if (m[1]) { // start pattern match - if (previous.indent >= 0 && !previous.marker) { - - // discard all regions until the folding pattern - do { - previousRegions.pop(); - previous = previousRegions[previousRegions.length - 1]; - } while (previous.indent >= 0 && !previous.marker); + // discard all regions until the folding pattern + while (previous.indent >= 0 && !previous.marker) { + previousRegions.pop(); + previous = previousRegions[previousRegions.length - 1]; } if (previous.marker) { // new folding range from pattern, includes the end line result.push(new IndentRange(line, previous.line, indent, true)); - previous.marker = null; + previous.marker = false; previous.indent = indent; previous.line = line; } } else { // end pattern match - previousRegions.push({ indent: -2, line, marker: pattern }); + previousRegions.push({ indent: -2, line, marker: true }); } } else { if (previous.indent > indent) { @@ -96,7 +93,7 @@ export function computeRanges(model: ITextModel, offSide: boolean, markers?: Fol previous.line = line; } else { // previous.indent < indent // new region with a bigger indent - previousRegions.push({ indent, line, marker: null }); + previousRegions.push({ indent, line, marker: false }); } } } diff --git a/src/vs/editor/test/common/model/indentRanges.test.ts b/src/vs/editor/test/common/model/indentRanges.test.ts index d7a3e5998d3..8d90c5a2635 100644 --- a/src/vs/editor/test/common/model/indentRanges.test.ts +++ b/src/vs/editor/test/common/model/indentRanges.test.ts @@ -270,4 +270,25 @@ suite('Folding with regions', () => { /* 6*/ ' return;', ], [r(1, 4, 0, true), r(5, 6, 2)], false, markers); }); + test('With off-side', () => { + assertRanges([ + /* 1*/ '#region', + /* 2*/ ' ', + /* 3*/ '', + /* 4*/ '#endregion', + /* 5*/ '', + ], [r(1, 4, 0, true)], true, markers); + }); + test('Nested with off-side', () => { + assertRanges([ + /* 1*/ '#region', + /* 2*/ ' ', + /* 3*/ '#region', + /* 4*/ '', + /* 5*/ '#endregion', + /* 6*/ '', + /* 7*/ '#endregion', + /* 8*/ '', + ], [r(1, 7, 0, true), r(3, 5, 0, true)], true, markers); + }); }); \ No newline at end of file -- GitLab