Class: Mirah::JVM::Types::IterableType

Inherits:
Type show all
Defined in:
lib/mirah/jvm/types/intrinsics.rb

Constant Summary

Constants inherited from AST::TypeReference

AST::TypeReference::BlockType, AST::TypeReference::ErrorType, AST::TypeReference::NoType, AST::TypeReference::NullType, AST::TypeReference::UnreachableType

Instance Attribute Summary

Attributes inherited from Type

#inner_class

Attributes inherited from AST::TypeReference

#array, #meta

Attributes included from AST::Named

#name

Attributes inherited from AST::Node

#children, #inferred_type, #newline, #parent, #position

Instance Method Summary collapse

Methods inherited from Type

#add_compiled_macro, #add_enumerable_macros, #add_macro, #add_method, #aload, #array?, #array_type, #assignable_from?, #astore, #basic_type, #compatible?, #component_type, #constructor, #declared_class_methods, #declared_constructors, #declared_instance_methods, #declared_intrinsics, #dynamic?, #expand_each, #field_getter, #field_setter, #full_name, #get_method, #include, #init_value, #initialize, #inner_class?, #inner_class_getter, #inspect, #interface?, #interfaces, #intrinsics, #is_parent, #iterable?, #java_method, #jvm_type, #load, #load_extensions, #log, #meta, #meta?, #newarray, #pop, #prefix, #primitive?, #return, #store, #superclass, #to_source, #unmeta, #void?, #wide?, #wrap_with_scoped_body

Methods included from MethodLookup

#each_is_exact, #each_is_exact_or_subtype_or_convertible, #field_lookup, #find_jls, #find_method, #inner_class, #is_more_specific?, #log, #phase1, #phase2, #phase3, #primitive_convertible?

Methods inherited from AST::TypeReference

#==, #_dump, _load, #basic_type, #block?, #compatible?, #component_type, #eql?, #error?, #full_name, #hash, #initialize, #is_parent, #iterable?, #meta?, #narrow, #null?, #primitive?, #to_s, #type_reference, #unmeta, #unreachable?, #void?

Methods included from AST::Named

#string_value, #to_s, #validate_name

Methods inherited from AST::Node

#<<, ===, #[], #[]=, #_dump, _load, #_set_parent, child, child_name, #child_nodes, #each, #empty?, #expr?, #inferred_type!, #initialize, #initialize_copy, #insert, #inspect, #inspect_children, #line_number, #log, #precompile, #resolve_if, #resolved!, #resolved?, #simple_name, #string_value, #temp, #to_s, #top_level?, #validate_child, #validate_children

Constructor Details

This class inherits a constructor from Mirah::JVM::Types::Type

Instance Method Details

#add_intrinsicsObject



378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
# File 'lib/mirah/jvm/types/intrinsics.rb', line 378

def add_intrinsics
  super
  add_enumerable_macros
  add_macro('each', Mirah::AST.block_type) do |transformer, call|
    Mirah::AST::Loop.new(call.parent,
                        call.position, true, false) do |forloop|
      it = transformer.tmp

      assignment = transformer.eval("#{it} = foo.iterator")
      assignment.value.target = call.target
      call.target.parent = assignment.value
      forloop.init << assignment

      var = call.block.args.args[0]
      if var
        forloop.pre << transformer.eval(
            "#{var.name} = #{it}.next", '', forloop, it)
      else
        forloop.pre << transformer.eval("#{it}.next", '', forloop, it)
      end
      call.block.body.parent = forloop if call.block.body
      [
        Mirah::AST::Condition.new(forloop, call.position) do |c|
          [transformer.eval("#{it}.hasNext", '', forloop, it)]
        end,
        call.block.body
      ]
    end
  end
end