From 3fb22f123a9d64187105160664c6e4ea083eb040 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 18 Sep 2014 11:03:11 -0700 Subject: [PATCH] Don't throw errors when folding comments Previously trying to fold single line comments at the start/end of files would throw errors since the +1 and -1 used in the index ranges would cause the loop to advance past the last row or before the first row. --- spec/language-mode-spec.coffee | 22 ++++++++++++++++++++++ src/language-mode.coffee | 21 +++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/spec/language-mode-spec.coffee b/spec/language-mode-spec.coffee index fd3a4a478..f6f0ebdd7 100644 --- a/spec/language-mode-spec.coffee +++ b/spec/language-mode-spec.coffee @@ -70,6 +70,28 @@ describe "LanguageMode", -> expect(languageMode.rowRangeForCodeFoldAtBufferRow(2)).toBeNull() expect(languageMode.rowRangeForCodeFoldAtBufferRow(4)).toEqual [4, 7] + describe ".rowRangeForCommentAtBufferRow(bufferRow)", -> + it "returns the start/end rows of the foldable comment starting at the given row", -> + buffer.setText("//this is a multi line comment\n//another line") + expect(languageMode.rowRangeForCommentAtBufferRow(0)).toEqual [0, 1] + expect(languageMode.rowRangeForCommentAtBufferRow(1)).toEqual [0, 1] + + buffer.setText("//this is a multi line comment\n//another line\n//and one more") + expect(languageMode.rowRangeForCommentAtBufferRow(0)).toEqual [0, 2] + expect(languageMode.rowRangeForCommentAtBufferRow(1)).toEqual [0, 2] + + buffer.setText("//this is a multi line comment\n\n//with an empty line") + expect(languageMode.rowRangeForCommentAtBufferRow(0)).toBeUndefined() + expect(languageMode.rowRangeForCommentAtBufferRow(1)).toBeUndefined() + expect(languageMode.rowRangeForCommentAtBufferRow(2)).toBeUndefined() + + buffer.setText("//this is a single line comment\n") + expect(languageMode.rowRangeForCommentAtBufferRow(0)).toBeUndefined() + expect(languageMode.rowRangeForCommentAtBufferRow(1)).toBeUndefined() + + buffer.setText("//this is a single line comment") + expect(languageMode.rowRangeForCommentAtBufferRow(0)).toBeUndefined() + describe "suggestedIndentForBufferRow", -> it "returns the suggested indentation based on auto-indent/outdent rules", -> expect(languageMode.suggestedIndentForBufferRow(0)).toBe 0 diff --git a/src/language-mode.coffee b/src/language-mode.coffee index de1a5b928..6ce4b7b3a 100644 --- a/src/language-mode.coffee +++ b/src/language-mode.coffee @@ -148,15 +148,20 @@ class LanguageMode return unless @editor.displayBuffer.tokenizedBuffer.tokenizedLineForRow(bufferRow).isComment() startRow = bufferRow - for currentRow in [bufferRow-1..0] - break if @buffer.isRowBlank(currentRow) - break unless @editor.displayBuffer.tokenizedBuffer.tokenizedLineForRow(currentRow).isComment() - startRow = currentRow endRow = bufferRow - for currentRow in [bufferRow+1..@buffer.getLastRow()] - break if @buffer.isRowBlank(currentRow) - break unless @editor.displayBuffer.tokenizedBuffer.tokenizedLineForRow(currentRow).isComment() - endRow = currentRow + + if bufferRow > 0 + for currentRow in [bufferRow-1..0] + break if @buffer.isRowBlank(currentRow) + break unless @editor.displayBuffer.tokenizedBuffer.tokenizedLineForRow(currentRow).isComment() + startRow = currentRow + + if bufferRow < @buffer.getLastRow() + for currentRow in [bufferRow+1..@buffer.getLastRow()] + break if @buffer.isRowBlank(currentRow) + break unless @editor.displayBuffer.tokenizedBuffer.tokenizedLineForRow(currentRow).isComment() + endRow = currentRow + return [startRow, endRow] if startRow isnt endRow rowRangeForCodeFoldAtBufferRow: (bufferRow) ->