diff --git a/lib/pry/pry_instance.rb b/lib/pry/pry_instance.rb index 9ccca364c..d1de5c4d5 100644 --- a/lib/pry/pry_instance.rb +++ b/lib/pry/pry_instance.rb @@ -627,7 +627,7 @@ def handle_line(line, options) begin complete_expr = Pry::Code.complete_expression?(@eval_string) rescue SyntaxError => e - output.puts "SyntaxError: #{e.message.sub(/.*syntax error, */m, '')}" + output.puts e.message.gsub(/^.*syntax error, */, "SyntaxError: ") reset_eval_string end diff --git a/spec/syntax_checking_spec.rb b/spec/syntax_checking_spec.rb index ec7f5b36d..f6ad7b520 100644 --- a/spec/syntax_checking_spec.rb +++ b/spec/syntax_checking_spec.rb @@ -23,17 +23,21 @@ end end - ([ + [ ["end"], ["puts )("], ["1 1"], - ["puts :"] - ] + [ + ["puts :"], + # in this case the syntax error is "expecting ')'". ["def", "method(1"], + # in this case the syntax error is "expecting keyword_end". - ["o = Object.new.tap{ def o.render;", "'MEH'", "}"] - ]).compact.each do |foo| + ["o = Object.new.tap{ def o.render;", "'MEH'", "}"], + + # multiple syntax errors reported in one SyntaxException + ["puts {'key'=>'val'}.to_json"] + ].compact.each do |foo| it "should raise an error on invalid syntax like #{foo.inspect}" do redirect_pry_io(InputTester.new(*foo), @str_output) do Pry.start @@ -41,6 +45,20 @@ expect(@str_output.string).to match(/SyntaxError/) end + + it "should display the correct number of errors on invalid syntax like #{foo.inspect}" do + begin + # rubocop:disable Security/Eval + eval(foo.join("\n")) + # rubocop:enable Security/Eval + rescue SyntaxError => e + error_count = e.message.scan(/syntax error/).count + end + expect(error_count).not_to be_nil + + pry_output = mock_pry(*foo) + expect(pry_output.scan(/SyntaxError/).count).to eq(error_count) + end end it "should not intefere with syntax errors explicitly raised" do