ArrayLiteralType.java

package edu.udel.cis.vsl.tass.model.impl.expression.literal;

import edu.udel.cis.vsl.tass.model.IF.expression.ArrayLiteralTypeIF;
import edu.udel.cis.vsl.tass.model.IF.expression.LiteralTypeIF;
import edu.udel.cis.vsl.tass.model.IF.type.ArrayTypeIF;
import edu.udel.cis.vsl.tass.model.IF.type.RecordTypeIF;
import edu.udel.cis.vsl.tass.model.IF.type.TypeIF;

public class ArrayLiteralType extends LiteralType implements ArrayLiteralTypeIF {

	private LiteralTypeIF elementLiteralType;

	private int extent;

	public ArrayLiteralType(ArrayTypeIF arrayType, LiteralTypeIF elementType,
			int extent) {
		super(arrayType);
		assert (elementType.type().equals(arrayType.elementType()));
		this.elementLiteralType = elementType;
		this.extent = extent;
	}

	/**
	 * Creates "default" array literal type in which all extents are set to -1
	 * recursively.
	 */
	public ArrayLiteralType(ArrayTypeIF arrayType) {
		super(arrayType);
		this.extent = -1;

		TypeIF elementType = arrayType.elementType();

		if (elementType instanceof ArrayTypeIF) {
			elementLiteralType = new ArrayLiteralType((ArrayTypeIF) elementType);
		} else if (elementType instanceof RecordTypeIF) {
			elementLiteralType = new RecordLiteralType(
					(RecordTypeIF) elementType);
		} else {
			elementLiteralType = new LiteralType(elementType);
		}
	}

	public ArrayLiteralType(ArrayTypeIF arrayType, int extent) {
		this(arrayType);
		this.extent = extent;
	}

	@Override
	public LiteralTypeIF elementLiteralType() {
		return elementLiteralType;
	}

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

	public void setExtent(int extent) {
		this.extent = extent;
	}

	@Override
	public ArrayTypeIF type() {
		return (ArrayTypeIF) super.type();
	}

	public String toString() {
		return "ArrayLiteralType[" + extent + ", " + elementLiteralType + "]";
	}

}