diff --git a/spec/app/language-mode-spec.coffee b/spec/app/language-mode-spec.coffee index 76e63113d..8b32cebf3 100644 --- a/spec/app/language-mode-spec.coffee +++ b/spec/app/language-mode-spec.coffee @@ -58,6 +58,47 @@ describe "LanguageMode", -> expect(languageMode.suggestedIndentForBufferRow(2)).toBe 2 expect(languageMode.suggestedIndentForBufferRow(9)).toBe 1 + describe "rowRangeForParagraphAtBufferRow", -> + describe "with code and comments", -> + beforeEach -> + buffer.setText ''' + var quicksort = function () { + /* Single line comment block */ + var sort = function(items) {}; + + /* + A multiline + comment is here + */ + var sort = function(items) {}; + + // A comment + // + // Multiple comment + // lines + var sort = function(items) {}; + // comment line after fn + }; + ''' + + it "will limit paragraph range to comments", -> + range = languageMode.rowRangeForParagraphAtBufferRow(0) + expect(range).toEqual [[0,0], [0,29]] + + range = languageMode.rowRangeForParagraphAtBufferRow(10) + expect(range).toEqual [[10,0], [10,14]] + range = languageMode.rowRangeForParagraphAtBufferRow(11) + expect(range).toBeFalsy() + range = languageMode.rowRangeForParagraphAtBufferRow(12) + expect(range).toEqual [[12,0], [13,10]] + + range = languageMode.rowRangeForParagraphAtBufferRow(14) + expect(range).toEqual [[14,0], [14,32]] + + range = languageMode.rowRangeForParagraphAtBufferRow(15) + expect(range).toEqual [[15,0], [15,26]] + + describe "coffeescript", -> beforeEach -> atom.activatePackage('coffee-script-tmbundle', sync: true) @@ -159,7 +200,6 @@ describe "LanguageMode", -> expect(buffer.lineForRow(0)).toBe "// @color: #4D926F;" describe "folding", -> - beforeEach -> atom.activatePackage('javascript-tmbundle', sync: true) editSession = project.open('sample.js', autoIndent: false) @@ -301,9 +341,3 @@ describe "LanguageMode", -> fold2 = editSession.lineForScreenRow(5).fold expect(fold2).toBeFalsy() - - - - - - diff --git a/src/app/cursor.coffee b/src/app/cursor.coffee index 09e2fb2c9..e0de01305 100644 --- a/src/app/cursor.coffee +++ b/src/app/cursor.coffee @@ -404,21 +404,7 @@ class Cursor # # Returns a {Range}. getCurrentParagraphBufferRange: -> - row = @getBufferRow() - return unless /\w/.test(@editSession.lineForBufferRow(row)) - - startRow = row - while startRow > 0 - break unless /\w/.test(@editSession.lineForBufferRow(startRow - 1)) - startRow-- - - endRow = row - lastRow = @editSession.getLastBufferRow() - while endRow < lastRow - break unless /\w/.test(@editSession.lineForBufferRow(endRow + 1)) - endRow++ - - new Range([startRow, 0], [endRow, @editSession.lineLengthForBufferRow(endRow)]) + @editSession.languageMode.rowRangeForParagraphAtBufferRow(@getBufferRow()) # Retrieves the characters that constitute a word preceeding the current cursor position. # diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 5ded3427b..805599b39 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -177,6 +177,38 @@ class LanguageMode return false unless nextNonEmptyRow? @editSession.indentationForBufferRow(nextNonEmptyRow) > @editSession.indentationForBufferRow(bufferRow) + # Find a row range for a 'paragraph' around specified bufferRow. + # Right now, a paragraph is a block of text bounded by and empty line or a + # block of text that is not the same type (comments next to source code). + rowRangeForParagraphAtBufferRow: (bufferRow) -> + return unless /\w/.test(@editSession.lineForBufferRow(bufferRow)) + + isRowComment = (row) => + !!@editSession.displayBuffer.tokenizedBuffer.lineForScreenRow(row).isComment() + + if isRowComment(bufferRow) + isOriginalRowComment = true + range = @rowRangeForCommentAtBufferRow(bufferRow) + [firstRow, lastRow] = range or [bufferRow, bufferRow] + else + isOriginalRowComment = false + [firstRow, lastRow] = [0, @editSession.getLastBufferRow()-1] + + startRow = bufferRow + while startRow > firstRow + break if isRowComment(startRow - 1) != isOriginalRowComment + break unless /\w/.test(@editSession.lineForBufferRow(startRow - 1)) + startRow-- + + endRow = bufferRow + lastRow = @editSession.getLastBufferRow() + while endRow < lastRow + break if isRowComment(endRow + 1) != isOriginalRowComment + break unless /\w/.test(@editSession.lineForBufferRow(endRow + 1)) + endRow++ + + new Range([startRow, 0], [endRow, @editSession.lineLengthForBufferRow(endRow)]) + # Given a buffer row, this returns a suggested indentation level. # # The indentation level provided is based on the current {LanguageMode}.