/** * */ package soottocfg.cfg.statement; import java.io.Serializable; import java.util.HashSet; import java.util.Map; import java.util.Set; import soottocfg.cfg.Node; import soottocfg.cfg.SourceLocation; import soottocfg.cfg.expression.Expression; import soottocfg.cfg.expression.IdentifierExpression; import soottocfg.cfg.variable.Variable; /** * @author schaef * */ public abstract class Statement implements Node, Serializable { /** * */ private static final long serialVersionUID = 4810592044342837988L; public SourceLocation getSourceLocation() { return sourceLocation; } private final SourceLocation sourceLocation; public Statement(SourceLocation loc) { this.sourceLocation = loc; } public Set<IdentifierExpression> getIdentifierExpressions() { Set<IdentifierExpression> res = new HashSet<>(); res.addAll(getUseIdentifierExpressions()); res.addAll(getDefIdentifierExpressions()); return res; } public abstract Set<IdentifierExpression> getUseIdentifierExpressions(); public abstract Set<IdentifierExpression> getDefIdentifierExpressions(); public Set<Variable> getUseVariables() { Set<Variable> res = new HashSet<Variable>(); for (IdentifierExpression ie : getUseIdentifierExpressions()) { res.add(ie.getVariable()); } return res; } public Set<Variable> getDefVariables() { Set<Variable> res = new HashSet<Variable>(); for (IdentifierExpression ie : getDefIdentifierExpressions()) { res.add(ie.getVariable()); } return res; } public Set<Variable> getAllVariables() { Set<Variable> res = new HashSet<Variable>(); for (IdentifierExpression ie : getIdentifierExpressions()) { res.add(ie.getVariable()); } return res; } public int getJavaSourceLine() { if (sourceLocation == null) { return -1; } return this.sourceLocation.getLineNumber(); } public abstract Statement deepCopy(); /** * Returns a deep copy of the statement where all * variables in the map have been substituted. * @param subs */ public abstract Statement substitute(Map<Variable, Variable> subs); /** * Returns a deep copy of the statement where all * variables in the map have been substituted by the expression * they map to. * @param subs */ public abstract Statement substituteVarWithExpression(Map<Variable, Expression> subs); }