2001-04-30 13:38:21 -04:00
|
|
|
#
|
2009-03-05 22:56:38 -05:00
|
|
|
# irb/extend-command.rb - irb extend command
|
2009-07-07 07:36:20 -04:00
|
|
|
# $Release Version: 0.9.6$
|
2001-04-30 13:38:21 -04:00
|
|
|
# $Revision$
|
2005-04-13 11:27:09 -04:00
|
|
|
# by Keiju ISHITSUKA(keiju@ruby-lang.org)
|
2001-04-30 13:38:21 -04:00
|
|
|
#
|
|
|
|
# --
|
|
|
|
#
|
2009-03-05 22:56:38 -05:00
|
|
|
#
|
2001-04-30 13:38:21 -04:00
|
|
|
#
|
|
|
|
module IRB
|
|
|
|
#
|
|
|
|
# IRB extended command
|
|
|
|
#
|
2002-07-09 07:17:17 -04:00
|
|
|
module ExtendCommandBundle
|
|
|
|
EXCB = ExtendCommandBundle
|
2001-04-30 13:38:21 -04:00
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
NO_OVERRIDE = 0
|
|
|
|
OVERRIDE_PRIVATE_ONLY = 0x01
|
|
|
|
OVERRIDE_ALL = 0x02
|
2001-04-30 13:38:21 -04:00
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
def irb_exit(ret = 0)
|
|
|
|
irb_context.exit(ret)
|
2001-04-30 13:38:21 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def irb_context
|
2002-07-09 07:17:17 -04:00
|
|
|
IRB.CurrentContext
|
2001-04-30 13:38:21 -04:00
|
|
|
end
|
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
@ALIASES = [
|
|
|
|
[:context, :irb_context, NO_OVERRIDE],
|
|
|
|
[:conf, :irb_context, NO_OVERRIDE],
|
|
|
|
[:irb_quit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
|
|
|
|
[:exit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
|
|
|
|
[:quit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
|
|
|
|
]
|
|
|
|
|
|
|
|
@EXTEND_COMMANDS = [
|
|
|
|
[:irb_current_working_workspace, :CurrentWorkingWorkspace, "irb/cmd/chws",
|
|
|
|
[:irb_print_working_workspace, OVERRIDE_ALL],
|
|
|
|
[:irb_cwws, OVERRIDE_ALL],
|
|
|
|
[:irb_pwws, OVERRIDE_ALL],
|
|
|
|
# [:irb_cww, OVERRIDE_ALL],
|
|
|
|
# [:irb_pww, OVERRIDE_ALL],
|
|
|
|
[:cwws, NO_OVERRIDE],
|
|
|
|
[:pwws, NO_OVERRIDE],
|
|
|
|
# [:cww, NO_OVERRIDE],
|
|
|
|
# [:pww, NO_OVERRIDE],
|
|
|
|
[:irb_current_working_binding, OVERRIDE_ALL],
|
|
|
|
[:irb_print_working_binding, OVERRIDE_ALL],
|
|
|
|
[:irb_cwb, OVERRIDE_ALL],
|
|
|
|
[:irb_pwb, OVERRIDE_ALL],
|
|
|
|
# [:cwb, NO_OVERRIDE],
|
|
|
|
# [:pwb, NO_OVERRIDE]
|
|
|
|
],
|
|
|
|
[:irb_change_workspace, :ChangeWorkspace, "irb/cmd/chws",
|
|
|
|
[:irb_chws, OVERRIDE_ALL],
|
|
|
|
# [:irb_chw, OVERRIDE_ALL],
|
|
|
|
[:irb_cws, OVERRIDE_ALL],
|
|
|
|
# [:irb_cw, OVERRIDE_ALL],
|
|
|
|
[:chws, NO_OVERRIDE],
|
|
|
|
# [:chw, NO_OVERRIDE],
|
|
|
|
[:cws, NO_OVERRIDE],
|
|
|
|
# [:cw, NO_OVERRIDE],
|
|
|
|
[:irb_change_binding, OVERRIDE_ALL],
|
|
|
|
[:irb_cb, OVERRIDE_ALL],
|
|
|
|
[:cb, NO_OVERRIDE]],
|
|
|
|
|
|
|
|
[:irb_workspaces, :Workspaces, "irb/cmd/pushws",
|
|
|
|
[:workspaces, NO_OVERRIDE],
|
|
|
|
[:irb_bindings, OVERRIDE_ALL],
|
|
|
|
[:bindings, NO_OVERRIDE]],
|
|
|
|
[:irb_push_workspace, :PushWorkspace, "irb/cmd/pushws",
|
|
|
|
[:irb_pushws, OVERRIDE_ALL],
|
|
|
|
# [:irb_pushw, OVERRIDE_ALL],
|
|
|
|
[:pushws, NO_OVERRIDE],
|
|
|
|
# [:pushw, NO_OVERRIDE],
|
|
|
|
[:irb_push_binding, OVERRIDE_ALL],
|
|
|
|
[:irb_pushb, OVERRIDE_ALL],
|
|
|
|
[:pushb, NO_OVERRIDE]],
|
|
|
|
[:irb_pop_workspace, :PopWorkspace, "irb/cmd/pushws",
|
|
|
|
[:irb_popws, OVERRIDE_ALL],
|
|
|
|
# [:irb_popw, OVERRIDE_ALL],
|
|
|
|
[:popws, NO_OVERRIDE],
|
|
|
|
# [:popw, NO_OVERRIDE],
|
|
|
|
[:irb_pop_binding, OVERRIDE_ALL],
|
|
|
|
[:irb_popb, OVERRIDE_ALL],
|
|
|
|
[:popb, NO_OVERRIDE]],
|
|
|
|
|
|
|
|
[:irb_load, :Load, "irb/cmd/load"],
|
|
|
|
[:irb_require, :Require, "irb/cmd/load"],
|
2009-03-05 22:56:38 -05:00
|
|
|
[:irb_source, :Source, "irb/cmd/load",
|
2002-07-09 07:17:17 -04:00
|
|
|
[:source, NO_OVERRIDE]],
|
|
|
|
|
|
|
|
[:irb, :IrbCommand, "irb/cmd/subirb"],
|
2009-03-05 22:56:38 -05:00
|
|
|
[:irb_jobs, :Jobs, "irb/cmd/subirb",
|
2002-07-09 07:17:17 -04:00
|
|
|
[:jobs, NO_OVERRIDE]],
|
2009-03-05 22:56:38 -05:00
|
|
|
[:irb_fg, :Foreground, "irb/cmd/subirb",
|
2002-07-09 07:17:17 -04:00
|
|
|
[:fg, NO_OVERRIDE]],
|
2009-03-05 22:56:38 -05:00
|
|
|
[:irb_kill, :Kill, "irb/cmd/subirb",
|
2002-07-09 07:17:17 -04:00
|
|
|
[:kill, OVERRIDE_PRIVATE_ONLY]],
|
2004-02-05 19:16:50 -05:00
|
|
|
|
|
|
|
[:irb_help, :Help, "irb/cmd/help",
|
|
|
|
[:help, NO_OVERRIDE]],
|
2005-04-13 11:27:09 -04:00
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
]
|
|
|
|
|
2006-08-08 11:17:06 -04:00
|
|
|
def self.install_extend_commands
|
2002-07-09 07:17:17 -04:00
|
|
|
for args in @EXTEND_COMMANDS
|
2002-07-29 02:14:10 -04:00
|
|
|
def_extend_command(*args)
|
2001-04-30 13:38:21 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2008-06-04 05:37:38 -04:00
|
|
|
# aliases = [commands_alias, flag], ...
|
2006-08-08 11:17:06 -04:00
|
|
|
def self.def_extend_command(cmd_name, cmd_class, load_file = nil, *aliases)
|
2002-07-09 07:17:17 -04:00
|
|
|
case cmd_class
|
|
|
|
when Symbol
|
|
|
|
cmd_class = cmd_class.id2name
|
|
|
|
when String
|
|
|
|
when Class
|
|
|
|
cmd_class = cmd_class.name
|
|
|
|
end
|
2001-04-30 13:38:21 -04:00
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
if load_file
|
2009-12-04 20:18:28 -05:00
|
|
|
line = __LINE__; eval %[
|
2002-07-09 07:17:17 -04:00
|
|
|
def #{cmd_name}(*opts, &b)
|
|
|
|
require "#{load_file}"
|
2008-08-25 09:41:11 -04:00
|
|
|
arity = ExtendCommand::#{cmd_class}.instance_method(:execute).arity
|
2009-12-04 20:18:28 -05:00
|
|
|
args = (1..(arity < 0 ? ~arity : arity)).map {|i| "arg" + i.to_s }
|
2008-08-25 09:41:11 -04:00
|
|
|
args << "*opts" if arity < 0
|
|
|
|
args << "&block"
|
|
|
|
args = args.join(", ")
|
2009-12-04 20:18:28 -05:00
|
|
|
line = __LINE__; eval %[
|
2008-08-25 09:41:11 -04:00
|
|
|
def #{cmd_name}(\#{args})
|
|
|
|
ExtendCommand::#{cmd_class}.execute(irb_context, \#{args})
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
2009-12-04 20:18:28 -05:00
|
|
|
], nil, __FILE__, line
|
2002-07-09 07:17:17 -04:00
|
|
|
send :#{cmd_name}, *opts, &b
|
|
|
|
end
|
2009-12-04 20:18:28 -05:00
|
|
|
], nil, __FILE__, line
|
2002-07-09 07:17:17 -04:00
|
|
|
else
|
2009-12-04 20:18:28 -05:00
|
|
|
line = __LINE__; eval %[
|
2002-07-09 07:17:17 -04:00
|
|
|
def #{cmd_name}(*opts, &b)
|
|
|
|
ExtendCommand::#{cmd_class}.execute(irb_context, *opts, &b)
|
|
|
|
end
|
2009-12-04 20:18:28 -05:00
|
|
|
], nil, __FILE__, line
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
2001-04-30 13:38:21 -04:00
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
for ali, flag in aliases
|
|
|
|
@ALIASES.push [ali, cmd_name, flag]
|
|
|
|
end
|
2001-04-30 13:38:21 -04:00
|
|
|
end
|
|
|
|
|
2002-07-09 07:17:17 -04:00
|
|
|
# override = {NO_OVERRIDE, OVERRIDE_PRIVATE_ONLY, OVERRIDE_ALL}
|
|
|
|
def install_alias_method(to, from, override = NO_OVERRIDE)
|
2001-04-30 13:38:21 -04:00
|
|
|
to = to.id2name unless to.kind_of?(String)
|
|
|
|
from = from.id2name unless from.kind_of?(String)
|
|
|
|
|
|
|
|
if override == OVERRIDE_ALL or
|
|
|
|
(override == OVERRIDE_PRIVATE_ONLY) && !respond_to?(to) or
|
2002-07-09 07:17:17 -04:00
|
|
|
(override == NO_OVERRIDE) && !respond_to?(to, true)
|
2001-04-30 13:38:21 -04:00
|
|
|
target = self
|
2009-12-04 20:18:28 -05:00
|
|
|
(class << self; self; end).instance_eval{
|
2009-03-05 22:56:38 -05:00
|
|
|
if target.respond_to?(to, true) &&
|
2002-07-09 07:17:17 -04:00
|
|
|
!target.respond_to?(EXCB.irb_original_method_name(to), true)
|
2009-03-05 22:56:38 -05:00
|
|
|
alias_method(EXCB.irb_original_method_name(to), to)
|
2001-04-30 13:38:21 -04:00
|
|
|
end
|
|
|
|
alias_method to, from
|
|
|
|
}
|
|
|
|
else
|
|
|
|
print "irb: warn: can't alias #{to} from #{from}.\n"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.irb_original_method_name(method_name)
|
|
|
|
"irb_" + method_name + "_org"
|
|
|
|
end
|
2002-07-09 07:17:17 -04:00
|
|
|
|
2006-08-08 11:17:06 -04:00
|
|
|
def self.extend_object(obj)
|
2009-12-04 20:18:28 -05:00
|
|
|
unless (class << obj; ancestors; end).include?(EXCB)
|
2002-07-09 07:17:17 -04:00
|
|
|
super
|
|
|
|
for ali, com, flg in @ALIASES
|
|
|
|
obj.install_alias_method(ali, com, flg)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
install_extend_commands
|
|
|
|
end
|
|
|
|
|
|
|
|
# extension support for Context
|
|
|
|
module ContextExtender
|
|
|
|
CE = ContextExtender
|
|
|
|
|
|
|
|
@EXTEND_COMMANDS = [
|
|
|
|
[:eval_history=, "irb/ext/history.rb"],
|
|
|
|
[:use_tracer=, "irb/ext/tracer.rb"],
|
|
|
|
[:math_mode=, "irb/ext/math-mode.rb"],
|
|
|
|
[:use_loader=, "irb/ext/use-loader.rb"],
|
2005-04-13 11:27:09 -04:00
|
|
|
[:save_history=, "irb/ext/save-history.rb"],
|
2002-07-09 07:17:17 -04:00
|
|
|
]
|
|
|
|
|
2006-08-08 11:17:06 -04:00
|
|
|
def self.install_extend_commands
|
2002-07-09 07:17:17 -04:00
|
|
|
for args in @EXTEND_COMMANDS
|
2002-07-29 02:14:10 -04:00
|
|
|
def_extend_command(*args)
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2006-08-08 11:17:06 -04:00
|
|
|
def self.def_extend_command(cmd_name, load_file, *aliases)
|
2009-12-04 20:18:28 -05:00
|
|
|
line = __LINE__; Context.module_eval %[
|
2002-07-09 07:17:17 -04:00
|
|
|
def #{cmd_name}(*opts, &b)
|
2005-01-16 17:09:29 -05:00
|
|
|
Context.module_eval {remove_method(:#{cmd_name})}
|
2002-07-09 07:17:17 -04:00
|
|
|
require "#{load_file}"
|
|
|
|
send :#{cmd_name}, *opts, &b
|
|
|
|
end
|
|
|
|
for ali in aliases
|
|
|
|
alias_method ali, cmd_name
|
|
|
|
end
|
2009-12-04 20:18:28 -05:00
|
|
|
], __FILE__, line
|
2002-07-09 07:17:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
CE.install_extend_commands
|
2001-04-30 13:38:21 -04:00
|
|
|
end
|
2005-04-13 11:27:09 -04:00
|
|
|
|
|
|
|
module MethodExtender
|
|
|
|
def def_pre_proc(base_method, extend_method)
|
|
|
|
base_method = base_method.to_s
|
|
|
|
extend_method = extend_method.to_s
|
|
|
|
|
|
|
|
alias_name = new_alias_name(base_method)
|
|
|
|
module_eval %[
|
|
|
|
alias_method alias_name, base_method
|
|
|
|
def #{base_method}(*opts)
|
|
|
|
send :#{extend_method}, *opts
|
|
|
|
send :#{alias_name}, *opts
|
|
|
|
end
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
def def_post_proc(base_method, extend_method)
|
|
|
|
base_method = base_method.to_s
|
|
|
|
extend_method = extend_method.to_s
|
|
|
|
|
|
|
|
alias_name = new_alias_name(base_method)
|
|
|
|
module_eval %[
|
|
|
|
alias_method alias_name, base_method
|
|
|
|
def #{base_method}(*opts)
|
|
|
|
send :#{alias_name}, *opts
|
|
|
|
send :#{extend_method}, *opts
|
|
|
|
end
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
# return #{prefix}#{name}#{postfix}<num>
|
|
|
|
def new_alias_name(name, prefix = "__alias_of__", postfix = "__")
|
|
|
|
base_name = "#{prefix}#{name}#{postfix}"
|
|
|
|
all_methods = instance_methods(true) + private_instance_methods(true)
|
|
|
|
same_methods = all_methods.grep(/^#{Regexp.quote(base_name)}[0-9]*$/)
|
|
|
|
return base_name if same_methods.empty?
|
|
|
|
no = same_methods.size
|
|
|
|
while !same_methods.include?(alias_name = base_name + no)
|
|
|
|
no += 1
|
|
|
|
end
|
|
|
|
alias_name
|
|
|
|
end
|
|
|
|
end
|
2001-04-30 13:38:21 -04:00
|
|
|
end
|
2002-07-09 07:17:17 -04:00
|
|
|
|