Class: Module

Inherits:
Object
  • Object
show all
Defined in:
lib/core/src/main/ruby/jruby/java/core_ext/module.rb

Overview

Extensions to the standard Module package.

Instance Method Summary collapse

Instance Method Details

#const_missing(constant) ⇒ Object



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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# 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|
      collection = []
      hidden_methods[:collect_ancestors_namespaces].call(collection, m)
      collection.uniq.map do |klass|
          hidden_methods[:included_packages].call(klass)
        end.map(&:to_a).reduce([], :+).uniq
    end,

    collect_ancestors_namespaces: lambda do |collection, m|
      return if collection.include?(m)
      collection << m
      result = (m.ancestors + hidden_methods[:namespaces].call(m)[1..-1]).uniq
      if result.size == 1
        return
      else
        result[1..-1].each do |klass|
          hidden_methods[:collect_ancestors_namespaces].call(collection, klass)
        end
      end
    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,

    # Returns namespaces containing this module/class starting with self.
    # Example: `Outer::Inner::Shape.namespaces` returns:
    # => [Outer::Inner::Shape, Outer::Inner, Outer]
    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
      # we only rescue NameError, since other errors should bubble out
      last_error = e
    end
    break if java_class
  end

  if java_class
    return JavaUtilities.create_proxy_class(constant, java_class, self)
  else
    # try to chain to super's const_missing
    begin
      return const_missing_without_nested_inherited_jruby_include_package(constant)
    rescue NameError => e
      # super didn't find anything either, raise our Java error
      raise NameError.new("#{constant} not found in packages #{all_included_packages.join(', ')}; last error: #{(last_error || e).message}")
    end
  end
end

#const_missing_without_nested_inherited_jruby_include_packageObject



4
# File 'lib/core/src/main/ruby/jruby/java/core_ext/module.rb', line 4

alias const_missing_without_nested_inherited_jruby_include_package const_missing