Skip to content

Commit

Permalink
Make backtrace_location keyword work
Browse files Browse the repository at this point in the history
We had to keep backtrace_location before opts is overwritten.
  • Loading branch information
mame committed Aug 10, 2022
1 parent 22d1dd7 commit 2735e46
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/error_highlight/base.rb
Expand Up @@ -26,9 +26,9 @@ def self.spot(obj, **opts)
case obj
when Exception
exc = obj
loc = opts[:backtrace_location]
opts = { point_type: opts.fetch(:point_type, :name) }

loc = opts[:backtrace_location]
unless loc
case exc
when TypeError, ArgumentError
Expand All @@ -44,6 +44,8 @@ def self.spot(obj, **opts)
opts[:name] = exc.name if NameError === obj
end

return nil unless Thread::Backtrace::Location === loc

node = RubyVM::AbstractSyntaxTree.of(loc, keep_script_lines: true)

Spotter.new(node, **opts).spot
Expand Down
26 changes: 26 additions & 0 deletions test/test_error_highlight.rb
Expand Up @@ -1231,4 +1231,30 @@ def test_spoofed_filename
end
end
end

def raise_name_error
1.time
end

def test_spot_with_backtrace_location
lineno = __LINE__
begin
raise_name_error
rescue NameError => exc
end

spot = ErrorHighlight.spot(exc).except(:script_lines)
assert_equal(lineno - 4, spot[:first_lineno])
assert_equal(lineno - 4, spot[:last_lineno])
assert_equal(5, spot[:first_column])
assert_equal(10, spot[:last_column])
assert_equal(" 1.time\n", spot[:snippet])

spot = ErrorHighlight.spot(exc, backtrace_location: exc.backtrace_locations[1]).except(:script_lines)
assert_equal(lineno + 2, spot[:first_lineno])
assert_equal(lineno + 2, spot[:last_lineno])
assert_equal(6, spot[:first_column])
assert_equal(22, spot[:last_column])
assert_equal(" raise_name_error\n", spot[:snippet])
end
end

0 comments on commit 2735e46

Please sign in to comment.