提交 27e7423a 编写于 作者: M Martin Aeschlimann

[folding] breaks when a particular sequence of text is entered. Fixes #35981

上级 1fb36186
...@@ -61,41 +61,47 @@ export function computeRanges(model: ITextModel, offSide: boolean, markers?: Fol ...@@ -61,41 +61,47 @@ export function computeRanges(model: ITextModel, offSide: boolean, markers?: Fol
// folding pattern match // folding pattern match
if (m[1]) { // start pattern match if (m[1]) { // start pattern match
// discard all regions until the folding pattern // discard all regions until the folding pattern
while (previous.indent >= 0 && !previous.marker) { let i = previousRegions.length - 1;
previousRegions.pop(); while (i > 0 && !previousRegions[i].marker) {
previous = previousRegions[previousRegions.length - 1]; i--;
} }
if (previous.marker) { if (i > 0) {
previousRegions.length = i + 1;
previous = previousRegions[i];
// new folding range from pattern, includes the end line // new folding range from pattern, includes the end line
result.push(new IndentRange(line, previous.line, indent, true)); result.push(new IndentRange(line, previous.line, indent, true));
previous.marker = false; previous.marker = false;
previous.indent = indent; previous.indent = indent;
previous.line = line; previous.line = line;
continue;
} else {
// no end marker found, treat line as a regular line
} }
} else { // end pattern match } else { // end pattern match
previousRegions.push({ indent: -2, line, marker: true }); previousRegions.push({ indent: -2, line, marker: true });
continue;
} }
} else { }
if (previous.indent > indent) { if (previous.indent > indent) {
// discard all regions with larger indent // discard all regions with larger indent
do { do {
previousRegions.pop(); previousRegions.pop();
previous = previousRegions[previousRegions.length - 1]; previous = previousRegions[previousRegions.length - 1];
} while (previous.indent > indent); } while (previous.indent > indent);
// new folding range // new folding range
let endLineNumber = previous.line - 1; let endLineNumber = previous.line - 1;
if (endLineNumber - line >= minimumRangeSize) { if (endLineNumber - line >= minimumRangeSize) {
result.push(new IndentRange(line, endLineNumber, indent)); result.push(new IndentRange(line, endLineNumber, indent));
}
}
if (previous.indent === indent) {
previous.line = line;
} else { // previous.indent < indent
// new region with a bigger indent
previousRegions.push({ indent, line, marker: false });
} }
} }
if (previous.indent === indent) {
previous.line = line;
} else { // previous.indent < indent
// new region with a bigger indent
previousRegions.push({ indent, line, marker: false });
}
} }
return result.reverse(); return result.reverse();
......
...@@ -29,125 +29,125 @@ function r(startLineNumber: number, endLineNumber: number, indent: number, marke ...@@ -29,125 +29,125 @@ function r(startLineNumber: number, endLineNumber: number, indent: number, marke
return { startLineNumber, endLineNumber, indent, marker }; return { startLineNumber, endLineNumber, indent, marker };
} }
// suite('Indentation Folding', () => { suite('Indentation Folding', () => {
// test('Fold one level', () => { test('Fold one level', () => {
// let range = [ let range = [
// 'A', 'A',
// ' A', ' A',
// ' A', ' A',
// ' A' ' A'
// ]; ];
// assertRanges(range, [r(1, 4, 0)], true); assertRanges(range, [r(1, 4, 0)], true);
// assertRanges(range, [r(1, 4, 0)], false); assertRanges(range, [r(1, 4, 0)], false);
// }); });
// test('Fold two levels', () => { test('Fold two levels', () => {
// let range = [ let range = [
// 'A', 'A',
// ' A', ' A',
// ' A', ' A',
// ' A', ' A',
// ' A' ' A'
// ]; ];
// assertRanges(range, [r(1, 5, 0), r(3, 5, 2)], true); assertRanges(range, [r(1, 5, 0), r(3, 5, 2)], true);
// assertRanges(range, [r(1, 5, 0), r(3, 5, 2)], false); assertRanges(range, [r(1, 5, 0), r(3, 5, 2)], false);
// }); });
// test('Fold three levels', () => { test('Fold three levels', () => {
// let range = [ let range = [
// 'A', 'A',
// ' A', ' A',
// ' A', ' A',
// ' A', ' A',
// 'A' 'A'
// ]; ];
// assertRanges(range, [r(1, 4, 0), r(2, 4, 2), r(3, 4, 4)], true); assertRanges(range, [r(1, 4, 0), r(2, 4, 2), r(3, 4, 4)], true);
// assertRanges(range, [r(1, 4, 0), r(2, 4, 2), r(3, 4, 4)], false); assertRanges(range, [r(1, 4, 0), r(2, 4, 2), r(3, 4, 4)], false);
// }); });
// test('Fold decreasing indent', () => { test('Fold decreasing indent', () => {
// let range = [ let range = [
// ' A', ' A',
// ' A', ' A',
// 'A' 'A'
// ]; ];
// assertRanges(range, [], true); assertRanges(range, [], true);
// assertRanges(range, [], false); assertRanges(range, [], false);
// }); });
// test('Fold Java', () => { test('Fold Java', () => {
// assertRanges([ assertRanges([
// /* 1*/ 'class A {', /* 1*/ 'class A {',
// /* 2*/ ' void foo() {', /* 2*/ ' void foo() {',
// /* 3*/ ' console.log();', /* 3*/ ' console.log();',
// /* 4*/ ' console.log();', /* 4*/ ' console.log();',
// /* 5*/ ' }', /* 5*/ ' }',
// /* 6*/ '', /* 6*/ '',
// /* 7*/ ' void bar() {', /* 7*/ ' void bar() {',
// /* 8*/ ' console.log();', /* 8*/ ' console.log();',
// /* 9*/ ' }', /* 9*/ ' }',
// /*10*/ '}', /*10*/ '}',
// /*11*/ 'interface B {', /*11*/ 'interface B {',
// /*12*/ ' void bar();', /*12*/ ' void bar();',
// /*13*/ '}', /*13*/ '}',
// ], [r(1, 9, 0), r(2, 4, 2), r(7, 8, 2), r(11, 12, 0)], false); ], [r(1, 9, 0), r(2, 4, 2), r(7, 8, 2), r(11, 12, 0)], false);
// }); });
// test('Fold Javadoc', () => { test('Fold Javadoc', () => {
// assertRanges([ assertRanges([
// /* 1*/ '/**', /* 1*/ '/**',
// /* 2*/ ' * Comment', /* 2*/ ' * Comment',
// /* 3*/ ' */', /* 3*/ ' */',
// /* 4*/ 'class A {', /* 4*/ 'class A {',
// /* 5*/ ' void foo() {', /* 5*/ ' void foo() {',
// /* 6*/ ' }', /* 6*/ ' }',
// /* 7*/ '}', /* 7*/ '}',
// ], [r(1, 3, 0), r(4, 6, 0)], false); ], [r(1, 3, 0), r(4, 6, 0)], false);
// }); });
// test('Fold Whitespace Java', () => { test('Fold Whitespace Java', () => {
// assertRanges([ assertRanges([
// /* 1*/ 'class A {', /* 1*/ 'class A {',
// /* 2*/ '', /* 2*/ '',
// /* 3*/ ' void foo() {', /* 3*/ ' void foo() {',
// /* 4*/ ' ', /* 4*/ ' ',
// /* 5*/ ' return 0;', /* 5*/ ' return 0;',
// /* 6*/ ' }', /* 6*/ ' }',
// /* 7*/ ' ', /* 7*/ ' ',
// /* 8*/ '}', /* 8*/ '}',
// ], [r(1, 7, 0), r(3, 5, 2)], false); ], [r(1, 7, 0), r(3, 5, 2)], false);
// }); });
// test('Fold Whitespace Python', () => { test('Fold Whitespace Python', () => {
// assertRanges([ assertRanges([
// /* 1*/ 'def a:', /* 1*/ 'def a:',
// /* 2*/ ' pass', /* 2*/ ' pass',
// /* 3*/ ' ', /* 3*/ ' ',
// /* 4*/ ' def b:', /* 4*/ ' def b:',
// /* 5*/ ' pass', /* 5*/ ' pass',
// /* 6*/ ' ', /* 6*/ ' ',
// /* 7*/ ' ', /* 7*/ ' ',
// /* 8*/ 'def c: # since there was a deintent here' /* 8*/ 'def c: # since there was a deintent here'
// ], [r(1, 5, 0), r(4, 5, 2)], true); ], [r(1, 5, 0), r(4, 5, 2)], true);
// }); });
// test('Fold Tabs', () => { test('Fold Tabs', () => {
// assertRanges([ assertRanges([
// /* 1*/ 'class A {', /* 1*/ 'class A {',
// /* 2*/ '\t\t', /* 2*/ '\t\t',
// /* 3*/ '\tvoid foo() {', /* 3*/ '\tvoid foo() {',
// /* 4*/ '\t \t//hello', /* 4*/ '\t \t//hello',
// /* 5*/ '\t return 0;', /* 5*/ '\t return 0;',
// /* 6*/ ' \t}', /* 6*/ ' \t}',
// /* 7*/ ' ', /* 7*/ ' ',
// /* 8*/ '}', /* 8*/ '}',
// ], [r(1, 7, 0), r(3, 5, 4)], false); ], [r(1, 7, 0), r(3, 5, 4)], false);
// }); });
// }); });
let markers: FoldingMarkers = { let markers: FoldingMarkers = {
start: /^\s*#region/, start: /^\s*#region\b/,
end: /^\s*#endregion/ end: /^\s*#endregion\b/
}; };
suite('Folding with regions', () => { suite('Folding with regions', () => {
...@@ -216,9 +216,9 @@ suite('Folding with regions', () => { ...@@ -216,9 +216,9 @@ suite('Folding with regions', () => {
/* 2*/ '#region', /* 2*/ '#region',
/* 3*/ ' // comment', /* 3*/ ' // comment',
/* 4*/ '}', /* 4*/ '}',
], [], false, markers); ], [r(2, 3, 0)], false, markers);
}); });
test('Incomplete Regions', () => { test('Incomplete Regions 2', () => {
assertRanges([ assertRanges([
/* 1*/ '', /* 1*/ '',
/* 2*/ '#region', /* 2*/ '#region',
...@@ -291,4 +291,29 @@ suite('Folding with regions', () => { ...@@ -291,4 +291,29 @@ suite('Folding with regions', () => {
/* 8*/ '', /* 8*/ '',
], [r(1, 7, 0, true), r(3, 5, 0, true)], true, markers); ], [r(1, 7, 0, true), r(3, 5, 0, true)], true, markers);
}); });
test('Issue 35981', () => {
assertRanges([
/* 1*/ 'function thisFoldsToEndOfPage() {',
/* 2*/ ' const variable = []',
/* 3*/ ' // #region',
/* 4*/ ' .reduce((a, b) => a,[]);',
/* 5*/ '}',
/* 6*/ '',
/* 7*/ 'function thisFoldsProperly() {',
/* 8*/ ' const foo = "bar"',
/* 9*/ '}',
], [r(1, 4, 0), r(2, 4, 2), r(7, 8, 0)], false, markers);
});
test('Misspelled Markers', () => {
assertRanges([
/* 1*/ '#Region',
/* 2*/ '#endregion',
/* 3*/ '#regionsandmore',
/* 4*/ '#endregion',
/* 5*/ '#region',
/* 6*/ '#end region',
/* 7*/ '#region',
/* 8*/ '#endregionff',
], [], true, markers);
});
}); });
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册