diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index 0274cd58..a86c27ce 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -696,7 +696,8 @@ function Folding() { this.$foldMode = foldMode; - this.removeListener('change', this.$updateFoldWidgets); + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); this._emit("changeAnnotation"); if (!foldMode || this.$foldStyle == "manual") { @@ -709,8 +710,9 @@ function Folding() { this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); this.on('change', this.$updateFoldWidgets); - + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); }; this.getParentFoldRangeData = function (row, ignoreCurrent) { @@ -843,7 +845,13 @@ function Folding() { this.foldWidgets.splice.apply(this.foldWidgets, args); } }; - + this.tokenizerUpdateFoldWidgets = function(e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); + } + } } exports.Folding = Folding; diff --git a/lib/ace/mode/folding/html_test.js b/lib/ace/mode/folding/html_test.js index 2698d936..3471ee57 100644 --- a/lib/ace/mode/folding/html_test.js +++ b/lib/ace/mode/folding/html_test.js @@ -153,6 +153,30 @@ module.exports = { assert.range(session.getFoldWidgetRange(0), 0, 5, 5, 0); assert.range(session.getFoldWidgetRange(5), 0, 5, 5, 0); + }, + + "test: fold multiple nested optional elements": function() { + var session = new EditSession([ + '
', + '
juhu', + '
', + 'kinners', + '