diff --git a/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb b/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb index 959675d..cc8324b 100644 --- a/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb +++ b/lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter.rb @@ -80,6 +80,8 @@ def generate_id(example) def adjust_backtrace(backtrace) # Correct the backtrace entry so that vscode recognized it as a link to open parts = backtrace.split(":", 3) + return backtrace if parts.length < 2 + parts[0].sub(/^\./, "file://" + File.expand_path(".")) + ":" + parts[1] + " : " + (parts[2] || "") end end diff --git a/spec/fixtures/chained_exception_spec.rb b/spec/fixtures/chained_exception_spec.rb new file mode 100644 index 0000000..1d22386 --- /dev/null +++ b/spec/fixtures/chained_exception_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require_relative "../../lib/ruby_lsp/ruby_lsp_rspec/rspec_formatter" + +RSpec.configure do |config| + config.formatter = "RubyLsp::RSpec::RSpecFormatter" +end + +RSpec.describe "ChainedExceptionExample" do + it "fails with a chained error" do + raise "secondary error" + rescue + raise "primary error" + end +end diff --git a/spec/rspec_formatter_spec.rb b/spec/rspec_formatter_spec.rb index 010986b..43cdbaa 100644 --- a/spec/rspec_formatter_spec.rb +++ b/spec/rspec_formatter_spec.rb @@ -154,6 +154,15 @@ expect(events).to match(expected) end + it "does not crash when formatting backtrace from chained exceptions" do + fixture_path = File.expand_path("spec/fixtures/chained_exception_spec.rb") + + stdout, stderr, = Open3.capture3("bundle", "exec", "rspec", fixture_path) + + output = stdout + stderr + expect(output).not_to include("adjust_backtrace") + end + describe "RubyLsp::RSpec::RSpecFormatter notifications" do let(:output) { StringIO.new } let(:formatter) { RubyLsp::RSpec::RSpecFormatter.new(output) }