diff options
author | Kyrylo Silin <silin@kyrylo.org> | 2020-03-22 00:35:33 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-22 00:35:33 +0800 |
commit | e9ad44799670db0543e285f24372908b009b68ab (patch) | |
tree | 824683180ee5da0ab33f8bc4698d358097bd53f3 | |
parent | 2208ed30f246b4dbeb512745021e00052781ece6 (diff) | |
parent | f6736d526260b2aa9f50b61150a67fcfa2045893 (diff) | |
download | pry-e9ad44799670db0543e285f24372908b009b68ab.tar.gz |
Merge pull request #2117 from barrettkingram/fix-syntax-error-display
Display all syntax error messages when catching SyntaxException
-rw-r--r-- | lib/pry/pry_instance.rb | 2 | ||||
-rw-r--r-- | spec/syntax_checking_spec.rb | 28 |
2 files changed, 24 insertions, 6 deletions
diff --git a/lib/pry/pry_instance.rb b/lib/pry/pry_instance.rb index 9ccca364..d1de5c4d 100644 --- a/lib/pry/pry_instance.rb +++ b/lib/pry/pry_instance.rb @@ -627,7 +627,7 @@ class Pry 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 ec7f5b36..ca75ba9f 100644 --- a/spec/syntax_checking_spec.rb +++ b/spec/syntax_checking_spec.rb @@ -23,17 +23,21 @@ describe Pry do 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 @@ describe Pry do expect(@str_output.string).to match(/SyntaxError/) end + + it "should display 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 |