/**
*
*/
package soottocfg.cfg.expression;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import soottocfg.cfg.SourceLocation;
import soottocfg.cfg.type.BoolType;
import soottocfg.cfg.type.Type;
import soottocfg.cfg.variable.Variable;
/**
* @author schaef
*
*/
public class UnaryExpression extends Expression {
private static final long serialVersionUID = -3534248180235954114L;
private Expression expression;
private final UnaryOperator op;
public enum UnaryOperator {
Neg("-"), LNot("!");
private final String name;
private UnaryOperator(String s) {
name = s;
}
public boolean equalsName(String otherName) {
return (otherName == null) ? false : name.equals(otherName);
}
@Override
public String toString() {
return this.name;
}
}
public UnaryExpression(SourceLocation loc, UnaryOperator op, Expression inner) {
super(loc);
this.expression = inner;
this.op = op;
}
public Expression getExpression() {
return expression;
}
public UnaryOperator getOp() {
return op;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("(");
sb.append(this.op);
sb.append(this.expression);
sb.append(")");
return sb.toString();
}
@Override
public Set<IdentifierExpression> getUseIdentifierExpressions() {
return expression.getUseIdentifierExpressions();
}
@Override
public Set<Variable> getDefVariables() {
// because this can't happen on the left.
Set<Variable> used = new HashSet<Variable>();
return used;
}
@Override
public Type getType() {
switch (op) {
case LNot: {
return BoolType.instance();
}
case Neg: {
return expression.getType();
}
}
throw new RuntimeException("Unknown case " + op);
}
@Override
public UnaryExpression deepCopy() {
return new UnaryExpression(getSourceLocation(), op, expression.deepCopy());
}
@Override
public UnaryExpression substitute(Map<Variable, Variable> subs) {
return new UnaryExpression(getSourceLocation(), op, expression.substitute(subs));
}
@Override
public UnaryExpression substituteVarWithExpression(Map<Variable, Expression> subs) {
return new UnaryExpression(getSourceLocation(), op, expression.substituteVarWithExpression(subs));
}
}