summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2022-06-07 17:40:03 +0900
committergit <svn-admin@ruby-lang.org>2022-06-07 17:40:19 +0900
commitf075be3dcb4b82b89496d1820002bf3d80f653ef (patch)
treed7c2b32c7709878d16e9d55e111ce1a4cf019906
parent11b9dd8ccb26a091b99230640494540ad0cc4e48 (diff)
[ruby/error_highlight] Use Exception#detailed_message instead of overriding #message (https://github.com/ruby/error_highlight/pull/24)
See https://bugs.ruby-lang.org/issues/18564. Ref: https://github.com/ruby/did_you_mean/pull/177 https://github.com/ruby/error_highlight/commit/671b7c61b2
-rw-r--r--lib/error_highlight/core_ext.rb47
-rw-r--r--test/error_highlight/test_error_highlight.rb13
2 files changed, 43 insertions, 17 deletions
diff --git a/lib/error_highlight/core_ext.rb b/lib/error_highlight/core_ext.rb
index 78cda8ace2..53e409dd8f 100644
--- a/lib/error_highlight/core_ext.rb
+++ b/lib/error_highlight/core_ext.rb
@@ -2,20 +2,13 @@ require_relative "formatter"
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 = {}
@@ -36,11 +29,37 @@ module ErrorHighlight
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
diff --git a/test/error_highlight/test_error_highlight.rb b/test/error_highlight/test_error_highlight.rb
index a3cc7aa149..5b7c05e5f4 100644
--- a/test/error_highlight/test_error_highlight.rb
+++ b/test/error_highlight/test_error_highlight.rb
@@ -23,9 +23,16 @@ class ErrorHighlightTest < Test::Unit::TestCase
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