Merge pull request #7813 from atom/ns-display-buffer-invariant-assertion

More consistency checks for DisplayBuffer and TokenizedBuffer
This commit is contained in:
Nathan Sobo
2015-07-09 11:19:31 -05:00
3 changed files with 34 additions and 2 deletions

View File

@@ -57,7 +57,7 @@
"space-pen": "3.8.2",
"stacktrace-parser": "0.1.1",
"temp": "0.8.1",
"text-buffer": "6.3.8",
"text-buffer": "6.3.9",
"theorist": "^1.0.2",
"typescript-simple": "1.0.0",
"underscore-plus": "^1.6.6",

View File

@@ -23,6 +23,7 @@ class DisplayBuffer extends Model
verticalScrollMargin: 2
horizontalScrollMargin: 6
scopedCharacterWidthsChangeCount: 0
changeCount: 0
constructor: ({tabLength, @editorWidthInChars, @tokenizedBuffer, buffer, ignoreInvisibles, @largeFileMode}={}) ->
super
@@ -800,6 +801,11 @@ class DisplayBuffer extends Model
foldCount: @findFoldMarkers().length
lastBufferRow: @buffer.getLastRow()
lastScreenRow: @getLastRow()
bufferRow: row
screenRow: screenRow
displayBufferChangeCount: @changeCount
tokenizedBufferChangeCount: @tokenizedBuffer.changeCount
bufferChangeCount: @buffer.changeCount
maxBufferColumn = screenLine.getMaxBufferColumn()
if screenLine.isSoftWrapped() and column > maxBufferColumn
@@ -898,6 +904,9 @@ class DisplayBuffer extends Model
screenColumn: column
maxScreenRow: @getLastRow()
screenLinesDefined: @screenLines.map (sl) -> sl?
displayBufferChangeCount: @changeCount
tokenizedBufferChangeCount: @tokenizedBuffer.changeCount
bufferChangeCount: @buffer.changeCount
}
throw error
@@ -1179,6 +1188,7 @@ class DisplayBuffer extends Model
@tokenizedBuffer.rootScopeDescriptor
handleTokenizedBufferChange: (tokenizedBufferChange) =>
@changeCount = @tokenizedBuffer.changeCount
{start, end, delta, bufferChange} = tokenizedBufferChange
@updateScreenLines(start, end + 1, delta, refreshMarkers: false)
@setScrollTop(Math.min(@getScrollTop(), @getMaxScrollTop())) if delta < 0
@@ -1194,6 +1204,9 @@ class DisplayBuffer extends Model
screenDelta = screenLines.length - (endScreenRow - startScreenRow)
_.spliceWithArray(@screenLines, startScreenRow, endScreenRow - startScreenRow, screenLines, 10000)
@checkScreenLinesInvariant()
@rowMap.spliceRegions(startBufferRow, endBufferRow - startBufferRow, regions)
@findMaxLineLength(startScreenRow, endScreenRow, screenLines, screenDelta)
@@ -1313,6 +1326,20 @@ class DisplayBuffer extends Model
else
delete @overlayDecorationsById[decoration.id]
checkScreenLinesInvariant: ->
return if @isSoftWrapped()
return if _.size(@foldsByMarkerId) > 0
screenLinesCount = @screenLines.length
tokenizedLinesCount = @tokenizedBuffer.getLineCount()
bufferLinesCount = @buffer.getLineCount()
atom.assert screenLinesCount is tokenizedLinesCount, "Display buffer line count out of sync with tokenized buffer", (error) ->
error.metadata = {screenLinesCount, tokenizedLinesCount, bufferLinesCount}
atom.assert screenLinesCount is bufferLinesCount, "Display buffer line count out of sync with buffer", (error) ->
error.metadata = {screenLinesCount, tokenizedLinesCount, bufferLinesCount}
if Grim.includeDeprecatedAPIs
DisplayBuffer.properties
softWrapped: null

View File

@@ -23,6 +23,7 @@ class TokenizedBuffer extends Model
invalidRows: null
visible: false
configSettings: null
changeCount: 0
constructor: ({@buffer, @tabLength, @ignoreInvisibles, @largeFileMode}) ->
@emitter = new Emitter
@@ -229,6 +230,8 @@ class TokenizedBuffer extends Model
row + delta
handleBufferChange: (e) ->
@changeCount = @buffer.changeCount
{oldRange, newRange} = e
start = oldRange.start.row
end = oldRange.end.row
@@ -296,10 +299,12 @@ class TokenizedBuffer extends Model
# undefined. This should paper over the problem but we want to figure out
# what is happening:
tokenizedLine = @tokenizedLineForRow(row)
atom.assert tokenizedLine?, "TokenizedLine is defined", (error) =>
atom.assert tokenizedLine?, "TokenizedLine is undefined", (error) =>
error.metadata = {
row: row
rowCount: @tokenizedLines.length
tokenizedBufferChangeCount: @changeCount
bufferChangeCount: @buffer.changeCount
}
return false unless tokenizedLine?