package soottocfg.cfg.util; import java.util.List; import soottocfg.cfg.expression.BinaryExpression; import soottocfg.cfg.expression.Expression; import soottocfg.cfg.expression.IdentifierExpression; import soottocfg.cfg.expression.IteExpression; import soottocfg.cfg.expression.TupleAccessExpression; import soottocfg.cfg.expression.UnaryExpression; import soottocfg.cfg.expression.literal.BooleanLiteral; import soottocfg.cfg.expression.literal.IntegerLiteral; import soottocfg.cfg.expression.literal.NullLiteral; import soottocfg.cfg.method.CfgBlock; import soottocfg.cfg.method.Method; import soottocfg.cfg.statement.AssertStatement; import soottocfg.cfg.statement.AssignStatement; import soottocfg.cfg.statement.AssumeStatement; import soottocfg.cfg.statement.CallStatement; import soottocfg.cfg.statement.NewStatement; import soottocfg.cfg.statement.PullStatement; import soottocfg.cfg.statement.PushStatement; import soottocfg.cfg.statement.Statement; public abstract class CfgVisitor { protected Method currentMethod = null; protected void setCurrentMethod(Method m) { currentMethod = m; } protected Method getCurrentMethod() { return currentMethod; } // IF you override this, you must include the setCurrentMethod calls in the // overridden fn protected void processMethod(Method m) { setCurrentMethod(m); for (CfgBlock b : m.vertexSet()) { processCfgBlock(b); } setCurrentMethod(null); } private CfgBlock currentCfgBlock = null; protected void setCurrentCfgBlock(CfgBlock c) { currentCfgBlock = c; } protected CfgBlock getCurrentCfgBlock() { return currentCfgBlock; } protected abstract void processCfgBlock(CfgBlock block); public CfgVisitor() { } protected Statement processStatement(Statement s) { if (s instanceof AssertStatement) { return processStatement((AssertStatement) s); } else if (s instanceof AssignStatement) { return processStatement((AssignStatement) s); } else if (s instanceof AssumeStatement) { return processStatement((AssumeStatement) s); } else if (s instanceof CallStatement) { return processStatement((CallStatement) s); } else if (s instanceof PullStatement) { return processStatement((PullStatement) s); } else if (s instanceof PushStatement) { return processStatement((PushStatement) s); } else if (s instanceof NewStatement) { return processStatement((NewStatement) s); } else { throw new RuntimeException("unexpected statement type: " + s); } } protected abstract List<Statement> processStatementList(List<Statement> sl); protected abstract Statement processStatement(AssignStatement s); protected abstract Statement processStatement(AssertStatement s); protected abstract Statement processStatement(AssumeStatement s); protected abstract Statement processStatement(CallStatement s); protected abstract Statement processStatement(PullStatement s); protected abstract Statement processStatement(PushStatement s); protected abstract Statement processStatement(NewStatement s); protected Expression processExpression(Expression e) { if (e instanceof BinaryExpression) { return processExpression((BinaryExpression) e); } else if (e instanceof BooleanLiteral) { return processExpression((BooleanLiteral) e); } else if (e instanceof IdentifierExpression) { return processExpression((IdentifierExpression) e); } else if (e instanceof IntegerLiteral) { return processExpression((IntegerLiteral) e); } else if (e instanceof IteExpression) { return processExpression((IteExpression) e); } else if (e instanceof UnaryExpression) { return processExpression((UnaryExpression) e); } else if (e instanceof NullLiteral) { return processExpression((NullLiteral) e); } else if (e instanceof TupleAccessExpression) { return processExpression((TupleAccessExpression) e); } else { throw new RuntimeException("unexpected expression type: " + e); } } protected abstract List<Expression> processExpressionList(List<Expression> el); protected abstract Expression processExpression(BinaryExpression e); protected abstract Expression processExpression(BooleanLiteral e); protected abstract Expression processExpression(IdentifierExpression e); protected abstract Expression processExpression(IntegerLiteral e); protected abstract Expression processExpression(IteExpression ite); protected abstract Expression processExpression(UnaryExpression e); protected abstract Expression processExpression(NullLiteral e); protected abstract Expression processExpression(TupleAccessExpression e); }