From 34e96fb8d772ecbf1214bd295135f513e2eec1e0 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Tue, 17 Jul 2012 14:26:12 -0600 Subject: [PATCH] WIP: Adding find all matches in project command --- .../command-interpreter-spec.coffee | 22 ++++++++++++++++++- spec/fixtures/dir/a-dir/oh-git | 1 + src/app/project.coffee | 17 +++++++------- src/extensions/command-panel/commands.pegjs | 6 ++++- .../command-panel/commands/command.coffee | 1 + .../commands/composite-command.coffee | 11 ++++++---- .../select-all-matches-in-project.coffee | 20 +++++++++++++++++ src/extensions/command-panel/operation.coffee | 2 ++ 8 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 src/extensions/command-panel/commands/select-all-matches-in-project.coffee diff --git a/spec/extensions/command-interpreter-spec.coffee b/spec/extensions/command-interpreter-spec.coffee index adfadc261..dbddcb546 100644 --- a/spec/extensions/command-interpreter-spec.coffee +++ b/spec/extensions/command-interpreter-spec.coffee @@ -1,11 +1,13 @@ CommandInterpreter = require 'command-panel/command-interpreter' +Project = require 'project' Buffer = require 'buffer' EditSession = require 'edit-session' describe "CommandInterpreter", -> - [interpreter, editSession, buffer, anchorCountBefore] = [] + [project, interpreter, editSession, buffer, anchorCountBefore] = [] beforeEach -> + project = new Project(fixturesProject.resolve('dir/')) interpreter = new CommandInterpreter(fixturesProject) editSession = fixturesProject.open('sample.js') buffer = editSession.buffer @@ -303,3 +305,21 @@ describe "CommandInterpreter", -> runs -> expect(editSession.getSelectedBufferRanges()).toEqual [[[5, 0], [5, 16]], [[6, 0], [6, 36]]] + + describe "X x/regex/", -> + it "returns selection operations for all regex matches in all the project's files", -> + editSession.destroy() + project = new Project(fixturesProject.resolve('dir/')) + interpreter = new CommandInterpreter(fixturesProject) + editSession = project.open('a') + + operations = null + waitsForPromise -> + interpreter.eval("X x/a+/", editSession).done (ops) -> + operations = ops + + runs -> + console.log operations + + + operation.destroy() for operation in operations diff --git a/spec/fixtures/dir/a-dir/oh-git b/spec/fixtures/dir/a-dir/oh-git index e69de29bb..64998f776 100644 --- a/spec/fixtures/dir/a-dir/oh-git +++ b/spec/fixtures/dir/a-dir/oh-git @@ -0,0 +1 @@ +bbb aaaa \ No newline at end of file diff --git a/src/app/project.coffee b/src/app/project.coffee index 20baeae56..07e4a519c 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -77,13 +77,7 @@ class Project setSoftWrap: (@softWrap) -> open: (filePath, editSessionOptions={}) -> - if filePath? - filePath = @resolve(filePath) - buffer = @bufferWithPath(filePath) ? @buildBuffer(filePath) - else - buffer = @buildBuffer() - - @buildEditSession(buffer, editSessionOptions) + @buildEditSession(@bufferForPath(filePath), editSessionOptions) buildEditSession: (buffer, editSessionOptions) -> options = _.extend(@defaultEditSessionOptions(), editSessionOptions) @@ -116,8 +110,13 @@ class Project buffers - bufferWithPath: (path) -> - return editSession.buffer for editSession in @editSessions when editSession.buffer.getPath() == path + bufferForPath: (filePath) -> + if filePath? + filePath = @resolve(filePath) + return editSession.buffer for editSession in @editSessions when editSession.buffer.getPath() == filePath + @buildBuffer(filePath) + else + @buildBuffer() buildBuffer: (filePath) -> buffer = new Buffer(filePath) diff --git a/src/extensions/command-panel/commands.pegjs b/src/extensions/command-panel/commands.pegjs index 982a206fe..7761003eb 100644 --- a/src/extensions/command-panel/commands.pegjs +++ b/src/extensions/command-panel/commands.pegjs @@ -8,6 +8,7 @@ var CurrentSelectionAddress = require('command-panel/commands/current-selection-address') var RegexAddress = require('command-panel/commands/regex-address') var SelectAllMatches = require('command-panel/commands/select-all-matches') + var SelectAllMatchesInProject = require('command-panel/commands/select-all-matches-in-project') } start = expressions:(expression+) { @@ -35,7 +36,7 @@ primitiveAddress regexAddress = reverse:'-'? '/' pattern:pattern '/'? { return new RegexAddress(pattern, reverse.length > 0)} -command = substitution / selectAllMatches +command = substitution / selectAllMatches / selectAllMatchesInProject substitution = "s" _ "/" find:pattern "/" replace:pattern "/" _ options:[g]* { @@ -45,6 +46,9 @@ substitution selectAllMatches = 'x' _ '/' pattern:pattern '/'? { return new SelectAllMatches(pattern) } +selectAllMatchesInProject + = 'X' _ 'x' _ '/' pattern:pattern '/'? { return new SelectAllMatchesInProject(pattern) } + pattern = pattern:[^/]* { return pattern.join('') } diff --git a/src/extensions/command-panel/commands/command.coffee b/src/extensions/command-panel/commands/command.coffee index b337f0a61..181def85b 100644 --- a/src/extensions/command-panel/commands/command.coffee +++ b/src/extensions/command-panel/commands/command.coffee @@ -4,3 +4,4 @@ module.exports = class Command isAddress: -> false preserveSelections: false + previewOperations: false \ No newline at end of file diff --git a/src/extensions/command-panel/commands/composite-command.coffee b/src/extensions/command-panel/commands/composite-command.coffee index 6569e2828..0e643a6f7 100644 --- a/src/extensions/command-panel/commands/composite-command.coffee +++ b/src/extensions/command-panel/commands/composite-command.coffee @@ -22,10 +22,13 @@ class CompositeCommand deferred.resolve() else editSession.clearAllSelections() unless currentCommand.preserveSelections - for operation in operations - operation.execute(editSession) - operation.destroy() - deferred.resolve() + if currentCommand.previewOperations + deferred.resolve(operations) + else + for operation in operations + operation.execute(editSession) + operation.destroy() + deferred.resolve() deferred.promise() diff --git a/src/extensions/command-panel/commands/select-all-matches-in-project.coffee b/src/extensions/command-panel/commands/select-all-matches-in-project.coffee new file mode 100644 index 000000000..e6e75e407 --- /dev/null +++ b/src/extensions/command-panel/commands/select-all-matches-in-project.coffee @@ -0,0 +1,20 @@ +Command = require 'command-panel/commands/command' +Operation = require 'command-panel/operation' +$ = require 'jquery' + +module.exports = +class SelectAllMatchesInProject extends Command + regex: null + previewOperations: true + + constructor: (pattern) -> + @regex = new RegExp(pattern, 'g') + + compile: (project, buffer, range) -> + deferred = $.Deferred() + operations = [] + promise = project.scan @regex, ({path, range}) -> + operations.push(new Operation(buffer: project.bufferForPath(path), bufferRange: range)) + + promise.done -> deferred.resolve(operations) + deferred.promise() diff --git a/src/extensions/command-panel/operation.coffee b/src/extensions/command-panel/operation.coffee index be7716725..fd707f37e 100644 --- a/src/extensions/command-panel/operation.coffee +++ b/src/extensions/command-panel/operation.coffee @@ -1,6 +1,7 @@ module.exports = class Operation constructor: ({@buffer, bufferRange, @newText, @preserveSelection}) -> + @buffer.retain() @anchorRange = @buffer.addAnchorRange(bufferRange) getBufferRange: -> @@ -11,4 +12,5 @@ class Operation editSession.addSelectionForBufferRange(@getBufferRange()) unless @preserveSelection destroy: -> + @buffer.release() @anchorRange.destroy() \ No newline at end of file