Skip to content
This repository has been archived by the owner on Dec 18, 2023. It is now read-only.

Don't try to intern MethodMirrors that are defined on Objects #5

Merged
merged 1 commit into from Feb 8, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion lib/mirrors.rb
Expand Up @@ -193,7 +193,10 @@ def reflect_file(obj)

def reflect_method(obj)
mirror = MethodMirror.new(obj)
mirror.defining_class.intern_method_mirror(mirror)
if mirror.defining_class.respond_to?(:intern_method_mirror)
mirror = mirror.defining_class.intern_method_mirror(mirror)
end
mirror
end

def reflect_class(obj)
Expand Down
21 changes: 21 additions & 0 deletions test/fixtures/method.rb
Expand Up @@ -50,3 +50,24 @@ def shadow_without_super
def not_inherited
end
end

class HelperModule < Module
def initialize(something)
@something = something
end

def to_s
"Helper for #{@something}"
end
end

DYNAMIC_INCLUDE = HelperModule.new("fixture")

class ObjectIncludeFixture
include DYNAMIC_INCLUDE
end

DYNAMIC_INCLUDE.class_eval do
def method_from_dynamic_include
end
end
6 changes: 6 additions & 0 deletions test/mirrors/method_mirror_test.rb
Expand Up @@ -114,6 +114,12 @@ def test_private_method
assert_equal(:private, m.visibility)
end

def test_method_included_from_instance
method_mirror = Mirrors.reflect(ObjectIncludeFixture.new.method(:method_from_dynamic_include))
assert(method_mirror.public?)
assert_equal(method_mirror.defining_class.reflectee, DYNAMIC_INCLUDE)
end

private

def method_b(a, b = 1, bb = 2, *args, &block)
Expand Down