зеркало из https://github.com/github/ruby.git
[ruby/irb] Allow assigning and using local variable name conflicting
with command (https://github.com/ruby/irb/pull/961) https://github.com/ruby/irb/commit/00603d470f
This commit is contained in:
Родитель
c4baf3b3c0
Коммит
de2d9c8e22
|
@ -1138,6 +1138,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
|
||||
|
@ -1149,6 +1151,12 @@ module IRB
|
|||
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
|
||||
|
|
|
@ -145,5 +145,50 @@ module TestIRB
|
|||
assert_include(output, "No description provided.")
|
||||
assert_not_include(output, "Maybe IRB bug")
|
||||
end
|
||||
|
||||
def test_command_name_local_variable
|
||||
write_ruby <<~RUBY
|
||||
require "irb/command"
|
||||
|
||||
class FooBarCommand < IRB::Command::Base
|
||||
category 'CommandTest'
|
||||
description 'test'
|
||||
def execute(arg)
|
||||
puts "arg=\#{arg.inspect}"
|
||||
end
|
||||
end
|
||||
|
||||
IRB::Command.register(:foo_bar, FooBarCommand)
|
||||
|
||||
binding.irb
|
||||
RUBY
|
||||
|
||||
output = run_ruby_file do
|
||||
type "binding.irb"
|
||||
type "foo_bar == 1 || 1"
|
||||
type "foo_bar =~ /2/ || 2"
|
||||
type "exit"
|
||||
type "binding.irb"
|
||||
type "foo_bar = '3'; foo_bar"
|
||||
type "foo_bar == 4 || '4'"
|
||||
type "foo_bar =~ /5/ || '5'"
|
||||
type "exit"
|
||||
type "binding.irb"
|
||||
type "foo_bar ||= '6'; foo_bar"
|
||||
type "foo_bar == 7 || '7'"
|
||||
type "foo_bar =~ /8/ || '8'"
|
||||
type "exit"
|
||||
type "exit"
|
||||
end
|
||||
|
||||
assert_include(output, 'arg="== 1 || 1"')
|
||||
assert_include(output, 'arg="=~ /2/ || 2"')
|
||||
assert_include(output, '=> "3"')
|
||||
assert_include(output, '=> "4"')
|
||||
assert_include(output, '=> "5"')
|
||||
assert_include(output, '=> "6"')
|
||||
assert_include(output, '=> "7"')
|
||||
assert_include(output, '=> "8"')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче