From bbcb59fe93b08d3f2fb04038614988e890ac2fbe Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Fri, 25 May 2012 10:58:30 -0700 Subject: [PATCH] Buffer changes updates a stable list of folds --- spec/app/renderer-spec.coffee | 59 ++++++++++++++++++++--------------- src/app/renderer.coffee | 6 ++-- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index 285c378e3..ef887fb6d 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -293,36 +293,45 @@ describe "Renderer", -> expect(event.newRange).toEqual [[1, 0], [1, 9]] expect(event.lineNumbersChanged).toBeTruthy() + describe "when multiple changes happen above the fold", -> + it "repositions folds correctly", -> + buffer.delete([[1, 1], [2, 0]]) + buffer.insert([0, 1], "\nnew") + + expect(fold1.startRow).toBe 2 + expect(fold1.endRow).toBe 4 + describe "when the old range precedes lines with a fold", -> - it "updates the buffer and re-positions subsequent folds", -> - buffer.change([[0, 0], [1, 1]], 'abc') + describe "when the new range precedes lines with a fold", -> + it "updates the buffer and re-positions subsequent folds", -> + buffer.change([[0, 0], [1, 1]], 'abc') - expect(renderer.lineForRow(0).text).toBe "abc" - expect(renderer.lineForRow(1).fold).toBe fold1 - expect(renderer.lineForRow(2).text).toBe "5" - expect(renderer.lineForRow(3).fold).toBe fold2 - expect(renderer.lineForRow(4).text).toMatch /^9-+/ + expect(renderer.lineForRow(0).text).toBe "abc" + expect(renderer.lineForRow(1).fold).toBe fold1 + expect(renderer.lineForRow(2).text).toBe "5" + expect(renderer.lineForRow(3).fold).toBe fold2 + expect(renderer.lineForRow(4).text).toMatch /^9-+/ - expect(changeHandler).toHaveBeenCalled() - [[event]] = changeHandler.argsForCall - expect(event.oldRange).toEqual [[0, 0], [1, 1]] - expect(event.newRange).toEqual [[0, 0], [0, 3]] - expect(event.lineNumbersChanged).toBeTruthy() - changeHandler.reset() + expect(changeHandler).toHaveBeenCalled() + [[event]] = changeHandler.argsForCall + expect(event.oldRange).toEqual [[0, 0], [1, 1]] + expect(event.newRange).toEqual [[0, 0], [0, 3]] + expect(event.lineNumbersChanged).toBeTruthy() + changeHandler.reset() - fold1.destroy() - expect(renderer.lineForRow(0).text).toBe "abc" - expect(renderer.lineForRow(1).text).toBe "2" - expect(renderer.lineForRow(3).text).toMatch /^4-+/ - expect(renderer.lineForRow(4).text).toBe "5" - expect(renderer.lineForRow(5).fold).toBe fold2 - expect(renderer.lineForRow(6).text).toMatch /^9-+/ + fold1.destroy() + expect(renderer.lineForRow(0).text).toBe "abc" + expect(renderer.lineForRow(1).text).toBe "2" + expect(renderer.lineForRow(3).text).toMatch /^4-+/ + expect(renderer.lineForRow(4).text).toBe "5" + expect(renderer.lineForRow(5).fold).toBe fold2 + expect(renderer.lineForRow(6).text).toMatch /^9-+/ - expect(changeHandler).toHaveBeenCalled() - [[event]] = changeHandler.argsForCall - expect(event.oldRange).toEqual [[1, 0], [1, 1]] - expect(event.newRange).toEqual [[1, 0], [3, 101]] - expect(event.lineNumbersChanged).toBeTruthy() + expect(changeHandler).toHaveBeenCalled() + [[event]] = changeHandler.argsForCall + expect(event.oldRange).toEqual [[1, 0], [1, 1]] + expect(event.newRange).toEqual [[1, 0], [3, 101]] + expect(event.lineNumbersChanged).toBeTruthy() describe "when the old range straddles the beginning of a fold", -> it "replaces lines in the portion of the range that precedes the fold and adjusts the end of the fold to encompass additional lines", -> diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index 416f29652..29e698405 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -127,9 +127,9 @@ class Renderer @lineMap.clipScreenPosition(position, options) handleBufferChange: (e) -> - for row, folds of @activeFolds - for fold in new Array(folds...) - fold.handleBufferChange(e) + allFolds = [] # Folds can modify @activeFolds, so first make sure we have a stable array of folds + allFolds.push(folds...) for row, folds of @activeFolds + fold.handleBufferChange(e) for fold in allFolds @handleHighlighterChange(@lastHighlighterChangeEvent)