CommonFunction.java
package edu.udel.cis.vsl.abc.ast.entity.common;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import edu.udel.cis.vsl.abc.ast.entity.IF.Function;
import edu.udel.cis.vsl.abc.ast.entity.IF.ProgramEntity;
import edu.udel.cis.vsl.abc.ast.entity.IF.Scope;
import edu.udel.cis.vsl.abc.ast.entity.IF.Scope.ScopeKind;
import edu.udel.cis.vsl.abc.ast.node.IF.acsl.ContractNode;
import edu.udel.cis.vsl.abc.ast.node.IF.declaration.FunctionDefinitionNode;
import edu.udel.cis.vsl.abc.ast.type.IF.FunctionType;
import edu.udel.cis.vsl.abc.ast.type.IF.Type;
import edu.udel.cis.vsl.abc.err.IF.ABCRuntimeException;
public class CommonFunction extends CommonOrdinaryEntity implements Function {
private boolean isInlined, doesNotReturn, isAtomic, isSystemFunction,
isPure, isStateF, isAbstract, isLogic = false;
private Set<Function> callers = new HashSet<>();
private Set<Function> callees = new HashSet<>();
static Function mainFunction;
private String library = null;
private List<ContractNode> contracts = new LinkedList<>();
public CommonFunction(String name, ProgramEntity.LinkageKind linkage,
Type type) {
super(EntityKind.FUNCTION, name, linkage, type);
}
@Override
public boolean isInlined() {
return isInlined;
}
@Override
public void setIsInlined(boolean value) {
this.isInlined = value;
}
@Override
public boolean doesNotReturn() {
return doesNotReturn;
}
@Override
public void setDoesNotReturn(boolean value) {
this.doesNotReturn = value;
}
@Override
public FunctionDefinitionNode getDefinition() {
return (FunctionDefinitionNode) super.getDefinition();
}
@Override
public Scope getScope() {
Scope result = getDefinition().getBody().getScope();
while (result != null) {
if (result.getScopeKind() == ScopeKind.FUNCTION)
break;
result = result.getParentScope();
}
if (result == null)
throw new ABCRuntimeException(
"Could not find function scope of function " + this);
return result;
}
@Override
public FunctionType getType() {
return (FunctionType) super.getType();
}
@Override
public Set<Function> getCallers() {
return callees;
}
@Override
public Set<Function> getCallees() {
return callers;
}
@Override
public void addContract(ContractNode contract) {
contracts.add(contract);
}
@Override
public Iterable<ContractNode> getContracts() {
return contracts;
}
@Override
public boolean isAtomic() {
return this.isAtomic;
}
@Override
public void setAtomic(boolean value) {
this.isAtomic = value;
}
@Override
public void setSystemFunction(boolean value) {
this.isSystemFunction = value;
}
@Override
public boolean isSystemFunction() {
return this.isSystemFunction;
}
@Override
public boolean isAbstract() {
return this.isAbstract;
}
@Override
public void setAbstract(boolean value) {
this.isAbstract = value;
}
@Override
public String systemLibrary() {
return this.library;
}
@Override
public void setSystemLibrary(String library) {
this.library = library;
}
@Override
public boolean isPure() {
return this.isPure;
}
@Override
public void setPure(boolean value) {
this.isPure = value;
}
@Override
public boolean isStateFunction() {
return this.isStateF;
}
@Override
public void setStateFunction(boolean value) {
this.isStateF = value;
}
@Override
public boolean isLogic() {
return isLogic;
}
@Override
public void setLogic(boolean value) {
this.isLogic = value;
}
}