6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# File 'lib/core/src/main/ruby/jruby/java/core_ext/module.rb', line 6
def const_missing(constant)
hidden_methods = {
included_packages_from_ancestors_namespaces: lambda do |m|
m.ancestors.map do |klass|
hidden_methods[:included_packages_from_namespaces].call(klass)
end.map(&:to_a).reduce([], :+).uniq
end,
included_packages_from_namespaces: lambda do |m|
hidden_methods[:namespaces].call(m).map do |klass|
hidden_methods[:included_packages].call(klass)
end.map(&:to_a).reduce([], :+).uniq
end,
included_packages: lambda do |m|
return [] unless m.respond_to?(:instance_variable_get)
m.instance_variable_set(:@included_packages, []) unless m.instance_variable_get(:@included_packages)
m.instance_variable_get(:@included_packages)
end,
java_aliases_from_ancestors_namespaces: lambda do |m|
m.ancestors.map do |klass|
hidden_methods[:java_aliases_from_namespaces].call(klass)
end.reverse.reduce({}, :merge)
end,
java_aliases_from_namespaces: lambda do |m|
hidden_methods[:namespaces].call(m).map do |klass|
hidden_methods[:java_aliases].call(klass)
end.reverse.reduce({}, :merge)
end,
java_aliases: lambda do |m|
return {} unless m.respond_to?(:instance_variable_get)
m.instance_variable_set(:@java_aliases, {}) unless m.instance_variable_get(:@java_aliases)
m.instance_variable_get(:@java_aliases)
end,
namespaces: lambda do |m|
return [m] if m.name.nil?
namespace_constants = m.name.split(/::/).map(&:to_sym)
namespace_constants.reduce([Object]) do |output, namespace_constant|
output += [output.last.const_get(namespace_constant)]
end[1..-1].uniq.reverse
end
}
all_included_packages = hidden_methods[:included_packages_from_ancestors_namespaces].call(self)
return const_missing_without_nested_inherited_jruby_include_package(constant) if all_included_packages.empty?
real_name = hidden_methods[:java_aliases_from_ancestors_namespaces].call(self)[constant] || constant
java_class = nil
last_error = nil
all_included_packages.each do |package|
begin
java_class = JavaUtilities.get_java_class("#{package}.#{real_name}")
rescue NameError => e
last_error = e
end
break if java_class
end
if java_class
return JavaUtilities.create_proxy_class(constant, java_class, self)
else
begin
return const_missing_without_nested_inherited_jruby_include_package(constant)
rescue NameError => e
raise NameError.new("#{constant} not found in packages #{all_included_packages.join(', ')}; last error: #{(last_error || e).message}")
end
end
end
|