diff --git a/lib/irb.rb b/lib/irb.rb index 839115d64..8aaefb275 100644 --- a/lib/irb.rb +++ b/lib/irb.rb @@ -570,7 +570,8 @@ def eval_input is_assignment = assignment_expression?(line) evaluate_line(line, line_no) - if @context.echo? + # Don't echo if the line ends with a semicolon + if @context.echo? && !line.match?(/;\s*\z/) if is_assignment if @context.echo_on_assignment? output_value(@context.echo_on_assignment? == :truncate) diff --git a/test/irb/test_evaluation.rb b/test/irb/test_evaluation.rb new file mode 100644 index 000000000..adb69b206 --- /dev/null +++ b/test/irb/test_evaluation.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require "tempfile" + +require_relative "helper" + +module TestIRB + class EchoingTest < IntegrationTestCase + def test_irb_echos_by_default + write_ruby <<~'RUBY' + binding.irb + RUBY + + output = run_ruby_file do + type "123123" + type "exit" + end + + assert_include(output, "=> 123123") + end + + def test_irb_doesnt_echo_line_with_semicolon + write_ruby <<~'RUBY' + binding.irb + RUBY + + output = run_ruby_file do + type "123123;" + type "123123 ;" + type "123123; " + type <<~RUBY + if true + 123123 + end; + RUBY + type "'evaluation ends'" + type "exit" + end + + assert_include(output, "=> \"evaluation ends\"") + assert_not_include(output, "=> 123123") + end + end +end diff --git a/test/irb/yamatanooroti/test_rendering.rb b/test/irb/yamatanooroti/test_rendering.rb index 420339c45..e146ee490 100644 --- a/test/irb/yamatanooroti/test_rendering.rb +++ b/test/irb/yamatanooroti/test_rendering.rb @@ -143,7 +143,6 @@ class A def b; self; end; def c; true; end; end; irb(main):016:0> irb(main):017:0> irb(main):018:0> class A def b; self; end; def c; true; end; end; - => :c irb(main):019:0> a = A.new => # irb(main):020:0> a