StatementSet.java

package edu.udel.cis.vsl.civl.model.common.statement;

import java.util.LinkedHashSet;
import java.util.Set;

import edu.udel.cis.vsl.civl.model.IF.CIVLSource;
import edu.udel.cis.vsl.civl.model.IF.Model;
import edu.udel.cis.vsl.civl.model.IF.Scope;
import edu.udel.cis.vsl.civl.model.IF.expression.Expression;
import edu.udel.cis.vsl.civl.model.IF.location.Location;
import edu.udel.cis.vsl.civl.model.IF.statement.Statement;

/**
 * Sometimes it is useful for the model builder to return a set of statements.
 * e.g. when exiting a switch the end of the default case and all break
 * statements need their targets set to the source location of the next statement.
 * 
 * @author zirkel
 * 
 */
public class StatementSet implements Statement {

	private Set<Statement> statements;
	private boolean hasDerefs;
	private boolean purelyLocal;
	

	public StatementSet() {
		statements = new LinkedHashSet<Statement>();
	}

	public StatementSet(Set<Statement> statements) {
		this.statements = statements;
	}
	
	public void add(Statement statement) {
		statements.add(statement);
	}

	@Override
	public CIVLSource getSource() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Location source() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Location target() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Expression guard() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Model model() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setSource(Location source) {
		// TODO Auto-generated method stub

	}

	@Override
	public void setTarget(Location target) {
		for (Statement s : statements) {
			s.setTarget(target);
		}
	}

	@Override
	public void setGuard(Expression guard) {
		// TODO Auto-generated method stub

	}

	@Override
	public void setModel(Model model) {
		// TODO Auto-generated method stub

	}

	@Override
	public Scope statementScope() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setStatementScope(Scope statementScope) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean hasDerefs() {
		return this.hasDerefs;
	}

	@Override
	public void caculateDerefs() {
		this.hasDerefs = false;
		for(Statement s: statements){
			s.caculateDerefs();
			this.hasDerefs = this.hasDerefs || s.hasDerefs();
			//early return
			if(this.hasDerefs)
				return;
		}
	}

	@Override
	public boolean isPurelyLocal() {
		return this.purelyLocal;
	}
	
	@Override
	public void purelyLocalAnalysisOfVariables(Scope funcScope) {
		for(Statement s: statements){
			s.purelyLocalAnalysisOfVariables(funcScope);
		}
	}

	@Override
	public void purelyLocalAnalysis() {
		this.guard().purelyLocalAnalysis();
		if(!this.guard().isPurelyLocal()){
			this.purelyLocal = false;
			return;
		}
		
		for(Statement s: statements){
			s.purelyLocalAnalysis();
			if(!s.isPurelyLocal()){
				this.purelyLocal = false;
				return;
			}
		}
		this.purelyLocal = true;
	}

}