зеркало из https://github.com/github/ruby.git
[ruby/irb] Move parse_command method to Context
(https://github.com/ruby/irb/pull/993) Since Context dictates whether a line is a command or an expression, moving the parse_command method to Context makes the relationship more explicit. https://github.com/ruby/irb/commit/9a4487af61
This commit is contained in:
Родитель
a431f4ecc4
Коммит
87fa75c5db
31
lib/irb.rb
31
lib/irb.rb
|
@ -1131,7 +1131,7 @@ module IRB
|
|||
end
|
||||
|
||||
code.force_encoding(@context.io.encoding)
|
||||
if (command, arg = parse_command(code))
|
||||
if (command, arg = @context.parse_command(code))
|
||||
command_class = Command.load_command(command)
|
||||
Statement::Command.new(code, command_class, arg)
|
||||
else
|
||||
|
@ -1140,35 +1140,8 @@ module IRB
|
|||
end
|
||||
end
|
||||
|
||||
ASSIGN_OPERATORS_REGEXP = Regexp.union(%w[= += -= *= /= %= **= &= |= &&= ||= ^= <<= >>=])
|
||||
|
||||
def parse_command(code)
|
||||
command_name, arg = code.strip.split(/\s+/, 2)
|
||||
return unless code.lines.size == 1 && command_name
|
||||
|
||||
arg ||= ''
|
||||
command = command_name.to_sym
|
||||
# Command aliases are always command. example: $, @
|
||||
if (alias_name = @context.command_aliases[command])
|
||||
return [alias_name, arg]
|
||||
end
|
||||
|
||||
# Assignment-like expression is not a command
|
||||
return if arg.start_with?(ASSIGN_OPERATORS_REGEXP) && !arg.start_with?(/==|=~/)
|
||||
|
||||
# Local variable have precedence over command
|
||||
return if @context.local_variables.include?(command)
|
||||
|
||||
# Check visibility
|
||||
public_method = !!Kernel.instance_method(:public_method).bind_call(@context.main, command) rescue false
|
||||
private_method = !public_method && !!Kernel.instance_method(:method).bind_call(@context.main, command) rescue false
|
||||
if Command.execute_as_command?(command, public_method: public_method, private_method: private_method)
|
||||
[command, arg]
|
||||
end
|
||||
end
|
||||
|
||||
def command?(code)
|
||||
!!parse_command(code)
|
||||
!!@context.parse_command(code)
|
||||
end
|
||||
|
||||
def configure_io
|
||||
|
|
|
@ -13,6 +13,7 @@ module IRB
|
|||
# A class that wraps the current state of the irb session, including the
|
||||
# configuration of IRB.conf.
|
||||
class Context
|
||||
ASSIGN_OPERATORS_REGEXP = Regexp.union(%w[= += -= *= /= %= **= &= |= &&= ||= ^= <<= >>=])
|
||||
# Creates a new IRB context.
|
||||
#
|
||||
# The optional +input_method+ argument:
|
||||
|
@ -635,6 +636,31 @@ module IRB
|
|||
result
|
||||
end
|
||||
|
||||
def parse_command(code)
|
||||
command_name, arg = code.strip.split(/\s+/, 2)
|
||||
return unless code.lines.size == 1 && command_name
|
||||
|
||||
arg ||= ''
|
||||
command = command_name.to_sym
|
||||
# Command aliases are always command. example: $, @
|
||||
if (alias_name = command_aliases[command])
|
||||
return [alias_name, arg]
|
||||
end
|
||||
|
||||
# Assignment-like expression is not a command
|
||||
return if arg.start_with?(ASSIGN_OPERATORS_REGEXP) && !arg.start_with?(/==|=~/)
|
||||
|
||||
# Local variable have precedence over command
|
||||
return if local_variables.include?(command)
|
||||
|
||||
# Check visibility
|
||||
public_method = !!Kernel.instance_method(:public_method).bind_call(main, command) rescue false
|
||||
private_method = !public_method && !!Kernel.instance_method(:method).bind_call(main, command) rescue false
|
||||
if Command.execute_as_command?(command, public_method: public_method, private_method: private_method)
|
||||
[command, arg]
|
||||
end
|
||||
end
|
||||
|
||||
def inspect_last_value # :nodoc:
|
||||
@inspect_method.inspect_value(@last_value)
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче