CommonEntity.java

package edu.udel.cis.vsl.abc.ast.entity.IF;

import java.util.ArrayList;

import edu.udel.cis.vsl.abc.ast.node.IF.declaration.DeclarationNode;
import edu.udel.cis.vsl.abc.ast.type.IF.Type;

/**
 * A simple, generic implementation of {@link Entity}. This class may be
 * extended by specific entities, or it may used as a field (as in the
 * Delegation Pattern) to help implement other entities that cannot extend this
 * class for some reason (for example, because they extend some other class.)
 * 
 * @author siegel
 * 
 */
public class CommonEntity implements ProgramEntity {

	private EntityKind entityKind;

	private String name;

	private ProgramEntity.LinkageKind linkage;

	private ArrayList<DeclarationNode> declarations = new ArrayList<DeclarationNode>();

	private DeclarationNode definition;

	private Type type;

	/**
	 * Is this a system-defined entity (as opposed to a user-defined one)?
	 * Examples include standard types, like size_t.
	 */
	private boolean isSystem = false;

	public CommonEntity(EntityKind kind, String name,
			ProgramEntity.LinkageKind linkage) {
		this.entityKind = kind;
		this.name = name;
		this.linkage = linkage;
	}

	@Override
	public void setIsSystem(boolean value) {
		this.isSystem = value;
	}

	@Override
	public boolean isSystem() {
		return isSystem;
	}

	@Override
	public EntityKind getEntityKind() {
		return entityKind;
	}

	@Override
	public Iterable<DeclarationNode> getDeclarations() {
		return declarations;
	}

	@Override
	public DeclarationNode getFirstDeclaration() {
		return declarations.get(0);
	}

	@Override
	public int getNumDeclarations() {
		return declarations.size();
	}

	@Override
	public DeclarationNode getDeclaration(int index) {
		return declarations.get(index);
	}

	@Override
	public void addDeclaration(DeclarationNode declaration) {
		declarations.add(declaration);
	}

	@Override
	public DeclarationNode getDefinition() {
		return definition;
	}

	@Override
	public void setDefinition(DeclarationNode declaration) {
		this.definition = declaration;
	}

	@Override
	public ProgramEntity.LinkageKind getLinkage() {
		return linkage;
	}

	@Override
	public void setLinkage(ProgramEntity.LinkageKind linkage) {
		this.linkage = linkage;
	}

	@Override
	public String getName() {
		return name;
	}

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

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

	@Override
	public String toString() {
		DeclarationNode definition = getDefinition();
		String defString;
		Type type = this.getType();

		if (definition != null)
			defString = ", definition=" + definition.id();
		else if (isSystem)
			defString = ", definition=INTERNAL";
		else
			defString = ", definition=UNKNOWN";
		return "Entity[kind=" + entityKind + ", name=" + this.getName()
				+ ", linkage=" + this.getLinkage() + ", type="
				+ (type == null ? "UNKNOWN" : type.getId()) + defString + "]";
	}

}