From 9a4487af612f5b155d6e9c045ba40d7be98d0bc3 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Tue, 27 Aug 2024 13:49:17 +0100 Subject: [PATCH] Move parse_command method to Context (#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. --- lib/irb.rb | 31 ++----------------------------- lib/irb/context.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/lib/irb.rb b/lib/irb.rb index 3d45fa89d..213e23117 100644 --- a/lib/irb.rb +++ b/lib/irb.rb @@ -1131,7 +1131,7 @@ def build_statement(code) 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 @@ def build_statement(code) 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 diff --git a/lib/irb/context.rb b/lib/irb/context.rb index 74a08ca69..aa0c60b0e 100644 --- a/lib/irb/context.rb +++ b/lib/irb/context.rb @@ -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 @@ def evaluate_expression(code, line_no) # :nodoc: 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