Class: BiteScript::ASM::GenericTypeBuilder

Inherits:
SignatureVisitor
  • Object
show all
Includes:
SignatureVisitor
Defined in:
lib/bitescript/mirror.rb,
lib/bitescript/asm3/mirror.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(&block) ⇒ GenericTypeBuilder



617
618
619
620
# File 'lib/bitescript/mirror.rb', line 617

def initialize(&block)
  super(BiteScript::ASM::Opcodes::ASM4)
  @block = block
end

Instance Attribute Details

#resultObject (readonly)

Returns the value of attribute result.



606
607
608
# File 'lib/bitescript/mirror.rb', line 606

def result
  @result
end

Class Method Details

.read(signature) ⇒ Object



608
609
610
611
612
613
614
615
# File 'lib/bitescript/mirror.rb', line 608

def self.read(signature)
  if signature
    builder = GenericTypeBuilder.new
    reader = BiteScript::ASM::SignatureReader.new(signature)
    reader.accept(builder)
    builder.result
  end
end

Instance Method Details

#return_type(type) ⇒ Object



622
623
624
625
# File 'lib/bitescript/mirror.rb', line 622

def return_type(type)
  @result = type
  @block.call(type) if @block
end

#visitArrayTypeObject



631
632
633
634
635
# File 'lib/bitescript/mirror.rb', line 631

def visitArrayType
  type = GenericArray.new
  return_type(type)
  GenericTypeBuilder.new {|component_type| type.component_type = component_type}
end

#visitBaseType(desc) ⇒ Object



627
628
629
# File 'lib/bitescript/mirror.rb', line 627

def visitBaseType(desc)
  return_type(Type.getType(desc.chr))
end

#visitClassType(desc) ⇒ Object



641
642
643
# File 'lib/bitescript/mirror.rb', line 641

def visitClassType(desc)
  return_type(ParameterizedType.new(Type.getObjectType(desc)))
end

#visitEndObject



675
676
677
678
679
# File 'lib/bitescript/mirror.rb', line 675

def visitEnd
  if @result.type_arguments.empty? && @result.outer_type.nil?
    @result = @result.raw_type
  end
end

#visitInnerClassType(name) ⇒ Object



670
671
672
673
# File 'lib/bitescript/mirror.rb', line 670

def visitInnerClassType(name)
  desc = @result.descriptor.sub(/;$/, "$#{name};")
  return_type(ParameterizedType.new(Type.getType(desc), @result))
end

#visitSuperclassObject



666
667
668
# File 'lib/bitescript/mirror.rb', line 666

def visitSuperclass
  self
end

#visitTypeArgument(wildcard = nil) ⇒ Object



645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
# File 'lib/bitescript/mirror.rb', line 645

def visitTypeArgument(wildcard=nil)
  if wildcard.nil?
    @result.type_arguments <<
        Wildcard.new(Type.getObjectType('java/lang/Object'))
    return
  end
  GenericTypeBuilder.new do |type|
    argument = case wildcard
    when INSTANCEOF
      type
    when EXTENDS
      Wildcard.new(type)
    when SUPER
      Wildcard.new(nil, type)
    else
      raise "Unknown wildcard #{wildcard.chr}"
    end
    @result.type_arguments << argument
  end
end

#visitTypeVariable(name) ⇒ Object



637
638
639
# File 'lib/bitescript/mirror.rb', line 637

def visitTypeVariable(name)
  return_type(TypeVariable.new(name))
end