[ruby/irb] Refactor exit command

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

* Remove unnecessary code from the exit command's implementation

1. The parameters of `IRB.irb_exit` were never used. But there are some
   libraries seem to call it with arguments + it's declared on the top-level
   IRB constant. So I changed the params to anonymous splat instead of removing them.
2. `Context#exit` was completely unnecessary as `IRB.irb_exit` doesn't use
   the `@irb` instance it passes. And since it's (or should be treated as)
   a private method, I simply removed it.
3. The `exit` command doesn't use the status argument it receives at all.
   But to avoid raising errors on usages like `exit 1`, I changed the argument to
   anonymous splat instead removing it.

* Make exit an actual command

* Update readme

https://github.com/ruby/irb/commit/452b543a65
This commit is contained in:
Stan Lo 2024-01-06 17:15:12 +00:00 committed by git
parent d96fe5e4f8
commit 4bdfc9070c
4 changed files with 30 additions and 22 deletions

View File

@ -886,8 +886,8 @@ module IRB
end
# Quits irb
def IRB.irb_exit(irb, ret)
throw :IRB_EXIT, ret
def IRB.irb_exit(*)
throw :IRB_EXIT
end
# Aborts then interrupts irb.

22
lib/irb/cmd/exit.rb Normal file
View File

@ -0,0 +1,22 @@
# frozen_string_literal: true
require_relative "nop"
module IRB
# :stopdoc:
module ExtendCommand
class Exit < Nop
category "IRB"
description "Exit the current irb session."
def execute(*)
IRB.irb_exit
rescue UncaughtThrowError
Kernel.exit
end
end
end
# :startdoc:
end

View File

@ -573,14 +573,6 @@ module IRB
@inspect_method.inspect_value(@last_value)
end
alias __exit__ exit
# Exits the current session, see IRB.irb_exit
def exit(ret = 0)
IRB.irb_exit(@irb, ret)
rescue UncaughtThrowError
super
end
NOPRINTING_IVARS = ["@last_value"] # :nodoc:
NO_INSPECTING_IVARS = ["@irb", "@io"] # :nodoc:
IDNAME_IVARS = ["@prompt_mode"] # :nodoc:

View File

@ -16,15 +16,6 @@ module IRB # :nodoc:
# See #install_alias_method.
OVERRIDE_ALL = 0x02
# Quits the current irb context
#
# +ret+ is the optional signal or message to send to Context#exit
#
# Same as <code>IRB.CurrentContext.exit</code>.
def irb_exit(ret = 0)
irb_context.exit(ret)
end
# Displays current configuration.
#
# Modifying the configuration is achieved by sending a message to IRB.conf.
@ -35,13 +26,16 @@ module IRB # :nodoc:
@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_exit, :Exit, "cmd/exit",
[:exit, OVERRIDE_PRIVATE_ONLY],
[:quit, OVERRIDE_PRIVATE_ONLY],
[:irb_quit, OVERRIDE_PRIVATE_ONLY],
],
[
:irb_current_working_workspace, :CurrentWorkingWorkspace, "cmd/chws",
[:cwws, NO_OVERRIDE],