From bf91d10713088d292afc71141e9c21ab645c1a55 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 1 Nov 2017 16:26:18 -0700 Subject: [PATCH] Fix error when accessing legacy event.oldText on file reload --- spec/text-buffer-io-spec.js | 39 +++++++++++++++++++++++++++++-------- src/text-buffer.coffee | 10 ++++------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/spec/text-buffer-io-spec.js b/spec/text-buffer-io-spec.js index a41a7f4381..ad118d4fe8 100644 --- a/spec/text-buffer-io-spec.js +++ b/spec/text-buffer-io-spec.js @@ -160,7 +160,7 @@ describe('TextBuffer IO', () => { }) it('notifies decoration layers and display layers of the change', (done) => { - fs.writeFileSync(filePath, 'abcdefghijk', 'utf8') + fs.writeFileSync(filePath, 'abcdefGHIJK', 'utf8') const events = [] @@ -168,13 +168,29 @@ describe('TextBuffer IO', () => { displayLayer.onDidChange((event) => events.push(['display-layer', event])) buffer.registerTextDecorationLayer({ - bufferDidChange ({oldRange, newRange}) { events.push(['decoration-layer', {oldRange, newRange}]) } + bufferDidChange ({oldRange, newRange, oldText, newText}) { + events.push(['decoration-layer', {oldRange, newRange, oldText, newText}]) + } }) buffer.reload().then(() => { expect(events).toEqual([ - ['decoration-layer', {oldRange: Range(Point(0, 7), Point(0, 7)), newRange: Range(Point(0, 7), Point(0, 11))}], - ['display-layer', [{oldRange: Range(Point(0, 0), Point(1, 0)), newRange: Range(Point(0, 0), Point(1, 0))}]] + [ + 'decoration-layer', + { + oldRange: Range(Point(0, 6), Point(0, 7)), + newRange: Range(Point(0, 6), Point(0, 11)), + oldText: 'g', + newText: 'GHIJK' + } + ], + [ + 'display-layer', + [{ + oldRange: Range(Point(0, 0), Point(1, 0)), + newRange: Range(Point(0, 0), Point(1, 0)) + }] + ] ]) done() }) @@ -214,11 +230,18 @@ describe('TextBuffer IO', () => { fs.writeFileSync(filePath, 'abcdXefg', 'utf8') { - const subscription = buffer.onDidChange(({changes}) => { + const subscription = buffer.onDidChange((event) => { subscription.dispose() - expect(changes.length).toBe(1) - expect(changes[0].oldText).toBe('') - expect(changes[0].newText).toBe('X') + + // Legacy properties + expect(event.oldRange).toEqual(Range(Point(0, 4), Point(0, 4))) + expect(event.newRange).toEqual(Range(Point(0, 4), Point(0, 5))) + expect(event.oldText).toBe('') + expect(event.newText).toBe('X') + + expect(event.changes.length).toBe(1) + expect(event.changes[0].oldText).toBe('') + expect(event.changes[0].newText).toBe('X') buffer.setText('') }) } diff --git a/src/text-buffer.coffee b/src/text-buffer.coffee index 3e65ecf000..f02366d1ea 100644 --- a/src/text-buffer.coffee +++ b/src/text-buffer.coffee @@ -22,7 +22,7 @@ class TransactionAbortedError extends Error class ChangeEvent constructor: (buffer, changes) -> - @changes = changes + @changes = Object.freeze(normalizePatchChanges(changes)) start = changes[0].oldStart oldEnd = changes[changes.length - 1].oldEnd @@ -41,8 +41,8 @@ class ChangeEvent for change in changes by -1 oldBuffer.setTextInRange( new Range( - traversal(change.newRange.start, start), - traversal(change.newRange.end, start) + traversal(change.newStart, start), + traversal(change.newEnd, start) ), change.oldText ) @@ -1910,9 +1910,7 @@ class TextBuffer emitDidChangeTextEvent: -> if @transactCallDepth is 0 if @changesSinceLastDidChangeTextEvent.length > 0 - compactedChanges = Object.freeze(normalizePatchChanges( - patchFromChanges(@changesSinceLastDidChangeTextEvent).getChanges() - )) + compactedChanges = patchFromChanges(@changesSinceLastDidChangeTextEvent).getChanges() @changesSinceLastDidChangeTextEvent.length = 0 if compactedChanges.length > 0 @emitter.emit 'did-change-text', new ChangeEvent(this, compactedChanges)