blob: dd646f110d5b7983289858b34dbe201a2292de13 [file] [log] [blame]
package org.checkerframework.dataflow.cfg;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.LambdaExpressionTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.Tree;
/**
* Represents an abstract syntax tree of type {@link Tree} that underlies a given control flow
* graph.
*
* @author Stefan Heule
*/
public abstract class UnderlyingAST {
public enum Kind {
/** The underlying code is a whole method */
METHOD,
/** The underlying code is a lambda expression */
LAMBDA,
/** The underlying code is an arbitrary Java statement or expression */
ARBITRARY_CODE,
}
protected final Kind kind;
public UnderlyingAST(Kind kind) {
this.kind = kind;
}
/** @return the code that corresponds to the CFG */
public abstract Tree getCode();
public Kind getKind() {
return kind;
}
/** If the underlying AST is a method. */
public static class CFGMethod extends UnderlyingAST {
/** The method declaration */
protected final MethodTree method;
/** The class tree this method belongs to. */
protected final ClassTree classTree;
public CFGMethod(MethodTree method, ClassTree classTree) {
super(Kind.METHOD);
this.method = method;
this.classTree = classTree;
}
@Override
public Tree getCode() {
return method.getBody();
}
public MethodTree getMethod() {
return method;
}
public ClassTree getClassTree() {
return classTree;
}
@Override
public String toString() {
return "CFGMethod(\n" + method + "\n)";
}
}
/** If the underlying AST is a lambda. */
public static class CFGLambda extends UnderlyingAST {
private final LambdaExpressionTree lambda;
public CFGLambda(LambdaExpressionTree lambda) {
super(Kind.LAMBDA);
this.lambda = lambda;
}
@Override
public Tree getCode() {
return lambda.getBody();
}
public LambdaExpressionTree getLambdaTree() {
return lambda;
}
@Override
public String toString() {
return "CFGLambda(\n" + lambda + "\n)";
}
}
/** If the underlying AST is a statement or expression. */
public static class CFGStatement extends UnderlyingAST {
protected final Tree code;
/** The class tree this method belongs to. */
protected final ClassTree classTree;
public CFGStatement(Tree code, ClassTree classTree) {
super(Kind.ARBITRARY_CODE);
this.code = code;
this.classTree = classTree;
}
@Override
public Tree getCode() {
return code;
}
public ClassTree getClassTree() {
return classTree;
}
@Override
public String toString() {
return "CFGStatement(\n" + code + "\n)";
}
}
}