From 3983a25a9803bf2247b3f5818225a8659487008f Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 1 Jun 2012 15:22:24 -0700 Subject: [PATCH 01/12] Use requireStylesheet to load jasmine.css --- spec/spec-helper.coffee | 2 ++ vendor/jasmine-helper.coffee | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 6115a8e22..b473c2d22 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -7,6 +7,8 @@ Directory = require 'directory' require 'window' window.showConsole() +requireStylesheet "jasmine.css" + defaultTitle = document.title directoriesWithSubscriptions = null diff --git a/vendor/jasmine-helper.coffee b/vendor/jasmine-helper.coffee index 434912421..9386fafbf 100644 --- a/vendor/jasmine-helper.coffee +++ b/vendor/jasmine-helper.coffee @@ -7,9 +7,6 @@ module.exports.runSpecSuite = (specSuite, logErrors=true) -> $ = require 'jquery' - $('head').append $$ -> - @link rel: "stylesheet", type: "text/css", href: "static/jasmine.css" - $('body').append $$ -> @div id: 'jasmine-content' From 79ce3da4da6787fb563a674c9aa20e73f3a8e250 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 1 Jun 2012 15:23:27 -0700 Subject: [PATCH 02/12] Copy minimum necessary files to the bundle when LOAD_RESOURCES_FROM_DIR is set. --- Rakefile | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Rakefile b/Rakefile index 2cbb0d9a0..fc3becbb2 100644 --- a/Rakefile +++ b/Rakefile @@ -56,15 +56,17 @@ task :"copy-files-to-bundle" => :"verify-prerequisites" do dest = File.join(built_dir, contents_dir, "Resources") - %w(index.html src static vendor spec benchmark).each do |dir| - rm_rf File.join(dest, dir) - cp_r dir, File.join(dest, dir) - end + rm_rf File.join(dest, "index.html") + cp "index.html", File.join(dest, "index.html") - if ENV['LOAD_RESOURCES_FROM_DIR'] - sh "coffee -c #{dest}/src/stdlib/require.coffee" - else - sh "coffee -c #{dest}/src #{dest}/vendor #{dest}/spec" + sh "coffee -c -o #{dest}/src/stdlib src/stdlib/require.coffee" + unless ENV['LOAD_RESOURCES_FROM_DIR'] + %w(src static vendor spec benchmark).each do |dir| + rm_rf File.join(dest, dir) + cp_r dir, File.join(dest, dir) + end + + sh "coffee -c #{dest}/src #{dest}/vendor #{dest}/spec #{dest}/benchmark" end end From c4a75492f4a73aae055a2b8a5502f4a5ffd8dc5a Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 1 Jun 2012 15:27:52 -0700 Subject: [PATCH 03/12] Describe what ResourceConfig does --- Atom/ResourceConfig.xcconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Atom/ResourceConfig.xcconfig b/Atom/ResourceConfig.xcconfig index e9cc63cdd..c75e3310a 100644 --- a/Atom/ResourceConfig.xcconfig +++ b/Atom/ResourceConfig.xcconfig @@ -1 +1,4 @@ LOAD_RESOURCES_FROM_DIR=$PROJECT_DIR + +# Used in Rakefile to determine what to copy to bundle +# Used in Build Settings Preprocessor Macros \ No newline at end of file From ca4371d9ceffa73fd9f6bd20a05ecd5452e1e168 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Fri, 1 Jun 2012 15:35:38 -0700 Subject: [PATCH 04/12] The solution to all build problems --- spec/app/fold-suggester-spec.coffee | 2 +- spec/fixtures/{sample.coffee => coffee.coffee} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename spec/fixtures/{sample.coffee => coffee.coffee} (100%) diff --git a/spec/app/fold-suggester-spec.coffee b/spec/app/fold-suggester-spec.coffee index 121b98d68..88e01f523 100644 --- a/spec/app/fold-suggester-spec.coffee +++ b/spec/app/fold-suggester-spec.coffee @@ -27,7 +27,7 @@ describe "FoldSuggester", -> describe "coffeescript", -> beforeEach -> - buffer = new Buffer(require.resolve 'fixtures/sample.coffee') + buffer = new Buffer(require.resolve 'fixtures/coffee.coffee') highlighter = new Highlighter(buffer) foldSuggester = new FoldSuggester(highlighter) diff --git a/spec/fixtures/sample.coffee b/spec/fixtures/coffee.coffee similarity index 100% rename from spec/fixtures/sample.coffee rename to spec/fixtures/coffee.coffee From 3a8ac78a9905b3f55c50dc252fa1b27ef1de8087 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Fri, 1 Jun 2012 15:53:38 -0700 Subject: [PATCH 05/12] Comments aren't allowed in xcconfig --- Atom/ResourceConfig.xcconfig | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Atom/ResourceConfig.xcconfig b/Atom/ResourceConfig.xcconfig index c75e3310a..338820c2c 100644 --- a/Atom/ResourceConfig.xcconfig +++ b/Atom/ResourceConfig.xcconfig @@ -1,4 +1 @@ -LOAD_RESOURCES_FROM_DIR=$PROJECT_DIR - -# Used in Rakefile to determine what to copy to bundle -# Used in Build Settings Preprocessor Macros \ No newline at end of file +LOAD_RESOURCES_FROM_DIR=$PROJECT_DIR \ No newline at end of file From 74a873999e8cf9f14d073e8ed1a39ca34abdbfaa Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Fri, 1 Jun 2012 15:54:28 -0700 Subject: [PATCH 06/12] Fix tests that blow up when number of files in fixture directory increased --- spec/extensions/file-finder-spec.coffee | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spec/extensions/file-finder-spec.coffee b/spec/extensions/file-finder-spec.coffee index 3073267ba..a0c30c5b6 100644 --- a/spec/extensions/file-finder-spec.coffee +++ b/spec/extensions/file-finder-spec.coffee @@ -34,9 +34,10 @@ describe 'FileFinder', -> expect(finder.miniEditor.getText()).toBe '' it "shows all relative file paths for the current project and selects the first", -> + finder.maxResults = 1000 rootView.trigger 'file-finder:toggle' rootView.project.getFilePaths().done (paths) -> - expect(finder.pathList.children('li').length).toBe paths.length + expect(finder.pathList.children('li').length).toBe paths.length, finder.maxResults for path in paths expect(finder.pathList.find("li:contains(#{path})")).toExist() expect(finder.pathList.children().first()).toHaveClass 'selected' @@ -161,17 +162,14 @@ describe 'FileFinder', -> finder.trigger 'file-finder:select-file' expect(finder.hasParent()).toBeTruthy() - describe "findMatches(queryString)", -> + describe ".findMatches(queryString)", -> beforeEach -> rootView.trigger 'file-finder:toggle' it "returns up to finder.maxResults paths if queryString is empty", -> - expect(finder.paths.length).toBeLessThan finder.maxResults - expect(finder.findMatches('').length).toBe finder.paths.length - - finder.maxResults = finder.paths.length - 1 - - expect(finder.findMatches('').length).toBe finder.maxResults + expect(finder.findMatches('').length).toBeLessThan finder.maxResults + 1 + finder.maxResults = 5 + expect(finder.findMatches('').length).toBeLessThan finder.maxResults + 1 it "returns paths sorted by score of match against the given query", -> finder.paths = ["app.coffee", "atom/app.coffee"] From 2f435e08f33091dd0a5d933864f2e245b7521ce6 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Sat, 2 Jun 2012 08:56:02 -0700 Subject: [PATCH 07/12] Add regression test for "can't create multiple folds over same region". Am I using the term regression test correctly? --- spec/app/renderer-spec.coffee | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index f315f8574..c1abb55d2 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -307,6 +307,14 @@ describe "Renderer", -> expect(line4.screenDelta).toEqual [1, 0] expect(line5.text).toMatch /9-+/ + describe "when creating a fold where one already exists", -> + it "returns existing fold and does't create new fold", -> + fold = renderer.createFold(0,10) + expect(renderer.activeFolds[0].length).toBe 1 + + newFold = renderer.createFold(0,10) + expect(newFold).toBe fold + expect(renderer.activeFolds[0].length).toBe 1 describe "when the buffer changes", -> [fold1, fold2] = [] beforeEach -> From daa96d83329e542e279d35337e3b45bfa0f37075 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Sat, 2 Jun 2012 09:00:18 -0700 Subject: [PATCH 08/12] Remove triggering of 'fold' and 'unfold' events when fold is created/destroyed. They aren't being used --- src/app/renderer.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index 2de0c9f10..f60525ec4 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -89,7 +89,6 @@ class Renderer newScreenRange = @screenLineRangeForBufferRange(bufferRange) @trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true - @trigger 'fold', bufferRange fold destroyFold: (fold) -> @@ -103,7 +102,6 @@ class Renderer newScreenRange = @screenLineRangeForBufferRange(bufferRange) @trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true - @trigger 'unfold', bufferRange destroyFoldsContainingBufferRow: (bufferRow) -> folds = @activeFolds[bufferRow] ? [] From 433a4db5ae36e5e0f79a150d16151a967cfd1d43 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Sat, 2 Jun 2012 09:19:37 -0700 Subject: [PATCH 09/12] Add Fold.isContainedByFold(fold) --- src/app/fold.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/fold.coffee b/src/app/fold.coffee index 74838ba7a..0d11abaf9 100644 --- a/src/app/fold.coffee +++ b/src/app/fold.coffee @@ -41,6 +41,9 @@ class Fold isContainedByRange: (range) -> range.start.row <= @startRow and @endRow <= range.end.row + isContainedByFold: (fold) -> + @isContainedByRange(fold.getBufferRange()) + updateStartRow: (event) -> { newRange, oldRange } = event From fd152ef2a90193a98fc483829aef811a048a20df Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Sat, 2 Jun 2012 09:21:06 -0700 Subject: [PATCH 10/12] When a fold is created inside an existing fold, don't trigger change events or update line map. --- spec/app/renderer-spec.coffee | 22 ++++++++++++++++++--- src/app/renderer.coffee | 36 +++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/spec/app/renderer-spec.coffee b/spec/app/renderer-spec.coffee index c1abb55d2..5225d2386 100644 --- a/spec/app/renderer-spec.coffee +++ b/spec/app/renderer-spec.coffee @@ -315,6 +315,25 @@ describe "Renderer", -> newFold = renderer.createFold(0,10) expect(newFold).toBe fold expect(renderer.activeFolds[0].length).toBe 1 + + describe "when a fold is created inside an existing folded region", -> + it "creates/destroys the fold, but does not trigger change event", -> + outerFold = renderer.createFold(0, 10) + changeHandler.reset() + + innerFold = renderer.createFold(2, 5) + expect(changeHandler).not.toHaveBeenCalled() + [line0, line1] = renderer.linesForRows(0, 1) + expect(line0.fold).toBe outerFold + expect(line1.fold).toBeUndefined() + + changeHandler.reset() + innerFold.destroy() + expect(changeHandler).not.toHaveBeenCalled() + [line0, line1] = renderer.linesForRows(0, 1) + expect(line0.fold).toBe outerFold + expect(line1.fold).toBeUndefined() + describe "when the buffer changes", -> [fold1, fold2] = [] beforeEach -> @@ -583,6 +602,3 @@ describe "Renderer", -> describe ".bufferRowsForScreenRows()", -> it "returns the buffer rows corresponding to each screen row in the given range", -> - renderer.setMaxLineLength(50) - renderer.createFold(4, 7) - expect(renderer.bufferRowsForScreenRows()).toEqual [0, 1, 2, 3, 3, 4, 8, 8, 9, 10, 11, 12] diff --git a/src/app/renderer.coffee b/src/app/renderer.coffee index f60525ec4..8f4e48c1a 100644 --- a/src/app/renderer.coffee +++ b/src/app/renderer.coffee @@ -54,7 +54,7 @@ class Renderer @lineMap.bufferRowsForScreenRows(startRow, endRow) foldAll: -> - for currentRow in [@buffer.getLastRow()..0] + for currentRow in [0..@buffer.getLastRow()] [startRow, endRow] = @foldSuggester.rowRangeForFoldAtBufferRow(currentRow) ? [] continue unless startRow? @@ -72,6 +72,11 @@ class Renderer break + isFoldContainedByActiveFold: (fold) -> + for row, folds of @activeFolds + for otherFold in folds + return otherFold if fold != otherFold and fold.isContainedByFold(otherFold) + foldFor: (startRow, endRow) -> _.find @activeFolds[startRow] ? [], (fold) -> fold.startRow == startRow and fold.endRow == endRow @@ -81,27 +86,30 @@ class Renderer fold = new Fold(this, startRow, endRow) @registerFold(fold) - bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)]) - oldScreenRange = @screenLineRangeForBufferRange(bufferRange) + unless @isFoldContainedByActiveFold(fold) + bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)]) + oldScreenRange = @screenLineRangeForBufferRange(bufferRange) - lines = @buildLineForBufferRow(startRow) - @lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines) - newScreenRange = @screenLineRangeForBufferRange(bufferRange) + lines = @buildLineForBufferRow(startRow) + @lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines) + newScreenRange = @screenLineRangeForBufferRange(bufferRange) + + @trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true - @trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true fold destroyFold: (fold) -> @unregisterFold(fold.startRow, fold) - { startRow, endRow } = fold - bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)]) - oldScreenRange = @screenLineRangeForBufferRange(bufferRange) - lines = @buildLinesForBufferRows(startRow, endRow) - @lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines) - newScreenRange = @screenLineRangeForBufferRange(bufferRange) + unless @isFoldContainedByActiveFold(fold) + { startRow, endRow } = fold + bufferRange = new Range([startRow, 0], [endRow, @buffer.lineLengthForRow(endRow)]) + oldScreenRange = @screenLineRangeForBufferRange(bufferRange) + lines = @buildLinesForBufferRows(startRow, endRow) + @lineMap.replaceScreenRows(oldScreenRange.start.row, oldScreenRange.end.row, lines) + newScreenRange = @screenLineRangeForBufferRange(bufferRange) - @trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true + @trigger 'change', oldRange: oldScreenRange, newRange: newScreenRange, lineNumbersChanged: true destroyFoldsContainingBufferRow: (bufferRow) -> folds = @activeFolds[bufferRow] ? [] From 86316c21157fb2c5154eab4849d3e34e9359487a Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Sat, 2 Jun 2012 09:24:27 -0700 Subject: [PATCH 11/12] Use last buffer row instead of last screen row to calculate gutter width. --- src/app/gutter.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/gutter.coffee b/src/app/gutter.coffee index 04d0e9deb..2d3ddd88a 100644 --- a/src/app/gutter.coffee +++ b/src/app/gutter.coffee @@ -19,4 +19,4 @@ class Gutter extends View @div {class: 'line-number'}, if row == lastScreenRow then '•' else row + 1 lastScreenRow = row - @lineNumbers.width(editor.getLastScreenRow().toString().length * editor.charWidth) + @lineNumbers.width(editor.buffer.getLastRow().toString().length * editor.charWidth) From 2f6dd085ee377517b7cd7b9e32ae94aebf8c5709 Mon Sep 17 00:00:00 2001 From: Corey Johnson Date: Mon, 4 Jun 2012 09:44:20 -0700 Subject: [PATCH 12/12] Editor toggle-fold event toggles the largest fold at the cursor position --- spec/app/editor-spec.coffee | 18 ++++++++++++++++++ src/app/editor.coffee | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 726e19abd..aa2a32c36 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -2457,6 +2457,19 @@ describe "Editor", -> editor.trigger "toggle-fold" expect(editor.screenLineForRow(1).fold).toBeUndefined() + it "creates/destroys the largest fold containing the cursor position", -> + editor.trigger "fold-all" + editor.setCursorBufferPosition([5,1]) + + editor.trigger "toggle-fold" + expect(editor.screenLineForRow(0).fold).toBeUndefined() + expect(editor.screenLineForRow(1).fold).toBeDefined() + + editor.trigger "toggle-fold" + expect(editor.screenLineForRow(0).fold).toBeUndefined() + expect(editor.screenLineForRow(1).fold).toBeUndefined() + expect(editor.screenLineForRow(4).fold).toBeDefined() + describe "when a fold-all event is triggered", -> it "creates folds on every line that can be folded", -> editor.setCursorBufferPosition([5,13]) @@ -2465,6 +2478,11 @@ describe "Editor", -> expect(editor.screenLineForRow(0).fold).toBeDefined() expect(editor.screenLineForRow(1)).toBeUndefined() + it "maintains cursor buffer position when buffer is created/destroyed", -> + editor.setCursorBufferPosition([5,5]) + editor.trigger "fold-all" + expect(editor.getCursorBufferPosition()).toEqual([5,5]) + describe "primitive folding", -> beforeEach -> editor.setBuffer(new Buffer(require.resolve('fixtures/two-hundred.txt'))) diff --git a/src/app/editor.coffee b/src/app/editor.coffee index ce2f02ee8..8446ad716 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -810,7 +810,8 @@ class Editor extends View @renderer.foldAll() toggleFold: -> - @renderer.toggleFoldAtBufferRow(@getCursorBufferPosition().row) + row = @renderer.bufferPositionForScreenPosition(@getCursorScreenPosition()).row + @renderer.toggleFoldAtBufferRow(row) foldSelection: -> @getSelection().fold()