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

Returns a new instance of GenericTypeBuilder.



660
661
662
663
# File 'lib/bitescript/mirror.rb', line 660

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

Instance Attribute Details

#resultObject (readonly)

Returns the value of attribute result.



649
650
651
# File 'lib/bitescript/mirror.rb', line 649

def result
  @result
end

Class Method Details

.read(signature) ⇒ Object



651
652
653
654
655
656
657
658
# File 'lib/bitescript/mirror.rb', line 651

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



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

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

#visitArrayTypeObject



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

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

#visitBaseType(desc) ⇒ Object



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

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

#visitClassType(desc) ⇒ Object



684
685
686
# File 'lib/bitescript/mirror.rb', line 684

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

#visitEndObject



718
719
720
721
722
# File 'lib/bitescript/mirror.rb', line 718

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

#visitInnerClassType(name) ⇒ Object



713
714
715
716
# File 'lib/bitescript/mirror.rb', line 713

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

#visitSuperclassObject



709
710
711
# File 'lib/bitescript/mirror.rb', line 709

def visitSuperclass
  self
end

#visitTypeArgument(wildcard = nil) ⇒ Object



688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
# File 'lib/bitescript/mirror.rb', line 688

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



680
681
682
# File 'lib/bitescript/mirror.rb', line 680

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