summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2021-06-18 17:32:47 +0900
committerYusuke Endoh <mame@ruby-lang.org>2021-06-29 15:49:51 +0900
commit612b6fcd371adc199fb4503941edfdbbac704ef4 (patch)
tree923e8930d2f25a1423327aaeba1491ecba7afbf5
parent4670458af890e9430395c7f56cb23437932f7f52 (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.rb9
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