diff options
author | Yusuke Endoh <mame@ruby-lang.org> | 2022-08-10 21:17:04 +0900 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2022-08-10 21:19:10 +0900 |
commit | 3a58009066049f9af09ea3171cecab88ba0d9f1c (patch) | |
tree | 20a90bbc117f2b57fcf3b6aeb6103dfce6ff20e3 | |
parent | 99e7fa5b3718d61d61427c67d244ec50b9eb8578 (diff) | |
download | ruby-3a58009066049f9af09ea3171cecab88ba0d9f1c.tar.gz |
[ruby/error_highlight] Make backtrace_location keyword work
We had to keep backtrace_location before opts is overwritten.
https://github.com/ruby/error_highlight/commit/2735e4681a
-rw-r--r-- | lib/error_highlight/base.rb | 4 | ||||
-rw-r--r-- | test/error_highlight/test_error_highlight.rb | 26 |
2 files changed, 29 insertions, 1 deletions
diff --git a/lib/error_highlight/base.rb b/lib/error_highlight/base.rb index 51f1ce369d..dbd173a5cd 100644 --- a/lib/error_highlight/base.rb +++ b/lib/error_highlight/base.rb @@ -26,9 +26,9 @@ module ErrorHighlight 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 @@ -44,6 +44,8 @@ module ErrorHighlight 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 diff --git a/test/error_highlight/test_error_highlight.rb b/test/error_highlight/test_error_highlight.rb index 89c930f5e6..c4a998092b 100644 --- a/test/error_highlight/test_error_highlight.rb +++ b/test/error_highlight/test_error_highlight.rb @@ -1231,4 +1231,30 @@ undefined method `foo' for nil:NilClass 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 |