package com.google.code.joto.value2java.impl;
import java.util.List;
import com.google.code.joto.ast.beanstmt.BeanAST;
import com.google.code.joto.ast.beanstmt.BeanASTVisitor2;
import com.google.code.joto.ast.beanstmt.BeanAST.AssignExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.BeanExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.BeanStmt;
import com.google.code.joto.ast.beanstmt.BeanAST.BlockStmt;
import com.google.code.joto.ast.beanstmt.BeanAST.ClassExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.ExprStmt;
import com.google.code.joto.ast.beanstmt.BeanAST.FieldExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.IndexedArrayExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.LiteralExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.MethodApplyExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.NewArrayExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.NewObjectExpr;
import com.google.code.joto.ast.beanstmt.BeanAST.VarDeclStmt;
import com.google.code.joto.ast.beanstmt.BeanAST.SimpleNameExpr;
import com.google.code.joto.util.graph.IGraph;
public class VarDefUseDependencyGraphBuilder implements BeanASTVisitor2<Object,BeanAST> {
private IGraph<BeanAST> graph;
// -------------------------------------------------------------------------
public VarDefUseDependencyGraphBuilder(IGraph<BeanAST> graph) {
this.graph = graph;
}
// -------------------------------------------------------------------------
protected void addUseDef(BeanAST use, BeanAST def) {
graph.addLink(def, use);
// graph.addLink(use, def); //????
}
// -------------------------------------------------------------------------
@Override
public Object caseSimpleName(SimpleNameExpr p, BeanAST parent) {
if (p.getResolvedDecl() != null) {
addUseDef(parent, p.getResolvedDecl());
}
return null;
}
@Override
public Object caseVarDecl(VarDeclStmt p, BeanAST parent) {
// do nothing
BeanExpr initExpr = p.getInitExpr();
if (initExpr != null) {
initExpr.visit(this, p);
}
return null;
}
@Override
public Object caseBlock(BlockStmt p, BeanAST parent) {
for(BeanStmt stmt : p.getStmts()) {
stmt.visit(this, p); // p replace parent... when block can not be split ??
}
return null;
}
@Override
public Object caseExprStmt(ExprStmt p, BeanAST parent) {
p.getExpr().visit(this, parent);
return null;
}
@Override
public Object caseClassExpr(ClassExpr p, BeanAST parent) {
// do nothing
return null;
}
@Override
public Object caseFieldExpr(FieldExpr p, BeanAST parent) {
// do nothing
return null;
}
@Override
public Object caseLitteralExpr(LiteralExpr p, BeanAST parent) {
// do nothing
return null;
}
@Override
public Object caseAssign(AssignExpr p, BeanAST parent) {
p.getLhs().visit(this, parent);
p.getRhs().visit(this, parent);
return null;
}
@Override
public Object caseMethodApplyExpr(MethodApplyExpr p, BeanAST parent) {
BeanExpr lhs = p.getLhsExpr();
if (lhs != null) {
lhs.visit(this, parent);
}
doVisitLsExpr(p.getArgs(), parent);
return null;
}
@Override
public Object caseNewArray(NewArrayExpr p, BeanAST parent) {
// do nothing
return null;
}
@Override
public Object caseIndexedArray(IndexedArrayExpr p, BeanAST parent) {
p.getLhs().visit(this, parent);
p.getIndex().visit(this, parent);
return null;
}
@Override
public Object caseNewObject(NewObjectExpr p, BeanAST parent) {
doVisitLsExpr(p.getArgs(), parent);
return null;
}
// -------------------------------------------------------------------------
protected void doVisitLsExpr(List<BeanExpr> ls, BeanAST parent) {
for(BeanExpr elt : ls) {
elt.visit(this, parent);
}
}
}