summaryrefslogtreecommitdiff
path: root/lib/error_highlight
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 /lib/error_highlight
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
Diffstat (limited to 'lib/error_highlight')
-rw-r--r--lib/error_highlight/core_ext.rb47
1 files changed, 33 insertions, 14 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