From bea324eae92017e04f8ad0006a0d0da09f8f323e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 17 Feb 2016 15:05:31 +0100 Subject: [PATCH] :fire: Use just `isFoldableAtBufferRow` --- spec/language-mode-spec.coffee | 11 ----- spec/tokenized-buffer-spec.coffee | 82 ++++++++++++++----------------- src/display-buffer.coffee | 4 +- src/text-editor-presenter.coffee | 9 +++- src/text-editor.coffee | 6 +-- src/tokenized-buffer.coffee | 9 ---- src/tokenized-line.coffee | 1 - 7 files changed, 47 insertions(+), 75 deletions(-) diff --git a/spec/language-mode-spec.coffee b/spec/language-mode-spec.coffee index 7ea4a1ae9..cd32e29c7 100644 --- a/spec/language-mode-spec.coffee +++ b/spec/language-mode-spec.coffee @@ -463,17 +463,6 @@ describe "LanguageMode", -> fold2 = editor.tokenizedLineForScreenRow(5).fold expect(fold2).toBeFalsy() - describe ".isFoldableAtBufferRow(bufferRow)", -> - it "returns true if the line starts a multi-line comment", -> - expect(languageMode.isFoldableAtBufferRow(1)).toBe true - expect(languageMode.isFoldableAtBufferRow(6)).toBe true - expect(languageMode.isFoldableAtBufferRow(17)).toBe false - - it "does not return true for a line in the middle of a comment that's followed by an indented line", -> - expect(languageMode.isFoldableAtBufferRow(7)).toBe false - editor.buffer.insert([8, 0], ' ') - expect(languageMode.isFoldableAtBufferRow(7)).toBe false - describe "css", -> beforeEach -> waitsForPromise -> diff --git a/spec/tokenized-buffer-spec.coffee b/spec/tokenized-buffer-spec.coffee index ca64d2edb..88c095f68 100644 --- a/spec/tokenized-buffer-spec.coffee +++ b/spec/tokenized-buffer-spec.coffee @@ -900,7 +900,7 @@ describe "TokenizedBuffer", -> expect(tokenizedBuffer.tokenizedLineForRow(9).indentLevel).toBe 2 expect(tokenizedBuffer.tokenizedLineForRow(10).indentLevel).toBe 2 # } - describe "::foldableRowsForRowRange(startRow, endRow)", -> + describe "::isFoldableAtRow(row)", -> changes = null beforeEach -> @@ -914,72 +914,64 @@ describe "TokenizedBuffer", -> fullyTokenize(tokenizedBuffer) it "includes the first line of multi-line comments", -> - foldableRows = tokenizedBuffer.foldableRowsForRowRange(0, 16) - expect(foldableRows.has(0)).toBe true - expect(foldableRows.has(1)).toBe false - expect(foldableRows.has(2)).toBe false - expect(foldableRows.has(3)).toBe true # because of indent - expect(foldableRows.has(13)).toBe true - expect(foldableRows.has(14)).toBe false - expect(foldableRows.has(15)).toBe false - expect(foldableRows.has(16)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(0)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(1)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(2)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(3)).toBe true # because of indent + expect(tokenizedBuffer.isFoldableAtRow(13)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(14)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(15)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(16)).toBe false buffer.insert([0, Infinity], '\n') - foldableRows = tokenizedBuffer.foldableRowsForRowRange(0, 3) - expect(foldableRows.has(0)).toBe false - expect(foldableRows.has(1)).toBe false - expect(foldableRows.has(2)).toBe true - expect(foldableRows.has(3)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(0)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(1)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(2)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(3)).toBe false buffer.undo() - foldableRows = tokenizedBuffer.foldableRowsForRowRange(0, 3) - expect(foldableRows.has(0)).toBe true - expect(foldableRows.has(1)).toBe false - expect(foldableRows.has(2)).toBe false - expect(foldableRows.has(3)).toBe true # because of indent + expect(tokenizedBuffer.isFoldableAtRow(0)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(1)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(2)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(3)).toBe true # because of indent it "includes non-comment lines that precede an increase in indentation", -> buffer.insert([2, 0], ' ') # commented lines preceding an indent aren't foldable - foldableRows = tokenizedBuffer.foldableRowsForRowRange(0, 8) - expect(foldableRows.has(1)).toBe false - expect(foldableRows.has(2)).toBe false - expect(foldableRows.has(3)).toBe true - expect(foldableRows.has(4)).toBe true - expect(foldableRows.has(5)).toBe false - expect(foldableRows.has(6)).toBe false - expect(foldableRows.has(7)).toBe true - expect(foldableRows.has(8)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(1)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(2)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(3)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(4)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(5)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(6)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(7)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(8)).toBe false buffer.insert([7, 0], ' ') - foldableRows = tokenizedBuffer.foldableRowsForRowRange(6, 8) - expect(foldableRows.has(6)).toBe true - expect(foldableRows.has(7)).toBe false - expect(foldableRows.has(8)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(6)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(7)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(8)).toBe false buffer.undo() - foldableRows = tokenizedBuffer.foldableRowsForRowRange(6, 8) - expect(foldableRows.has(6)).toBe false - expect(foldableRows.has(7)).toBe true - expect(foldableRows.has(8)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(6)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(7)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(8)).toBe false buffer.insert([7, 0], " \n x\n") - foldableRows = tokenizedBuffer.foldableRowsForRowRange(6, 8) - expect(foldableRows.has(6)).toBe true - expect(foldableRows.has(7)).toBe false - expect(foldableRows.has(8)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(6)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(7)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(8)).toBe false buffer.insert([9, 0], " ") - foldableRows = tokenizedBuffer.foldableRowsForRowRange(6, 8) - expect(foldableRows.has(6)).toBe true - expect(foldableRows.has(7)).toBe false - expect(foldableRows.has(8)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(6)).toBe true + expect(tokenizedBuffer.isFoldableAtRow(7)).toBe false + expect(tokenizedBuffer.isFoldableAtRow(8)).toBe false describe "when the buffer is configured with the null grammar", -> it "uses the placeholder tokens and does not actually tokenize using the grammar", -> diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 8015f2df2..d01ad03c9 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -413,8 +413,8 @@ class DisplayBuffer extends Model isFoldedAtScreenRow: (screenRow) -> @largestFoldContainingBufferRow(@bufferRowForScreenRow(screenRow))? - foldableBufferRowsForBufferRowRange: (startRow, endRow) -> - @tokenizedBuffer.foldableRowsForRowRange(startRow, endRow) + isFoldableAtBufferRow: (row) -> + @tokenizedBuffer.isFoldableAtRow(row) # Destroys the fold with the given id destroyFoldWithId: (id) -> diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 48f269b9d..3266eea70 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -600,8 +600,14 @@ class TextEditorPresenter if endRow > startRow bufferRows = @model.bufferRowsForScreenRows(startRow, endRow - 1) - foldableBufferRows = @model.foldableBufferRowsForBufferRowRange(bufferRows[0], bufferRows[bufferRows.length - 1]) + previousBufferRow = -1 + foldable = false for bufferRow, i in bufferRows + # don't compute foldability more than once per buffer row + if previousBufferRow isnt bufferRow + foldable = @model.isFoldableAtBufferRow(bufferRow) + previousBufferRow = bufferRow + if bufferRow is lastBufferRow softWrapped = true else @@ -611,7 +617,6 @@ class TextEditorPresenter screenRow = startRow + i line = @model.tokenizedLineForScreenRow(screenRow) decorationClasses = @lineNumberDecorationClassesForRow(screenRow) - foldable = foldableBufferRows.has(bufferRow) blockDecorationsBeforeCurrentScreenRowHeight = @lineTopIndex.pixelPositionAfterBlocksForRow(screenRow) - @lineTopIndex.pixelPositionBeforeBlocksForRow(screenRow) blockDecorationsHeight = blockDecorationsBeforeCurrentScreenRowHeight if screenRow % @tileSize isnt 0 diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 6c80cfc01..c0a6f2057 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -2939,8 +2939,7 @@ class TextEditor extends Model # # Returns a {Boolean}. isFoldableAtBufferRow: (bufferRow) -> - # @languageMode.isFoldableAtBufferRow(bufferRow) - @foldableBufferRowsForBufferRowRange(bufferRow, bufferRow).has(bufferRow) + @displayBuffer.isFoldableAtBufferRow(bufferRow) # Extended: Determine whether the given row in screen coordinates is foldable. # @@ -2953,9 +2952,6 @@ class TextEditor extends Model bufferRow = @displayBuffer.bufferRowForScreenRow(screenRow) @isFoldableAtBufferRow(bufferRow) - foldableBufferRowsForBufferRowRange: (startRow, endRow) -> - @displayBuffer.foldableBufferRowsForBufferRowRange(startRow, endRow) - # Extended: Fold the given buffer row if it isn't currently folded, and unfold # it otherwise. toggleFoldAtBufferRow: (bufferRow) -> diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index 055e3fe47..5c62f9ecd 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -282,15 +282,6 @@ class TokenizedBuffer extends Model row - increment - foldableRowsForRowRange: (startRow, endRow) -> - scanStartRow = @buffer.previousNonBlankRow(startRow) ? startRow - scanStartRow-- while scanStartRow > 0 and @tokenizedLineForRow(scanStartRow).isComment() - scanEndRow = @buffer.nextNonBlankRow(endRow) ? endRow - foldableRows = new Set - for row in [scanStartRow..scanEndRow] by 1 when @isFoldableAtRow(row) - foldableRows.add(row) - foldableRows - isFoldableAtRow: (row) -> if @largeFileMode false diff --git a/src/tokenized-line.coffee b/src/tokenized-line.coffee index c97a621ac..372f488a6 100644 --- a/src/tokenized-line.coffee +++ b/src/tokenized-line.coffee @@ -33,7 +33,6 @@ class TokenizedLine endOfLineInvisibles: null lineIsWhitespaceOnly: false firstNonWhitespaceIndex: 0 - foldable: false constructor: (properties) -> @id = idCounter++