From c2326d096b1233b961013c04832ef70843f04b28 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 18 Jul 2013 10:58:36 -0700 Subject: [PATCH] Fold comments in `foldAll()` --- spec/app/language-mode-spec.coffee | 24 ++++++++++++------------ src/app/language-mode.coffee | 20 ++++++++++++++------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/spec/app/language-mode-spec.coffee b/spec/app/language-mode-spec.coffee index da49f97ce..e10fd4963 100644 --- a/spec/app/language-mode-spec.coffee +++ b/spec/app/language-mode-spec.coffee @@ -44,12 +44,12 @@ describe "LanguageMode", -> expect(languageMode.doesBufferRowStartFold(2)).toBeFalsy() expect(languageMode.doesBufferRowStartFold(3)).toBeFalsy() - describe ".rowRangeForFoldAtBufferRow(bufferRow)", -> + describe ".rowRangeForCodeFoldAtBufferRow(bufferRow)", -> it "returns the start/end rows of the foldable region starting at the given row", -> - expect(languageMode.rowRangeForFoldAtBufferRow(0)).toEqual [0, 12] - expect(languageMode.rowRangeForFoldAtBufferRow(1)).toEqual [1, 9] - expect(languageMode.rowRangeForFoldAtBufferRow(2)).toBeNull() - expect(languageMode.rowRangeForFoldAtBufferRow(4)).toEqual [4, 7] + expect(languageMode.rowRangeForCodeFoldAtBufferRow(0)).toEqual [0, 12] + expect(languageMode.rowRangeForCodeFoldAtBufferRow(1)).toEqual [1, 9] + expect(languageMode.rowRangeForCodeFoldAtBufferRow(2)).toBeNull() + expect(languageMode.rowRangeForCodeFoldAtBufferRow(4)).toEqual [4, 7] describe "suggestedIndentForBufferRow", -> it "returns the suggested indentation based on auto-indent/outdent rules", -> @@ -98,12 +98,12 @@ describe "LanguageMode", -> expect(languageMode.doesBufferRowStartFold(3)).toBeFalsy() expect(languageMode.doesBufferRowStartFold(19)).toBeTruthy() - describe ".rowRangeForFoldAtBufferRow(bufferRow)", -> + describe ".rowRangeForCodeFoldAtBufferRow(bufferRow)", -> it "returns the start/end rows of the foldable region starting at the given row", -> - expect(languageMode.rowRangeForFoldAtBufferRow(0)).toEqual [0, 20] - expect(languageMode.rowRangeForFoldAtBufferRow(1)).toEqual [1, 17] - expect(languageMode.rowRangeForFoldAtBufferRow(2)).toBeNull() - expect(languageMode.rowRangeForFoldAtBufferRow(19)).toEqual [19, 20] + expect(languageMode.rowRangeForCodeFoldAtBufferRow(0)).toEqual [0, 20] + expect(languageMode.rowRangeForCodeFoldAtBufferRow(1)).toEqual [1, 17] + expect(languageMode.rowRangeForCodeFoldAtBufferRow(2)).toBeNull() + expect(languageMode.rowRangeForCodeFoldAtBufferRow(19)).toEqual [19, 20] describe "css", -> beforeEach -> @@ -158,7 +158,7 @@ describe "LanguageMode", -> languageMode.toggleLineCommentsForBufferRows(0, 0) expect(buffer.lineForRow(0)).toBe "// @color: #4D926F;" - fdescribe "folding", -> + describe "folding", -> describe "with comments", -> beforeEach -> @@ -189,7 +189,7 @@ describe "LanguageMode", -> fold3 = editSession.lineForScreenRow(2).fold.destroy() fold4 = editSession.lineForScreenRow(3).fold - expect([fold3.getStartRow(), fold3.getEndRow()]).toEqual [6, 8] + expect([fold4.getStartRow(), fold4.getEndRow()]).toEqual [6, 8] diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 9bf809f9d..c0b889c10 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -91,7 +91,6 @@ class LanguageMode for currentRow in [0..@buffer.getLastRow()] [startRow, endRow] = @rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? - @editSession.createFold(startRow, endRow) # Unfolds all the foldable lines in the buffer. @@ -106,9 +105,7 @@ class LanguageMode # Returns the new {Fold}. foldBufferRow: (bufferRow) -> for currentRow in [bufferRow..0] - rowRange = @rowRangeForCommentAtBufferRow(currentRow) - rowRange ?= @rowRangeForFoldAtBufferRow(currentRow) - [startRow, endRow] = rowRange ? [] + [startRow, endRow] = @rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? and startRow <= bufferRow <= endRow fold = @editSession.displayBuffer.largestFoldStartingAtBufferRow(startRow) return @editSession.createFold(startRow, endRow) unless fold @@ -119,13 +116,24 @@ class LanguageMode unfoldBufferRow: (bufferRow) -> @editSession.displayBuffer.largestFoldContainingBufferRow(bufferRow)?.destroy() + # Find the row range for a fold at a given bufferRow. Will handle comments + # and code. + # + # bufferRow - A {Number} indicating the buffer row + # + # Returns an {Array} of the [startRow, endRow]. Returns null if no range. + rowRangeForFoldAtBufferRow: (bufferRow) -> + rowRange = @rowRangeForCommentFoldAtBufferRow(bufferRow) + rowRange ?= @rowRangeForCodeFoldAtBufferRow(bufferRow) + rowRange + doesBufferRowStartFold: (bufferRow) -> return false if @editSession.isBufferRowBlank(bufferRow) nextNonEmptyRow = @editSession.nextNonBlankBufferRow(bufferRow) return false unless nextNonEmptyRow? @editSession.indentationForBufferRow(nextNonEmptyRow) > @editSession.indentationForBufferRow(bufferRow) - rowRangeForFoldAtBufferRow: (bufferRow) -> + rowRangeForCodeFoldAtBufferRow: (bufferRow) -> return null unless @doesBufferRowStartFold(bufferRow) startIndentLevel = @editSession.indentationForBufferRow(bufferRow) @@ -142,7 +150,7 @@ class LanguageMode [bufferRow, foldEndRow] - rowRangeForCommentAtBufferRow: (row) -> + rowRangeForCommentFoldAtBufferRow: (row) -> return unless @editSession.displayBuffer.tokenizedBuffer.lineForScreenRow(row).isComment() startRow = row