[ruby/irb] Unroll extension method generation

(https://github.com/ruby/irb/pull/882)

* Unroll extension method generation

Given we only have 2 remaining extension setter methods, both of which
only take 1 argument and don't have any alias, the current method generation
logic is overly complicated.

This commit simplifies the method generation logic by simply defining
the methods directly in the `IRB::Context` class.

* Fix use_loader extension

https://github.com/ruby/irb/commit/67eba5401b
This commit is contained in:
Stan Lo 2024-02-23 18:02:14 +08:00 committed by git
parent f403660805
commit 37dde6e2f8
3 changed files with 14 additions and 42 deletions

View File

@ -315,44 +315,4 @@ module IRB # :nodoc:
install_extend_commands
end
# Extends methods for the Context module
module ContextExtender
CE = ContextExtender # :nodoc:
@EXTEND_COMMANDS = [
[:eval_history=, "ext/eval_history.rb"],
[:use_loader=, "ext/use-loader.rb"],
]
# Installs the default context extensions as irb commands:
#
# Context#eval_history=:: +irb/ext/history.rb+
# Context#use_tracer=:: +irb/ext/tracer.rb+
# Context#use_loader=:: +irb/ext/use-loader.rb+
def self.install_extend_commands
for args in @EXTEND_COMMANDS
def_extend_command(*args)
end
end
# Evaluate the given +command+ from the given +load_file+ on the Context
# module.
#
# Will also define any given +aliases+ for the method.
def self.def_extend_command(cmd_name, load_file, *aliases)
line = __LINE__; Context.module_eval %[
def #{cmd_name}(*opts, &b)
Context.module_eval {remove_method(:#{cmd_name})}
require_relative "#{load_file}"
__send__ :#{cmd_name}, *opts, &b
end
for ali in aliases
alias_method ali, cmd_name
end
], __FILE__, line
end
CE.install_extend_commands
end
end

View File

@ -166,6 +166,18 @@ module IRB
IRB.conf[:USE_TRACER] = val
end
def eval_history=(val)
self.class.remove_method(__method__)
require_relative "ext/eval_history"
__send__(__method__, val)
end
def use_loader=(val)
self.class.remove_method(__method__)
require_relative "ext/use-loader"
__send__(__method__, val)
end
private def build_completor
completor_type = IRB.conf[:COMPLETOR]
case completor_type

View File

@ -4,7 +4,7 @@
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
#
require_relative "../cmd/load"
require_relative "../command/load"
require_relative "loader"
class Object
@ -49,7 +49,7 @@ module IRB
if IRB.conf[:USE_LOADER] != opt
IRB.conf[:USE_LOADER] = opt
if opt
if !$".include?("irb/cmd/load")
if !$".include?("irb/command/load")
end
(class<<@workspace.main;self;end).instance_eval {
alias_method :load, :irb_load