SystemFunction.java

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

import java.io.PrintWriter;

import edu.udel.cis.vsl.tass.model.IF.SyntaxException;
import edu.udel.cis.vsl.tass.model.IF.SystemFunctionIF;
import edu.udel.cis.vsl.tass.model.IF.expression.ExpressionIF;
import edu.udel.cis.vsl.tass.model.IF.scope.ScopeIF;
import edu.udel.cis.vsl.tass.model.IF.type.TypeIF;

public class SystemFunction extends Function implements SystemFunctionIF {

	private LibraryInfo libraryInfo = null;

	private ExpressionIF guard;

	private int idInLibrary = -1;

	/**
	 * Creates new instance of SystemFunction with idInLibrary -1 and null
	 * libraryInfo. Those two fields are set by registering the function.
	 */
	SystemFunction(ScopeIF containingScope, String name, TypeIF returnType,
			int numFormals, ExpressionIF guard) {
		super(containingScope, name, returnType, numFormals);
		this.guard = guard;
	}

	public void setIdInLibrary(int id) {
		this.idInLibrary = id;
	}

	@Override
	public String libraryName() {
		return libraryInfo.libraryName();
	}

	public void setGuard(ExpressionIF guard) {
		this.guard = guard;
	}

	@Override
	public ExpressionIF guard() {
		return guard;
	}

	@Override
	protected void completeLocations() throws SyntaxException {
		if (locations().size() != 0)
			throw new SyntaxException(this,
					"System function should not have body");
	}

	@Override
	protected void printAdditionalData(String prefix, PrintWriter out,
			boolean withSource) {
		out.println(prefix + "library: " + libraryName() + " (library id:"
				+ libraryInfo.libraryId() + ")");
		out.println(prefix + "id in library: " + idInLibrary);
		out.println(prefix + "guard: " + guard);
		if (withSource) {
			out.println(prefix + "| " + guard.getSource());
		}
	}

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

	public void setLibraryInfo(LibraryInfo libraryInfo) {
		this.libraryInfo = libraryInfo;
	}

	public LibraryInfo libraryInfo() {
		return libraryInfo;
	}

	@Override
	public int libraryId() {
		return libraryInfo.libraryId();
	}
}