Class: Duby::JVM::Types::TypeFactory

Inherits:
Object
  • Object
show all
Defined in:
lib/duby/jvm/types/factory.rb

Defined Under Namespace

Classes: ParanoidHash

Constant Summary collapse

BASIC_TYPES =
{
  "boolean" => Boolean,
  "byte" => Byte,
  "char" => Char,
  "short" => Short,
  "int" => Int,
  "long" => Long,
  "float" => Float,
  "double" => Double,
  "fixnum" => Int,
  "string" => String,
  "java.lang.String" => String,
  "java.lang.Object" => Object,
  "void" => Void,
  "notype" => Void,
  "null" => Null
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filename = '') ⇒ TypeFactory

Returns a new instance of TypeFactory.



31
32
33
34
35
36
37
38
# File 'lib/duby/jvm/types/factory.rb', line 31

def initialize(filename='')
  @known_types = ParanoidHash.new
  @known_types.update(BASIC_TYPES)
  @declarations = []
  @package = File.dirname(filename).tr('/', '.')
  @package.sub! /^\.+/, ''
  @package = nil if @package.empty?
end

Instance Attribute Details

#known_typesObject (readonly)

Returns the value of attribute known_types.



22
23
24
# File 'lib/duby/jvm/types/factory.rb', line 22

def known_types
  @known_types
end

#packageObject

Returns the value of attribute package.



21
22
23
# File 'lib/duby/jvm/types/factory.rb', line 21

def package
  @package
end

Instance Method Details

#alias(from, to) ⇒ Object



107
108
109
# File 'lib/duby/jvm/types/factory.rb', line 107

def alias(from, to)
  @known_types[from] = type(to)
end

#basic_type(name) ⇒ Object

Raises:

  • (ArgumentError)


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
# File 'lib/duby/jvm/types/factory.rb', line 53

def basic_type(name)
  if name.kind_of?(Type) || name.kind_of?(NarrowingType)
    return name.basic_type 
  end
  orig = name
  if name.kind_of? Java::JavaClass
    if name.array?
      return type(name.component_type, true)
    else
      name = name.name
    end
  elsif name.respond_to? :java_class
    name = name.java_class.name
  end
  name = name.to_s unless name.kind_of?(::String)
  return @known_types[name].basic_type if @known_types[name]
  raise ArgumentError, "Bad Type #{orig}" if name =~ /Java::/
  raise ArgumentError, "Bad Type #{orig.inspect}" if name == '' || name.nil?
  full_name = name
  begin
    @known_types[name] = Type.new(Java::JavaClass.for_name(full_name))
  rescue NameError
    unless full_name.include? '.'
      full_name = "java.lang.#{full_name}"
      retry
    end
    raise $!
  end
end

#declare_type(node) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/duby/jvm/types/factory.rb', line 83

def declare_type(node)
  if node.kind_of? ::String
    name = node
    node = nil
  else
    name = node.name
  end

  if Duby::AST::InterfaceDeclaration === node
    @known_types[name] = InterfaceDefinition.new(name, node)
  elsif @known_types.include? name
    existing = @known_types[name]
    existing.node ||= node
    existing
  else
    full_name = name
    if !name.include?('.') && package
      full_name = "#{package}.#{name}"
    end
    @known_types[full_name] = TypeDefinition.new(full_name, node)
    @known_types[name] = @known_types[full_name]
  end
end

#define_types(builder) ⇒ Object



40
41
42
43
44
# File 'lib/duby/jvm/types/factory.rb', line 40

def define_types(builder)
  @declarations.each do |declaration|
    declaration.define(builder)
  end
end

#fixnum(parent, line_number, literal) ⇒ Object



115
116
117
# File 'lib/duby/jvm/types/factory.rb', line 115

def fixnum(parent, line_number, literal)
  FixnumLiteralNode.new(parent, line_number, literal)
end

#float(parent, line_number, literal) ⇒ Object



119
120
121
# File 'lib/duby/jvm/types/factory.rb', line 119

def float(parent, line_number, literal)
  FloatLiteralNode.new(parent, line_number, literal)
end

#no_typeObject



111
112
113
# File 'lib/duby/jvm/types/factory.rb', line 111

def no_type
  Void
end

#type(name, array = false, meta = false) ⇒ Object



46
47
48
49
50
51
# File 'lib/duby/jvm/types/factory.rb', line 46

def type(name, array=false, meta=false)
  type = basic_type(name)
  type = type.meta if meta
  type = type.array_type if array
  return type
end