Class: Duby::JVM::Types::TypeFactory
- 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
-
#known_types ⇒ Object
readonly
Returns the value of attribute known_types.
-
#package ⇒ Object
Returns the value of attribute package.
Instance Method Summary collapse
- #alias(from, to) ⇒ Object
- #basic_type(name) ⇒ Object
- #declare_type(node) ⇒ Object
- #define_types(builder) ⇒ Object
- #fixnum(parent, line_number, literal) ⇒ Object
- #float(parent, line_number, literal) ⇒ Object
-
#initialize(filename = '') ⇒ TypeFactory
constructor
A new instance of TypeFactory.
- #no_type ⇒ Object
- #type(name, array = false, meta = false) ⇒ Object
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_types ⇒ Object (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 |
#package ⇒ Object
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
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 |
#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, =false) type = basic_type(name) type = type. if type = type.array_type if array return type end |