diff --git a/lib/definitions/redefiner.rb b/lib/definitions/redefiner.rb index 4b4a79f..9d721f1 100644 --- a/lib/definitions/redefiner.rb +++ b/lib/definitions/redefiner.rb @@ -27,11 +27,11 @@ module Low class Redefiner class << self # TODO: Pass in "klass" and use it to class_eval/eval methods in the binding of the class that included LowType. - def redefine(method_proxies:, class_proxy:) + def redefine(method_proxies:, class_proxy:, klass: nil) if LowType.config.type_checking typed_methods(method_proxies:, class_proxy:) else - untyped_methods(method_proxies:, class_proxy:) + rewrite_methods(method_proxies:, class_proxy:, klass:) end end @@ -52,6 +52,20 @@ def untyped_args(args:, kwargs:, method_proxy:) # rubocop:disable Metrics/AbcSiz private + def rewrite_methods(method_proxies:, class_proxy:, klass:) + method_proxies.values.filter(&:expressions?).each do |method_proxy| + method_proxy.rewrite_signature + + klass.class_eval(method_proxy.export, method_proxy.file_path, method_proxy.start_line) + + if class_proxy.private_start_line && method_proxy.start_line > class_proxy.private_start_line + klass.send(:private, method_proxy.name) + end + end + + nil + end + def typed_methods(method_proxies:, class_proxy:) # rubocop:disable Metrics Module.new do method_proxies.values.filter(&:expressions?).each do |method_proxy| diff --git a/lib/low_type.rb b/lib/low_type.rb index 304d430..4c98dbd 100644 --- a/lib/low_type.rb +++ b/lib/low_type.rb @@ -52,8 +52,11 @@ def self.included(klass) Low::Evaluator.evaluate(method_proxies: class_proxy.keyed_methods, class_binding: class_proxy.class_binding) - klass.prepend Low::Redefiner.redefine(method_proxies: class_proxy.instance_methods, class_proxy:) - klass.singleton_class.prepend Low::Redefiner.redefine(method_proxies: class_proxy.class_methods, class_proxy:) + result = Low::Redefiner.redefine(method_proxies: class_proxy.instance_methods, class_proxy:, klass:) + klass.prepend result if result + + singleton_result = Low::Redefiner.redefine(method_proxies: class_proxy.class_methods, class_proxy:, klass: klass.singleton_class) + klass.singleton_class.prepend singleton_result if singleton_result Low::Adapter::Loader.load(klass:, class_proxy:)