CommonForLoopNode.java

package edu.udel.cis.vsl.abc.ast.node.common.statement;

import edu.udel.cis.vsl.abc.ast.IF.ASTException;
import edu.udel.cis.vsl.abc.ast.node.IF.ASTNode;
import edu.udel.cis.vsl.abc.ast.node.IF.SequenceNode;
import edu.udel.cis.vsl.abc.ast.node.IF.acsl.ContractNode;
import edu.udel.cis.vsl.abc.ast.node.IF.expression.ExpressionNode;
import edu.udel.cis.vsl.abc.ast.node.IF.statement.ForLoopInitializerNode;
import edu.udel.cis.vsl.abc.ast.node.IF.statement.ForLoopNode;
import edu.udel.cis.vsl.abc.ast.node.IF.statement.StatementNode;
import edu.udel.cis.vsl.abc.token.IF.Source;

public class CommonForLoopNode extends CommonLoopNode implements ForLoopNode {

	public CommonForLoopNode(Source source, ExpressionNode condition,
			StatementNode statement, ForLoopInitializerNode initializer,
			ExpressionNode incrementer, SequenceNode<ContractNode> contracts) {
		super(source, LoopKind.FOR, condition, statement, contracts);
		addChild(initializer); // child 3
		addChild(incrementer); // child 4
	}

	@Override
	public ForLoopInitializerNode getInitializer() {
		return (ForLoopInitializerNode) child(3);
	}

	@Override
	public ExpressionNode getIncrementer() {
		return (ExpressionNode) child(4);
	}

	@Override
	public ForLoopNode copy() {
		return new CommonForLoopNode(getSource(), duplicate(getCondition()),
				duplicate(getBody()), duplicate(getInitializer()),
				duplicate(getIncrementer()), duplicate(loopContracts()));
	}

	@Override
	public StatementKind statementKind() {
		return StatementKind.LOOP;
	}

	@Override
	public void setInitializer(ForLoopInitializerNode initNode) {
		setChild(3, initNode);
	}

	@Override
	public void setIncrementer(ExpressionNode node) {
		setChild(4, node);
	}

	@Override
	public ASTNode setChild(int index, ASTNode child) {
		if (index >= 5)
			throw new ASTException(
					"CommonForLoopNode has five children, but saw index "
							+ index);
		switch (index) {
			case 3 :
				if (!(child == null || child instanceof ForLoopInitializerNode))
					throw new ASTException(
							"Child of CommonForLoopNode at index " + index
									+ " must be an ForLoopInitializerNode, but saw "
									+ child + " with type " + child.nodeKind());
				break;
			case 4 :
				if (!(child == null || child instanceof ExpressionNode))
					throw new ASTException(
							"Child of CommonForLoopNode at index " + index
									+ " must be an ExpressionNode, but saw "
									+ child + " with type " + child.nodeKind());
				break;
		}
		return super.setChild(index, child);
	}
}