Display a line in application code instead of gems
Currently, error_highlight spots the deepest Ruby frame. This may show code in a gem, which may not be very useful for application writers.
Consider:
# gem code
class SomeGem
def foo(x)
raise ArgumentError, "wrong input" if x == nil
end
end
# app code
SomeGem.new.foo(nil)
Here is the current behavior:
$ ruby test.rb
test.rb:4:in `foo': wrong input (ArgumentError)
raise ArgumentError, "wrong input" if x == nil
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
from test.rb:9:in `<main>'
However, application writers may want to see the line of SomeGem.new.foo(nil).
How might this be resolved?
- Display code snippets for all frames, not just for the deepest one. Python does this, but I am not very keen on it because it makes the error trace very messy.
- Add an argument
Kernel#raiseto tell error_highlight which frame should be displayed, for example,raise ArgumentError, "wrong input", error_highlight_skip_frames: 1.
For 2, there are two ways how to show the error.
2-1. Keep the error trace as is and change only the snippet. This might be confusing because the snippet line does not exist in test.rb:4.
$ ruby test.rb
test.rb:4:in `foo': wrong input (ArgumentError)
SomeGem.new.foo(nil)
^^^
from test.rb:9:in `<main>'
2-2. Skip the error trace. This looks good to me, but I think this is beyond the responsibilities of error_highlight.
$ ruby test.rb
test.rb:9:in `<main>': wrong input (ArgumentError)
SomeGem.new.foo(nil)
^^^
I wonder if we should put something like raise skip_frames: n in the Ruby core side? I need to organize my thoughts.
Hey @mame, the second approach looks cleaner indeed. Based on that, I’ve put together a proposal for skipping lines in gem files: https://github.com/ruby/error_highlight/pull/54. Do you have any thoughts on this approach?
It’s still a work in progress (I’m looking into the Prism failure), but I’d really appreciate your thoughts on this direction when you have a moment. Thanks so much!