Javaparser:如何获取节点所属方法的名称?
对于赋值,我必须在java类中找到满足特定要求(无用)的节点。我知道如何找到所需的节点并将它们添加到一个单独的列表中,但分配要求我在原始java类中列出这些节点所属的方法名。javaparser是否提供了实现这一点的方法 我的代码:Javaparser:如何获取节点所属方法的名称?,java,javaparser,Java,Javaparser,对于赋值,我必须在java类中找到满足特定要求(无用)的节点。我知道如何找到所需的节点并将它们添加到一个单独的列表中,但分配要求我在原始java类中列出这些节点所属的方法名。javaparser是否提供了实现这一点的方法 我的代码: public class UselessControlFlowDetector extends VoidVisitorAdapter <Void> { public static List<Node> ucfNodes = new
public class UselessControlFlowDetector extends VoidVisitorAdapter <Void> {
public static List<Node> ucfNodes = new ArrayList<Node>();
@Override
public void visit(MethodDeclaration md, Void arg) {
super.visit(md, arg);
String methodName = md.getName().asString();
int begin = md.getRange().get().begin.line;
int end =md.getRange().get().end.line;
int length = end-begin;
System.out.println(methodName+"|"+length);
List<IfStmt> nodeListIf = md.findAll(IfStmt.class);
System.out.println(nodeListIf.toString());
}
public static void findUselessNodes(CompilationUnit cu) {
//NODE LISTS
List<IfStmt> nodeListIf = cu.findAll(IfStmt.class);
List<ForStmt> nodeListFor = cu.findAll(ForStmt.class);
List<SwitchStmt> nodeListSwitch = cu.findAll(SwitchStmt.class);
List<WhileStmt> nodeListWhile = cu.findAll(WhileStmt.class);
List<DoStmt> nodeListDo = cu.findAll(DoStmt.class);
List<Node> nodeListTotal = new ArrayList<Node>();
nodeListTotal.addAll(nodeListIf);
nodeListTotal.addAll(nodeListFor);
nodeListTotal.addAll(nodeListSwitch);
nodeListTotal.addAll(nodeListWhile);
nodeListTotal.addAll(nodeListDo);
for(int i = 0; i < nodeListTotal.size(); i++) {
//System.out.println("STARTOFNODE##########");
//System.out.println(nodeListTotal.get(i).toString());
//System.out.println("\n" + "Node has " + (nodeListTotal.get(i).getChildNodes().size() - 1) + " child nodes!");
for(int j = 1; j < nodeListTotal.get(i).getChildNodes().size(); j++) {
//System.out.println("----------");
//System.out.println("Child Node " + j);
if(nodeListTotal.get(i).getChildNodes().get(j).toString().equals("{\r\n" +
"}")) {
//System.out.println("Node is empty! Useless control flow found!");
System.out.println(nodeListTotal.get(i).getRange().get().begin.line);
System.out.println(nodeListTotal.get(i).getRange().get().end.line);
//System.out.println(nodeListTotal.get(i).getParentNode());
ucfNodes.add(nodeListTotal.get(i));
}else {
//System.out.println(nodeListTotal.get(i).getChildNodes().get(j));
}
//System.out.println("----------");
}
//System.out.println("ENDOFNODE##########");
}
System.out.println("\n" + "Useless nodes found: " + ucfNodes.size());
for(int i = 0; i < ucfNodes.size(); i++) {
System.out.println("----------");
System.out.println("Useless Node #" + (i+1));
System.out.println(ucfNodes.get(i));
System.out.println("----------");
for(int j = 1; j < ucfNodes.get(i).getChildNodes().size(); j++) {
if(ucfNodes.get(i).getChildNodes().get(j).toString().equals("{\r\n" +
"}")) {
System.out.println("Child Node " + j + " is empty!");
System.out.println("----------");
}
}
}
}
public static class Driver {
private static final String FILE_PATH = "src/main/java/main/Calculator.java";
public static void run(){
try {
CompilationUnit cu = JavaParser.parse(new FileInputStream(FILE_PATH));
findUselessNodes(cu);
VoidVisitor<?> methodVisitor = new MethodAnalyser();
methodVisitor.visit(cu, null);
}catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Driver.run();
}
}
公共类UselessControlFlowDetector扩展了VoidVisitorAdapter{
public static List ucfNodes=new ArrayList();
@凌驾
公共无效访问(方法声明md、无效参数){
超级访问(md、arg);
String methodName=md.getName().asString();
int begin=md.getRange().get().begin.line;
int end=md.getRange().get().end.line;
int长度=结束-开始;
System.out.println(methodName+“|”+长度);
列表nodeListIf=md.findAll(IfStmt.class);
System.out.println(nodeListIf.toString());
}
公共静态void findUserNodes(编译单元cu){
//节点列表
List nodeListIf=cu.findAll(IfStmt.class);
List nodeListFor=cu.findAll(ForStmt.class);
List nodeListSwitch=cu.findAll(SwitchStmt.class);
List nodeListWhile=cu.findAll(whilestm.class);
列表nodeListDo=cu.findAll(DoStmt.class);
List nodeListTotal=new ArrayList();
nodeListTotal.addAll(nodeListIf);
nodeListTotal.addAll(nodeListFor);
nodeListTotal.addAll(nodeListSwitch);
nodeListTotal.addAll(nodeListWhile);
nodeListTotal.addAll(nodeListDo);
对于(int i=0;i
这是一个有点晚的回答有许多方法可以获得方法名 以下是在
visit()
方法中获取方法名称的方法之一
@Override
public void visit(MethodDeclaration md, Void arg) {
BreadthFirstIterator bfi = new BreadthFirstIterator(md);
while (bfi.hasNext()) {
Node node = bfi.next();
if (node instanceof Modifier) {
System.out.println("Method name: " + bfi.next().toString());
break;
}
}
}
将有更有效和简单的方法。您是否尝试在链上搜索(方法或构造函数)?您需要找到每个节点的祖先满足:
实例BodyDeclaration
和isMethodDeclaration()
。很抱歉,您能给我一个如何实现这一点的示例吗?我尝试了if(parentNode instanceof CallableDeclaration),但它似乎不起作用,它给了我一个错误,说它与节点不兼容。