CommonCompoundInitializerNode.java

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

import java.io.PrintStream;
import java.util.List;

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.PairNode;
import edu.udel.cis.vsl.abc.ast.node.IF.compound.CompoundInitializerNode;
import edu.udel.cis.vsl.abc.ast.node.IF.compound.CompoundLiteralObject;
import edu.udel.cis.vsl.abc.ast.node.IF.compound.DesignationNode;
import edu.udel.cis.vsl.abc.ast.node.IF.declaration.InitializerNode;
import edu.udel.cis.vsl.abc.ast.node.common.CommonSequenceNode;
import edu.udel.cis.vsl.abc.ast.type.IF.ObjectType;
import edu.udel.cis.vsl.abc.token.IF.Source;

public class CommonCompoundInitializerNode
		extends
			CommonSequenceNode<PairNode<DesignationNode, InitializerNode>>
		implements
			CompoundInitializerNode {

	private CompoundLiteralObject literal;

	private ObjectType type;

	public CommonCompoundInitializerNode(Source source,
			List<PairNode<DesignationNode, InitializerNode>> childList) {
		super(source, "CompoundInitializer", childList);
	}

	@Override
	public void setLiteralObject(CompoundLiteralObject literal) {
		this.literal = literal;
	}

	@Override
	public CompoundInitializerNode copy() {
		CommonCompoundInitializerNode result = new CommonCompoundInitializerNode(
				getSource(), childListCopy());

		return result;
	}

	@Override
	public CompoundLiteralObject getLiteralObject() {
		return literal;
	}

	@Override
	public void setType(ObjectType type) {
		this.type = type;
	}

	@Override
	public ObjectType getType() {
		return type;
	}

	protected void printExtras(String prefix, PrintStream out) {
		if (literal != null) {
			out.println();
			out.println(prefix + "type: " + type);
			out.print(prefix + "value: " + literal);
		}
	}

	@Override
	public boolean isSideEffectFree(boolean errorsAreSideEffects) {
		boolean result = true;

		for (PairNode<DesignationNode, InitializerNode> pair : this) {
			InitializerNode init = pair.getRight();

			result = result && init.isSideEffectFree(errorsAreSideEffects);
		}
		return result;
	}

	@Override
	public ASTNode setChild(int index, ASTNode child) {
		if (!(child == null || child instanceof PairNode))
			throw new ASTException(
					"Child of CommonCompoundInitializerNode must be a PairNode, but saw "
							+ child + " with type " + child.nodeKind());
		return super.setChild(index, child);
	}
}