mirror of
https://github.com/atom/atom.git
synced 2026-01-24 22:38:20 -05:00
Minimize allocations
This commit is contained in:
@@ -8,7 +8,6 @@ class LineNumbersTileComponent
|
||||
|
||||
constructor: ({@id}) ->
|
||||
@lineNumberNodesById = {}
|
||||
@lineNumberIdsByScreenRow = {}
|
||||
@domNode = document.createElement("div")
|
||||
@domNode.style.position = "absolute"
|
||||
@domNode.style.display = "block"
|
||||
@@ -63,7 +62,6 @@ class LineNumbersTileComponent
|
||||
unless @newTileState.lineNumbers.hasOwnProperty(id)
|
||||
@lineNumberNodesById[id].remove()
|
||||
delete @lineNumberNodesById[id]
|
||||
delete @lineNumberIdsByScreenRow[lineNumberState.screenRow]
|
||||
delete @oldTileState.lineNumbers[id]
|
||||
|
||||
for id, lineNumberState of @newTileState.lineNumbers
|
||||
@@ -74,30 +72,24 @@ class LineNumbersTileComponent
|
||||
newLineNumbersHTML ?= ""
|
||||
newLineNumberIds.push(id)
|
||||
newLineNumbersHTML += @buildLineNumberHTML(lineNumberState)
|
||||
@lineNumberIdsByScreenRow[lineNumberState.screenRow] = id
|
||||
@oldTileState.lineNumbers[id] = _.clone(lineNumberState)
|
||||
|
||||
return unless newLineNumberIds?
|
||||
|
||||
WrapperDiv.innerHTML = newLineNumbersHTML
|
||||
newLineNumberNodes = _.toArray(WrapperDiv.children)
|
||||
@insertNodes(newLineNumberNodes)
|
||||
|
||||
insertNodes: (lineNumberNodes) ->
|
||||
lineNumberNodes = _.sortBy(lineNumberNodes, @screenRowForNode)
|
||||
while newNode = lineNumberNodes.shift()
|
||||
id = @lineNumberIdsByScreenRow[newNode.dataset.screenRow]
|
||||
|
||||
domNodes = _.toArray(@domNode.children)
|
||||
while nextNode = domNodes.shift()
|
||||
break if @screenRowForNode(newNode) < @screenRowForNode(nextNode)
|
||||
|
||||
if nextNode?
|
||||
@domNode.insertBefore(newNode, nextNode)
|
||||
for id, i in newLineNumberIds
|
||||
lineNumberNode = newLineNumberNodes[i]
|
||||
@lineNumberNodesById[id] = lineNumberNode
|
||||
if nextNode = @findNodeNextTo(lineNumberNode)
|
||||
@domNode.insertBefore(lineNumberNode, nextNode)
|
||||
else
|
||||
@domNode.appendChild(newNode)
|
||||
@domNode.appendChild(lineNumberNode)
|
||||
|
||||
@lineNumberNodesById[id] = newNode
|
||||
findNodeNextTo: (node) ->
|
||||
for nextNode in @domNode.children
|
||||
return nextNode if @screenRowForNode(node) < @screenRowForNode(nextNode)
|
||||
return
|
||||
|
||||
screenRowForNode: (node) -> parseInt(node.dataset.screenRow)
|
||||
|
||||
@@ -106,23 +106,18 @@ class LinesTileComponent
|
||||
|
||||
WrapperDiv.innerHTML = newLinesHTML
|
||||
newLineNodes = _.toArray(WrapperDiv.children)
|
||||
@insertLineNodes(newLineNodes)
|
||||
|
||||
insertLineNodes: (lineNodes) ->
|
||||
lineNodes = _.sortBy(lineNodes, @screenRowForNode)
|
||||
while newNode = lineNodes.shift()
|
||||
id = @lineIdsByScreenRow[newNode.dataset.screenRow]
|
||||
|
||||
domNodes = _.rest(@domNode.children) # skips highlights node
|
||||
while nextNode = domNodes.shift()
|
||||
break if @screenRowForNode(newNode) < @screenRowForNode(nextNode)
|
||||
|
||||
if nextNode?
|
||||
@domNode.insertBefore(newNode, nextNode)
|
||||
for id, i in newLineIds
|
||||
lineNode = newLineNodes[i]
|
||||
@lineNodesByLineId[id] = lineNode
|
||||
if nextNode = @findNodeNextTo(lineNode)
|
||||
@domNode.insertBefore(lineNode, nextNode)
|
||||
else
|
||||
@domNode.appendChild(newNode)
|
||||
@domNode.appendChild(lineNode)
|
||||
|
||||
@lineNodesByLineId[id] = newNode
|
||||
findNodeNextTo: (node) ->
|
||||
for nextNode, index in @domNode.children
|
||||
continue if index is 0 # skips highlights node
|
||||
return nextNode if @screenRowForNode(node) < @screenRowForNode(nextNode)
|
||||
return
|
||||
|
||||
screenRowForNode: (node) -> parseInt(node.dataset.screenRow)
|
||||
|
||||
Reference in New Issue
Block a user