class ADSL::Parser::ASTForEach
Public Instance Methods
list_creations()
click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 819 def list_creations @block.list_creations end
optimize()
click to toggle source
Calls superclass method
ADSL::Parser::ASTNode#optimize
# File lib/adsl/parser/ast_nodes.rb, line 823 def optimize optimized = super if optimized.block.statements.empty? return ASTObjsetStmt.new(:objset => optimized.objset).optimize end optimized end
to_adsl()
click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 831 def to_adsl "foreach #{ @var_name.text } : #{ @objset.to_adsl } {\n#{ @block.to_adsl.adsl_indent }}\n" end
typecheck_and_resolve(context)
click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 766 def typecheck_and_resolve(context) before_context = context.dup objset = @objset.typecheck_and_resolve context temp_iterator_objset = ASTDummyObjset.new :type => objset.type assignment = ASTAssignment.new :lineno => @lineno, :var_name => @var_name, :objset => temp_iterator_objset @block.statements = [assignment, @block.statements].flatten vars_written_to = Set[] vars_read = Set[] vars_read_before_being_written_to = Set[] context.on_var_write do |name| vars_written_to << name end context.on_var_read do |name| var_node, var = context.lookup_var name, false vars_read_before_being_written_to << name unless vars_written_to.include?(name) or vars_read_before_being_written_to.include? name vars_read << name unless vars_read.include? name end context.push_frame block = @block.typecheck_and_resolve context context.pop_frame vars_read_before_being_written_to.each do |var_name| vars_read_before_being_written_to.delete var_name unless vars_written_to.include? var_name end flat = true # flat = false unless vars_read_before_being_written_to.empty? if flat for_each = ADSL::DS::DSFlatForEach.new :objset => objset, :block => block else for_each = ADSL::DS::DSForEach.new :objset => objset, :block => block end vars_read_before_being_written_to.each do |var_name| before_var_node, before_var = before_context.lookup_var var_name, false inside_var_node, inside_var = context.lookup_var var_name, false lambda_objset = ADSL::DS::DSForEachPreLambdaObjset.new :for_each => for_each, :before_var => before_var, :inside_var => inside_var var = ADSL::DS::DSVariable.new :name => var_name, :type => before_var.type assignment = ADSL::DS::DSAssignment.new :var => var, :objset => lambda_objset block.replace before_var, var block.statements.unshift assignment end iterator_objset = ADSL::DS::DSForEachIteratorObjset.new :for_each => for_each block.replace temp_iterator_objset, iterator_objset return for_each end