2009-10-20 218 views
1

是否有一种方法(如果是这样,如何?)递归地遍历一个XPath查询?如何递归遍历XPath?

我在Java中的AST有以下情形

@Relevant 
public void foo() { 
    bar(true); 
} 

public void bar(boolean flag) { 
    assert flag; 
} 

我想找到它标注有“@Relevant”(那很容易)的方法,并检查被称为在FOO的方法(这里吧)确实有一个assert语句。

所以a)如何提取方法名称'bar'并通过XPath询问名为'bar'的方法?

以及如果'bar'实际调用assert发生的'bla'会怎么样?

希望这是可以理解的......

感谢所有帮助

+1

目前还不清楚你的AST格式是什么。我假设你创建了它的XML配置。如果这是正确的,请提供有关您使用的方法调用和断言语句定义的更多详细信息。 我可以说我玩过javac源代码(可以从OpenJDK项目中获得),它们以编程方式构建AST(以JCTree.JCCompilationUnit格式 - http://xref.jsecurity.net/openjdk-6/langtools/dd/d25/ classcom_1_1sun_1_1tools_1_1javac_1_1tree_1_1_j_c_tree_1_1_j_c_compilation_unit.html)。通过该API然后使用JCTree.JCCompilationUnit.accept(Visitor)很容易完成您的任务。 – 2009-10-20 09:08:15

+0

的目的实际上是为PMD创建一个XPath规则。 由于情况,我不能使用Java的实现。 所以无论是在XPath中是可能的还是我必须忘记整个想法;-) 谢谢无论如何 – Marty 2009-10-21 11:11:28

回答

0

一个XPath是不够的,你要完成的任务。首先,您需要一个类型绑定(例如,用于查找bar()方法声明)。其次,您需要开发某种类型的静态代码分析器,它以递归方式在AST上运行,并试图满足条件,即调用堆栈中的“存在断言表达式”。

您可以查看Eclipse JDT源代码,了解如何实现类型绑定。一旦你有一个绑定,你可以调用你的逻辑。