LiteralArrayTypeNode.java

package edu.udel.cis.vsl.abc.analysis.entity;

import edu.udel.cis.vsl.abc.ast.type.IF.ArrayType;
import edu.udel.cis.vsl.abc.ast.value.IF.IntegerValue;

public class LiteralArrayTypeNode extends LiteralTypeNode {

	private LiteralTypeNode elementNode;

	private int length;

	private boolean fixed;

	public LiteralArrayTypeNode(ArrayType type, LiteralTypeNode elementNode) {
		super(type);

		IntegerValue constantSize = type.getConstantSize();

		this.elementNode = elementNode;
		assert elementNode.getType().equals(type.getElementType());
		if (constantSize != null) {
			length = constantSize.getIntegerValue().intValue();
			fixed = true;
		} else {
			length = 0;
			fixed = false;
		}
	}

	@Override
	public ArrayType getType() {
		return (ArrayType) super.getType();
	}

	@Override
	public boolean hasFixedLength() {
		return fixed;
	}

	@Override
	public int length() {
		return length;
	}

	public LiteralTypeNode getElementNode() {
		return elementNode;
	}

	@Override
	public String toString() {
		return "Array[" + length + "," + getElementNode() + "]";
	}

	public void setLength(int value) {
		assert !fixed;
		this.length = value;
	}

	@Override
	public LiteralTypeNode getChild(int index) {
		return getElementNode();
	}

}