CommandInterpreter uses project and edit sessions instead of editor to execute

We don't want to pass view objects into it!
This commit is contained in:
Corey Johnson & Nathan Sobo
2012-07-13 15:10:37 -06:00
parent a4db677979
commit 42f322a112
13 changed files with 141 additions and 143 deletions

View File

@@ -162,6 +162,9 @@ class RootView extends View
else
@panes.find('.editor:first').view()
getActiveEditSession: ->
@getActiveEditor()?.activeEditSession
focusNextPane: ->
panes = @panes.find('.pane')
currentIndex = panes.toArray().indexOf(@getFocusedPane()[0])

View File

@@ -3,16 +3,16 @@ PEG = require 'pegjs'
module.exports =
class CommandInterpreter
constructor: ->
constructor: (@project) ->
@parser = PEG.buildParser(fs.read(require.resolve 'command-panel/commands.pegjs'))
eval: (editor, string) ->
eval: (string, activeEditSession) ->
compositeCommand = @parser.parse(string)
@lastRelativeAddress = compositeCommand if compositeCommand.isRelativeAddress()
compositeCommand.execute(editor)
compositeCommand.execute(@project, activeEditSession)
repeatRelativeAddress: (editor) ->
@lastRelativeAddress?.execute(editor)
repeatRelativeAddress: (activeEditSession) ->
@lastRelativeAddress?.execute(@project, activeEditSession)
repeatRelativeAddressInReverse: (editor) ->
@lastRelativeAddress?.reverse().execute(editor)
repeatRelativeAddressInReverse: (activeEditSession) ->
@lastRelativeAddress?.reverse().execute(@project, activeEditSession)

View File

@@ -35,7 +35,7 @@ class CommandPanel extends View
historyIndex: 0
initialize: (@rootView)->
@commandInterpreter = new CommandInterpreter()
@commandInterpreter = new CommandInterpreter(@rootView.project)
@history = []
@rootView.on 'command-panel:toggle', => @toggle()
@@ -64,7 +64,7 @@ class CommandPanel extends View
execute: (command = @miniEditor.getText()) ->
try
@commandInterpreter.eval(@rootView.getActiveEditor(), command)
@commandInterpreter.eval(command, @rootView.getActiveEditSession())
catch error
if error instanceof SyntaxError
@flashError()
@@ -87,10 +87,10 @@ class CommandPanel extends View
@miniEditor.setText(@history[@historyIndex] or '')
repeatRelativeAddress: ->
@commandInterpreter.repeatRelativeAddress(@rootView.getActiveEditor())
@commandInterpreter.repeatRelativeAddress(@rootView.getActiveEditSession())
repeatRelativeAddressInReverse: ->
@commandInterpreter.repeatRelativeAddressInReverse(@rootView.getActiveEditor())
@commandInterpreter.repeatRelativeAddressInReverse(@rootView.getActiveEditSession())
setSelectionAsLastRelativeAddress: ->
selection = @rootView.getActiveEditor().getSelectedText()

View File

@@ -5,8 +5,8 @@ module.exports =
class AddressRange extends Address
constructor: (@startAddress, @endAddress) ->
getRange: (editor, currentRange) ->
new Range(@startAddress.getRange(editor, currentRange).start, @endAddress.getRange(editor, currentRange).end)
getRange: (buffer, range) ->
new Range(@startAddress.getRange(buffer, range).start, @endAddress.getRange(buffer, range).end)
isRelative: ->
@startAddress.isRelative() and @endAddress.isRelative()

View File

@@ -2,7 +2,7 @@ Command = require 'command-panel/commands/command'
module.exports =
class Address extends Command
execute: (editor, currentRange) ->
[@getRange(editor, currentRange)]
execute: (project, buffer, range) ->
[@getRange(buffer, range)]
isAddress: -> true

View File

@@ -4,19 +4,17 @@ module.exports =
class CompositeCommand
constructor: (@subcommands) ->
execute: (editor) ->
currentRanges = editor.getSelectedBufferRanges()
execute: (project, activeEditSession) ->
currentRanges = activeEditSession.getSelectedBufferRanges()
for command in @subcommands
newRanges = []
for range in currentRanges
newRanges.push(command.execute(editor, range)...)
newRanges.push(command.execute(project, activeEditSession.buffer, range)...)
currentRanges = newRanges
unless command.preserveSelections
for range in currentRanges
for row in [range.start.row..range.end.row]
editor.destroyFoldsContainingBufferRow(row)
editor.setSelectedBufferRanges(currentRanges)
activeEditSession.setSelectedBufferRanges(currentRanges)
reverse: ->
new CompositeCommand(@subcommands.map (command) -> command.reverse())

View File

@@ -3,7 +3,7 @@ Range = require 'range'
module.exports =
class CurrentSelectionAddress extends Address
getRange: (editor, currentRange) ->
currentRange
getRange: (buffer, range) ->
range
isRelative: -> true

View File

@@ -3,9 +3,8 @@ Range = require 'range'
module.exports =
class EofAddress extends Address
getRange: (editor) ->
lastRow = editor.getLastBufferRow()
column = editor.lineLengthForBufferRow(lastRow)
new Range([lastRow, column], [lastRow, column])
getRange: (buffer, range) ->
eof = buffer.getEofPosition()
new Range(eof, eof)
isRelative: -> false

View File

@@ -10,25 +10,25 @@ class RegexAddress extends Address
@isReversed = isReversed
@regex = new RegExp(pattern)
getRange: (editor, currentRange) ->
rangeBefore = new Range([0, 0], currentRange.start)
rangeAfter = new Range(currentRange.end, editor.getEofPosition())
getRange: (buffer, range) ->
rangeBefore = new Range([0, 0], range.start)
rangeAfter = new Range(range.end, buffer.getEofPosition())
rangeToSearch = if @isReversed then rangeBefore else rangeAfter
rangeToReturn = null
scanMethodName = if @isReversed then "backwardsScanInRange" else "scanInRange"
editor[scanMethodName] @regex, rangeToSearch, (match, range) ->
buffer[scanMethodName] @regex, rangeToSearch, (match, range) ->
rangeToReturn = range
if rangeToReturn
rangeToReturn
else
rangeToSearch = if @isReversed then rangeAfter else rangeBefore
editor[scanMethodName] @regex, rangeToSearch, (match, range) ->
buffer[scanMethodName] @regex, rangeToSearch, (match, range) ->
rangeToReturn = range
rangeToReturn or currentRange
rangeToReturn or range
isRelative: -> true

View File

@@ -8,8 +8,8 @@ class SelectAllMatches extends Command
constructor: (pattern) ->
@regex = new RegExp(pattern, 'g')
execute: (editor, currentRange) ->
execute: (project, buffer, range) ->
rangesToSelect = []
editor.scanInRange @regex, currentRange, (match, range) ->
rangesToSelect.push(range)
buffer.scanInRange @regex, range, (match, matchRange) ->
rangesToSelect.push(matchRange)
rangesToSelect

View File

@@ -10,7 +10,7 @@ class Substitution extends Command
@replacementText = replacementText
@regex = new RegExp(pattern, options.join(''))
execute: (editor, currentRange) ->
editor.scanInRange @regex, currentRange, (match, matchRange, { replace }) =>
execute: (project, buffer, range) ->
buffer.scanInRange @regex, range, (match, matchRange, { replace }) =>
replace(@replacementText)
[currentRange]
[range]

View File

@@ -3,7 +3,7 @@ Range = require 'range'
module.exports =
class ZeroAddress extends Address
getRange: (editor) ->
getRange: ->
new Range([0, 0], [0, 0])
isRelative: -> false