diff --git a/lib/iruby/backend.rb b/lib/iruby/backend.rb index 5cde735..e08909b 100644 --- a/lib/iruby/backend.rb +++ b/lib/iruby/backend.rb @@ -57,7 +57,7 @@ class PryBackend def initialize require 'pry' - Pry.memory_size = 3 + Pry.memory_size = 3 Pry.pager = false # Don't use the pager Pry.print = proc {|output, value|} # No result printing Pry.exception_handler = proc {|output, exception, _| } @@ -72,11 +72,21 @@ def eval(code, store_history) reset raise SystemExit end - unless @pry.eval_string.empty? + + # Pry::Code.complete_expression? return false + if !@pry.eval_string.empty? syntax_error = @pry.eval_string @pry.reset_eval_string - @pry.evaluate_ruby syntax_error + @pry.evaluate_ruby(syntax_error) + + # Pry::Code.complete_expression? raise SyntaxError + # evaluate again for current line number + elsif @pry.last_result_is_exception? && + @pry.last_exception.is_a?(SyntaxError) && + @pry.last_exception.is_a?(Pry::UserError) + @pry.evaluate_ruby(code) end + raise @pry.last_exception if @pry.last_result_is_exception? @pry.push_initial_binding unless @pry.current_binding # ensure that we have a binding @pry.last_result diff --git a/lib/iruby/kernel.rb b/lib/iruby/kernel.rb index cb39751..c43cabd 100644 --- a/lib/iruby/kernel.rb +++ b/lib/iruby/kernel.rb @@ -111,7 +111,8 @@ def execute_request(msg) end def error_content(e) - backtrace = e.backtrace[0..e.backtrace.rindex{|line| line.start_with?(@backend.eval_path)}] + rindex = e.backtrace.rindex{|line| line.start_with?(@backend.eval_path)} || -1 + backtrace = SyntaxError === e && rindex == -1 ? [] : e.backtrace[0..rindex] { ename: e.class.to_s, evalue: e.message, traceback: ["#{RED}#{e.class}#{RESET}: #{e.message}", *backtrace] }