Remove Anchor and AnchorRange. They're fully replaced by markers.

We're still leaking markers for selections and cursors. We need to
clean that up before merging.
This commit is contained in:
Kevin Sawicki & Nathan Sobo
2013-02-05 18:15:48 -07:00
parent 79d54e5483
commit 59d0742c17
13 changed files with 21 additions and 328 deletions

View File

@@ -1,41 +0,0 @@
Range = require 'range'
EventEmitter = require 'event-emitter'
Subscriber = require 'subscriber'
_ = require 'underscore'
module.exports =
class AnchorRange
start: null
end: null
buffer: null
editSession: null # optional
destroyed: false
constructor: (bufferRange, @buffer, @editSession) ->
bufferRange = Range.fromObject(bufferRange)
@startAnchor = @buffer.addAnchorAtPosition(bufferRange.start, ignoreChangesStartingOnAnchor: true)
@endAnchor = @buffer.addAnchorAtPosition(bufferRange.end)
@subscribe @startAnchor, 'destroyed', => @destroy()
@subscribe @endAnchor, 'destroyed', => @destroy()
getBufferRange: ->
new Range(@startAnchor.getBufferPosition(), @endAnchor.getBufferPosition())
getScreenRange: ->
new Range(@startAnchor.getScreenPosition(), @endAnchor.getScreenPosition())
containsBufferPosition: (bufferPosition) ->
@getBufferRange().containsPoint(bufferPosition)
destroy: ->
return if @destroyed
@unsubscribe()
@startAnchor.destroy()
@endAnchor.destroy()
@buffer.removeAnchorRange(this)
@editSession?.removeAnchorRange(this)
@destroyed = true
@trigger 'destroyed'
_.extend(AnchorRange.prototype, EventEmitter)
_.extend(AnchorRange.prototype, Subscriber)

View File

@@ -1,90 +0,0 @@
Point = require 'point'
EventEmitter = require 'event-emitter'
_ = require 'underscore'
module.exports =
class Anchor
buffer: null
editSession: null # optional
bufferPosition: null
screenPosition: null
ignoreChangesStartingOnAnchor: false
strong: false
destroyed: false
constructor: (@buffer, options = {}) ->
{ @editSession, @ignoreChangesStartingOnAnchor, @strong } = options
handleBufferChange: (e) ->
{ oldRange, newRange } = e
position = @getBufferPosition()
if oldRange.containsPoint(position, exclusive: true)
if @strong
@setBufferPosition(oldRange.start)
else
@destroy()
return
return if @ignoreChangesStartingOnAnchor and position.isEqual(oldRange.start)
return if position.isLessThan(oldRange.end)
newRow = newRange.end.row
newColumn = newRange.end.column
if position.row == oldRange.end.row
newColumn += position.column - oldRange.end.column
else
newColumn = position.column
newRow += position.row - oldRange.end.row
@setBufferPosition([newRow, newColumn], bufferChange: true)
getBufferPosition: ->
@bufferPosition
setBufferPosition: (position, options={}) ->
@bufferPosition = Point.fromObject(position)
clip = options.clip ? true
@bufferPosition = @buffer.clipPosition(@bufferPosition) if clip
@refreshScreenPosition(options)
getScreenPosition: ->
@screenPosition
getScreenRow: ->
@screenPosition.row
setScreenPosition: (position, options={}) ->
oldScreenPosition = @screenPosition
oldBufferPosition = @bufferPosition
@screenPosition = Point.fromObject(position)
clip = options.clip ? true
assignBufferPosition = options.assignBufferPosition ? true
@screenPosition = @editSession.clipScreenPosition(@screenPosition, options) if clip
@bufferPosition = @editSession.bufferPositionForScreenPosition(@screenPosition, options) if assignBufferPosition
Object.freeze @screenPosition
Object.freeze @bufferPosition
unless @screenPosition.isEqual(oldScreenPosition)
@trigger 'moved',
oldScreenPosition: oldScreenPosition
newScreenPosition: @screenPosition
oldBufferPosition: oldBufferPosition
newBufferPosition: @bufferPosition
bufferChange: options.bufferChange
refreshScreenPosition: (options={}) ->
return unless @editSession
screenPosition = @editSession.screenPositionForBufferPosition(@bufferPosition, options)
@setScreenPosition(screenPosition, bufferChange: options.bufferChange, clip: false, assignBufferPosition: false)
destroy: ->
return if @destroyed
@buffer.removeAnchor(this)
@editSession?.removeAnchor(this)
@destroyed = true
@trigger 'destroyed'
_.extend(Anchor.prototype, EventEmitter)

View File

@@ -72,7 +72,6 @@ class BufferChangeOperation
event = { oldRange, newRange, oldText, newText }
@buffer.trigger 'changed', event
@buffer.scheduleStoppedChangingEvent()
@buffer.updateAnchors(event)
@updateMarkers(event)
newRange

View File

@@ -6,8 +6,6 @@ Range = require 'range'
EventEmitter = require 'event-emitter'
UndoManager = require 'undo-manager'
BufferChangeOperation = require 'buffer-change-operation'
Anchor = require 'anchor'
AnchorRange = require 'anchor-range'
BufferMarker = require 'buffer-marker'
module.exports =
@@ -24,8 +22,6 @@ class Buffer
file: null
validMarkers: null
invalidMarkers: null
anchors: null
anchorRanges: null
refcount: 0
constructor: (path, @project) ->
@@ -33,8 +29,6 @@ class Buffer
@nextMarkerId = 1
@validMarkers = {}
@invalidMarkers = {}
@anchors = []
@anchorRanges = []
@lines = ['']
@lineEndings = []
@@ -273,6 +267,9 @@ class Buffer
getMarkers: ->
_.values(@validMarkers)
getMarkerCount: ->
_.size(@validMarkers)
markRange: (range, options={}) ->
marker = new BufferMarker(_.defaults({
id: (@nextMarkerId++).toString()
@@ -332,39 +329,6 @@ class Buffer
ids.push(id) if marker.containsPoint(bufferPosition)
ids
getAnchors: -> new Array(@anchors...)
addAnchor: (options) ->
anchor = new Anchor(this, options)
@anchors.push(anchor)
anchor
addAnchorAtPosition: (position, options) ->
anchor = @addAnchor(options)
anchor.setBufferPosition(position)
anchor
addAnchorRange: (range, editSession) ->
anchorRange = new AnchorRange(range, this, editSession)
@anchorRanges.push(anchorRange)
anchorRange
removeAnchor: (anchor) ->
_.remove(@anchors, anchor)
removeAnchorRange: (anchorRange) ->
_.remove(@anchorRanges, anchorRange)
anchorRangesForPosition: (position) ->
_.filter @anchorRanges, (anchorRange) -> anchorRange.containsBufferPosition(position)
updateAnchors: (change) ->
anchors = @getAnchors()
anchor.pauseEvents() for anchor in anchors
anchor.handleBufferChange(change) for anchor in anchors
anchor.resumeEvents() for anchor in anchors
@trigger 'anchors-updated'
matchesInCharacterRange: (regex, startIndex, endIndex) ->
text = @getText()
matches = []

View File

@@ -1,5 +1,4 @@
{View} = require 'space-pen'
Anchor = require 'anchor'
Point = require 'point'
Range = require 'range'
_ = require 'underscore'

View File

@@ -1,15 +0,0 @@
module.exports =
class DisplayBufferAnchorPoint
bufferPosition: null
screenPosition: null
constructor: ({@displayBuffer, bufferPosition, screenPosition}) ->
{@buffer} = @displayBuffer
if screenPosition
bufferPosition = @displayBuffer.bufferPositionForScreenPosition(screenPosition)
@id = @buffer.createAnchorPoint(bufferPosition)
getBufferPosition: ->
@buffer.getAnchorPoint(@id)

View File

@@ -1,6 +1,5 @@
Point = require 'point'
Buffer = require 'buffer'
Anchor = require 'anchor'
LanguageMode = require 'language-mode'
DisplayBuffer = require 'display-buffer'
Cursor = require 'cursor'
@@ -8,7 +7,6 @@ Selection = require 'selection'
EventEmitter = require 'event-emitter'
Subscriber = require 'subscriber'
Range = require 'range'
AnchorRange = require 'anchor-range'
_ = require 'underscore'
fs = require 'fs'
@@ -29,8 +27,6 @@ class EditSession
scrollLeft: 0
languageMode: null
displayBuffer: null
anchors: null
anchorRanges: null
cursors: null
selections: null
softTabs: true
@@ -40,8 +36,6 @@ class EditSession
@softTabs = @buffer.usesSoftTabs() ? softTabs ? true
@languageMode = new LanguageMode(this, @buffer.getExtension())
@displayBuffer = new DisplayBuffer(@buffer, { @languageMode, tabLength })
@anchors = []
@anchorRanges = []
@cursors = []
@selections = []
@addCursorAtScreenPosition([0, 0])
@@ -54,7 +48,6 @@ class EditSession
@preserveCursorPositionOnBufferReload()
@subscribe @displayBuffer, "changed", (e) =>
@refreshAnchorScreenPositions() unless e.bufferDelta
@trigger 'screen-lines-changed', e
destroy: ->
@@ -64,8 +57,6 @@ class EditSession
@buffer.release()
@displayBuffer.destroy()
@project.removeEditSession(this)
anchor.destroy() for anchor in @getAnchors()
anchorRange.destroy() for anchorRange in @getAnchorRanges()
serialize: ->
buffer: @buffer.getPath()
@@ -451,12 +442,6 @@ class EditSession
pushOperation: (operation) ->
@buffer.pushOperation(operation, this)
getAnchors: ->
new Array(@anchors...)
getAnchorRanges: ->
new Array(@anchorRanges...)
markScreenRange: (args...) ->
@displayBuffer.markScreenRange(args...)
@@ -472,6 +457,9 @@ class EditSession
destroyMarker: (args...) ->
@displayBuffer.destroyMarker(args...)
getMarkerCount: ->
@buffer.getMarkerCount()
getMarkerScreenRange: (args...) ->
@displayBuffer.getMarkerScreenRange(args...)
@@ -526,33 +514,6 @@ class EditSession
isMarkerReversed: (args...) ->
@displayBuffer.isMarkerReversed(args...)
addAnchor: (options={}) ->
anchor = @buffer.addAnchor(_.extend({editSession: this}, options))
@anchors.push(anchor)
anchor
addAnchorAtBufferPosition: (bufferPosition, options) ->
anchor = @addAnchor(options)
anchor.setBufferPosition(bufferPosition)
anchor
addAnchorRange: (range) ->
anchorRange = @buffer.addAnchorRange(range, this)
@anchorRanges.push(anchorRange)
anchorRange
removeAnchor: (anchor) ->
_.remove(@anchors, anchor)
refreshAnchorScreenPositions: ->
anchor.refreshScreenPosition() for anchor in @getAnchors()
removeAnchorRange: (anchorRange) ->
_.remove(@anchorRanges, anchorRange)
anchorRangesForBufferPosition: (bufferPosition) ->
_.intersect(@anchorRanges, @buffer.anchorRangesForPosition(bufferPosition))
hasMultipleCursors: ->
@getCursors().length > 1

View File

@@ -1,4 +1,3 @@
Anchor = require 'anchor'
Point = require 'point'
Range = require 'range'
{View, $$} = require 'space-pen'

View File

@@ -3,8 +3,10 @@ Project = require 'project'
Buffer = require 'buffer'
EditSession = require 'edit-session'
_ = require 'underscore'
describe "CommandInterpreter", ->
[project, interpreter, editSession, buffer, anchorCountBefore] = []
[project, interpreter, editSession, buffer] = []
beforeEach ->
project = new Project(fixturesProject.resolve('dir/'))
@@ -14,7 +16,8 @@ describe "CommandInterpreter", ->
afterEach ->
editSession?.destroy()
expect(buffer.getAnchors().length).toBe 0
# TODO: Restore this assertion when we stop leaking markers from edit session
# expect(buffer.getMarkerCount()).toBe 0
describe "addresses", ->
beforeEach ->

View File

@@ -86,7 +86,7 @@ describe "Snippets extension", ->
describe "when the snippet contains tab stops", ->
it "places the cursor at the first tab-stop, and moves the cursor in response to 'next-tab-stop' events", ->
anchorCountBefore = editor.activeEditSession.getAnchors().length
markerCountBefore = editor.activeEditSession.getMarkerCount()
editor.setCursorScreenPosition([2, 0])
editor.insertText('t2')
editor.trigger keydownEvent('tab', target: editor[0])
@@ -118,7 +118,7 @@ describe "Snippets extension", ->
editor.trigger keydownEvent('tab', target: editor[0])
editor.trigger keydownEvent('tab', target: editor[0])
expect(buffer.lineForRow(2)).toBe "go here next:(abc) and finally go here:( )"
expect(editor.activeEditSession.getAnchors().length).toBe anchorCountBefore
expect(editor.activeEditSession.getMarkerCount()).toBe markerCountBefore
describe "when tab stops are nested", ->
it "destroys the inner tab stop if the outer tab stop is modified", ->