diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index b36857c6..1735e6f9 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -272,7 +272,8 @@ function Folding() { var endColumn = fold.end.column; // --- Some checking --- - if (startRow == endRow && endColumn - startColumn < 2) + if (!(startRow < endRow || + startRow == endRow && startColumn < endColumn - 2)) throw "The range has to be at least 2 characters width"; var startFold = this.getFoldAt(startRow, startColumn, 1); @@ -627,19 +628,25 @@ function Folding() { depth = 100000; // JSON.stringify doesn't hanle Infinity var foldWidgets = this.foldWidgets; endRow = endRow || this.getLength(); - for (var row = startRow || 0; row < endRow; row++) { + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { if (foldWidgets[row] == null) foldWidgets[row] = this.getFoldWidget(row); if (foldWidgets[row] != "start") continue; var range = this.getFoldWidgetRange(row); + var rangeEndRow = range.end.row; // sometimes range can be incompatible with existing fold // TODO change addFold to return null istead of throwing - if (range && range.end.row <= endRow) try { + if (range && range.isMultiLine() + && rangeEndRow <= endRow + && range.start.row >= startRow + ) try { var fold = this.addFold("...", range); fold.collapseChildren = depth; - row = range.end.row; + // addFold can change the range + row = rangeEndRow; } catch(e) {} } };