diff options
author | Yusuke Endoh <mame@ruby-lang.org> | 2021-06-18 17:32:47 +0900 |
---|---|---|
committer | Yusuke Endoh <mame@ruby-lang.org> | 2021-06-29 15:49:51 +0900 |
commit | 612b6fcd371adc199fb4503941edfdbbac704ef4 (patch) | |
tree | 923e8930d2f25a1423327aaeba1491ecba7afbf5 | |
parent | 4670458af890e9430395c7f56cb23437932f7f52 (diff) |
Let Correctable#original_message skip prepended method definitions
Previously, DidYouMean::Correctable#original_message did
`method(:to_s).super_method.call` to call the original to_s method by
skipping Correctable#to_s.
I'm now creating a gem that prepends another to_s method to NameError,
which confuses the hack. An immediate solution is to replace it with
`method(:to_s).super_method.super_method.call` to skip the two methods.
But it is too ad-hoc.
This changeset uses more extensible approach and allow a prepended
module to declare that they should be skipped by defining a constant
named `SKIP_TO_S_FOR_SUPER_LOOKUP`.
https://github.com/ruby/did_you_mean/commit/8352c154e3
-rw-r--r-- | lib/did_you_mean/core_ext/name_error.rb | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/lib/did_you_mean/core_ext/name_error.rb b/lib/did_you_mean/core_ext/name_error.rb index 77dcd520c0..74febccfe9 100644 --- a/lib/did_you_mean/core_ext/name_error.rb +++ b/lib/did_you_mean/core_ext/name_error.rb @@ -1,7 +1,14 @@ module DidYouMean module Correctable + SKIP_TO_S_FOR_SUPER_LOOKUP = true + private_constant :SKIP_TO_S_FOR_SUPER_LOOKUP + def original_message - method(:to_s).super_method.call + meth = method(:to_s) + while meth.owner.const_defined?(:SKIP_TO_S_FOR_SUPER_LOOKUP) + meth = meth.super_method + end + meth.call end def to_s |