Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions lib/definitions/redefiner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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|
Expand Down
7 changes: 5 additions & 2 deletions lib/low_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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:)

Expand Down