package com.github.signed.pmd.abstractions;
import java.util.List;
import java.util.regex.Pattern;
import com.beust.jcommander.internal.Lists;
import net.sourceforge.pmd.lang.java.ast.ASTArguments;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration;
import net.sourceforge.pmd.lang.java.ast.ASTName;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
import net.sourceforge.pmd.lang.java.ast.JavaParserVisitorAdapter;
public class MethodCallExtractor extends JavaParserVisitorAdapter {
private final List<MethodCall> methodCalls = Lists.newArrayList();
@Override
public Object visit(ASTPrimaryExpression node, Object data) {
addCall(node);
return super.visit(node, data);
}
public List<MethodCall> methods() {
return methodCalls;
}
private void addCall(ASTPrimaryExpression node) {
final ASTPrimarySuffix suffix = node.getFirstChildOfType(ASTPrimarySuffix.class);
if (suffix != null && suffix.hasDescendantOfType(ASTArguments.class)) {
final ASTPrimaryPrefix prefix = node.getFirstChildOfType(ASTPrimaryPrefix.class);
final ASTName methodName = prefix.getFirstChildOfType(ASTName.class);
ASTCompilationUnit compilationUnit = node.getParentsOfType(ASTCompilationUnit.class).get(0);
List<ASTImportDeclaration> imports = compilationUnit.findChildrenOfType(ASTImportDeclaration.class);
final TypesInScope typesInScope = new TypesInScope(imports);
methodCalls.add(new MethodCall() {
@Override
public String name() {
return methodName();
}
@Override
public String classMethodIsDeclaredIn() {
return typesInScope.typeByClassName(declaringClass());
}
private String methodName() {
return expression()[1];
}
private String declaringClass() {
return expression()[0];
}
private String[] expression() {
return methodName.getImage().split(Pattern.quote("."));
}
});
}
}
}