summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Lo <[email protected]>2023-08-29 19:08:15 +0100
committergit <[email protected]>2023-08-29 18:36:16 +0000
commitf37f357e808a7435f56946cd603a333feba7691b (patch)
tree19b6c5c33b5883898e28df0f5df0cd155c0ae658
parentc58561b5e3f597867a6e62f451a77ea27a6b9150 (diff)
[ruby/irb] Improve help/show_cmds message during debugger
integration (https://github.com/ruby/irb/pull/693) * `help` should display debugger's help during irb:rdbg session * Update `show_cmds`'s output when in irb:rdbg session https://github.com/ruby/irb/commit/4029c2e564
-rw-r--r--lib/irb/cmd/show_cmds.rb15
-rw-r--r--lib/irb/statement.rb4
-rw-r--r--test/irb/test_debug_cmd.rb33
3 files changed, 51 insertions, 1 deletions
diff --git a/lib/irb/cmd/show_cmds.rb b/lib/irb/cmd/show_cmds.rb
index cef6254ca0..7d6b3ec266 100644
--- a/lib/irb/cmd/show_cmds.rb
+++ b/lib/irb/cmd/show_cmds.rb
@@ -15,6 +15,16 @@ module IRB
def execute(*args)
commands_info = IRB::ExtendCommandBundle.all_commands_info
commands_grouped_by_categories = commands_info.group_by { |cmd| cmd[:category] }
+
+ if irb_context.with_debugger
+ # Remove the original "Debugging" category
+ commands_grouped_by_categories.delete("Debugging")
+ # Remove the `help` command as it's delegated to the debugger
+ commands_grouped_by_categories["Context"].delete_if { |cmd| cmd[:display_name] == :help }
+ # Add an empty "Debugging (from debug.gem)" category at the end
+ commands_grouped_by_categories["Debugging (from debug.gem)"] = []
+ end
+
longest_cmd_name_length = commands_info.map { |c| c[:display_name].length }.max
output = StringIO.new
@@ -29,6 +39,11 @@ module IRB
output.puts
end
+ # Append the debugger help at the end
+ if irb_context.with_debugger
+ output.puts DEBUGGER__.help
+ end
+
Pager.page_content(output.string)
end
end
diff --git a/lib/irb/statement.rb b/lib/irb/statement.rb
index 9493c3ffb1..b12110600c 100644
--- a/lib/irb/statement.rb
+++ b/lib/irb/statement.rb
@@ -60,7 +60,9 @@ module IRB
end
def should_be_handled_by_debugger?
- IRB::ExtendCommand::DebugCommand > @command_class
+ require_relative 'cmd/help'
+ require_relative 'cmd/debug'
+ IRB::ExtendCommand::DebugCommand > @command_class || IRB::ExtendCommand::Help == @command_class
end
def evaluable_code
diff --git a/test/irb/test_debug_cmd.rb b/test/irb/test_debug_cmd.rb
index a99f7a943f..d669c174e6 100644
--- a/test/irb/test_debug_cmd.rb
+++ b/test/irb/test_debug_cmd.rb
@@ -331,6 +331,39 @@ module TestIRB
assert_include(output, "InputMethod: RelineInputMethod")
end
+ def test_help_command_is_delegated_to_the_debugger
+ write_ruby <<~'ruby'
+ binding.irb
+ ruby
+
+ output = run_ruby_file do
+ type "debug"
+ type "help"
+ type "continue"
+ end
+
+ assert_include(output, "### Frame control")
+ end
+
+ def test_show_cmds_display_different_content_when_debugger_is_enabled
+ write_ruby <<~'ruby'
+ # disable pager
+ STDIN.singleton_class.define_method(:tty?) { false }
+ binding.irb
+ ruby
+
+ output = run_ruby_file do
+ type "debug"
+ type "show_cmds"
+ type "continue"
+ end
+
+ # IRB's commands should still be listed
+ assert_match(/show_cmds\s+List all available commands and their description\./, output)
+ # debug gem's commands should be appended at the end
+ assert_match(/Debugging \(from debug\.gem\)\s+### Control flow/, output)
+ end
+
def test_input_is_evaluated_in_the_context_of_the_current_thread
write_ruby <<~'ruby'
current_thread = Thread.current