Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 33 additions & 14 deletions lib/error_highlight/core_ext.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,13 @@

module ErrorHighlight
module CoreExt
# This is a marker to let `DidYouMean::Correctable#original_message` skip
# the following method definition of `to_s`.
# See https://github.com/ruby/did_you_mean/pull/152
SKIP_TO_S_FOR_SUPER_LOOKUP = true
private_constant :SKIP_TO_S_FOR_SUPER_LOOKUP

def to_s
msg = super.dup

private def generate_snippet
locs = backtrace_locations
return msg unless locs
return "" unless locs

loc = locs.first
return msg unless loc
return "" unless loc

begin
node = RubyVM::AbstractSyntaxTree.of(loc, keep_script_lines: true)
opts = {}
Expand All @@ -36,11 +29,37 @@ def to_s
end

if spot
points = ErrorHighlight.formatter.message_for(spot)
msg << points if !msg.include?(points)
return ErrorHighlight.formatter.message_for(spot)
end

""
end

if Exception.method_defined?(:detailed_message)
def detailed_message(highlight: false, error_highlight: true, **)
return super unless error_highlight
snippet = generate_snippet
if highlight
snippet = snippet.gsub(/.+/) { "\e[1m" + $& + "\e[m" }
end
super + snippet
end
else
# This is a marker to let `DidYouMean::Correctable#original_message` skip
# the following method definition of `to_s`.
# See https://github.com/ruby/did_you_mean/pull/152
SKIP_TO_S_FOR_SUPER_LOOKUP = true
private_constant :SKIP_TO_S_FOR_SUPER_LOOKUP

msg
def to_s
msg = super
snippet = generate_snippet
if snippet != "" && !msg.include?(snippet)
msg + snippet
else
msg
end
end
end
end

Expand Down
13 changes: 10 additions & 3 deletions test/test_error_highlight.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,16 @@ def teardown
end
end

def assert_error_message(klass, expected_msg, &blk)
err = assert_raise(klass, &blk)
assert_equal(expected_msg.chomp, err.message)
if Exception.method_defined?(:detailed_message)
def assert_error_message(klass, expected_msg, &blk)
err = assert_raise(klass, &blk)
assert_equal(expected_msg.chomp, err.detailed_message(highlight: false).sub(/ \((?:NoMethod|Name)Error\)/, ""))
end
else
def assert_error_message(klass, expected_msg, &blk)
err = assert_raise(klass, &blk)
assert_equal(expected_msg.chomp, err.message)
end
end

def test_CALL_noarg_1
Expand Down