package net.sourceforge.pmd.eclipse.ui.views.ast;
import java.util.HashMap;
import java.util.Map;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.ASTAnnotation;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTThrowStatement;
import net.sourceforge.pmd.lang.java.ast.Comment;
/**
* For nodes higher in the tree that don't have any identifying information
* we can walk their children and derive some in Java-like form. The idea is
* to help keep the number of child nodes that need to be visible to a minimum.
*
* @author Brian Remedios
*/
public class NodeImageDeriver {
private static NodeImageDeriver compilationUnitDeriver = new NodeImageDeriver(ASTCompilationUnit.class) {
public String deriveFrom(Node node) {
dumpComments((ASTCompilationUnit)node);
return "Comments: " + ((ASTCompilationUnit)node).getComments().size();
}
};
private static NodeImageDeriver importDeriver = new NodeImageDeriver(ASTImportDeclaration.class) {
public String deriveFrom(Node node) {
// TODO show package name as well?
return ((ASTImportDeclaration)node).getImportedName();
}
};
private static NodeImageDeriver methodDeclarationDeriver = new NodeImageDeriver(ASTMethodDeclaration.class) {
public String deriveFrom(Node node) {
return ASTUtil.getMethodLabel((ASTMethodDeclaration)node, true);
}
};
private static NodeImageDeriver throwStatementDeriver = new NodeImageDeriver(ASTThrowStatement.class) {
public String deriveFrom(Node node) {
return ((ASTThrowStatement)node).getFirstClassOrInterfaceTypeImage();
}
};
private static NodeImageDeriver fieldDeclarationDeriver = new NodeImageDeriver(ASTFieldDeclaration.class) {
public String deriveFrom(Node node) {
return ASTUtil.getFieldLabel((ASTFieldDeclaration)node);
}
};
private static NodeImageDeriver localVariableDeclarationDeriver = new NodeImageDeriver(ASTLocalVariableDeclaration.class) {
public String deriveFrom(Node node) {
return ASTUtil.getLocalVarDeclarationLabel((ASTLocalVariableDeclaration)node);
}
};
private static NodeImageDeriver annotationDeriver = new NodeImageDeriver(ASTAnnotation.class) {
public String deriveFrom(Node node) {
return ASTUtil.getAnnotationLabel((ASTAnnotation)node);
}
};
private static final NodeImageDeriver[] AllDerivers = new NodeImageDeriver[] {
importDeriver, methodDeclarationDeriver, localVariableDeclarationDeriver, fieldDeclarationDeriver, annotationDeriver,
compilationUnitDeriver, throwStatementDeriver
};
private static final Map<Class<?>, NodeImageDeriver>DeriversByType = new HashMap<Class<?>, NodeImageDeriver>(NodeImageDeriver.AllDerivers.length);
public final Class<?> target;
public NodeImageDeriver(Class<?> theASTClass) {
target = theASTClass;
}
public String deriveFrom(Node node) {
return null; // failed to implement!
}
private static void dumpComments(ASTCompilationUnit node) {
for (Comment comment : node.getComments()) {
System.out.println(comment.getClass().getName());
System.out.println(comment.getImage());
}
}
static {
for (NodeImageDeriver deriver : NodeImageDeriver.AllDerivers) {
DeriversByType.put(deriver.target, deriver);
}
}
public static String derivedTextFor(Node node) {
NodeImageDeriver deriver = DeriversByType.get(node.getClass());
return deriver == null ? null : deriver.deriveFrom(node);
}
}