绑定不能解决eclipse中的AST处理问题

Shi*_*hen 7 java eclipse parsing

我正在使用eclipse JDT AST解析器来处理一些Java代码,并试图提取字段和方法声明的类型绑定.这样做的逻辑在我的Visitor类中(见下文).不幸的是,我没有任何运气,也没有任何绑定解析(它们始终为空).有趣的是,绑定确实与eclipse ASTView插件在相同的代码上工作.我究竟做错了什么?

这里有一些相关的代码片段,希望能帮助有人弄清楚发生了什么!

ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(source);
parser.setResolveBindings(true);
CompilationUnit unit = (CompilationUnit) parser.createAST(null);

GenericVisitor visitor = new GenericVisitor(outDir + "//" + file.getName() + ".xml");
visitor.process(unit);


public class GenericVisitor extends ASTVisitor 
{
    public void endVisit(FieldDeclaration node) 
    {
        String bindingInfo = "";    
        ITypeBinding binding = node.getType().resolveBinding();

        if(binding == null)
        {                    
         System.out.println("field declaration binding = null");
        }
        else
        {
         bindingInfo = binding.getQualifiedName();
        }

        endVisitNode(node, bindingInfo); 
    }

    public void endVisit(MethodInvocation node) 
    {
         String bindingInfo = "";   
         IMethodBinding binding = node.resolveMethodBinding();

     if(binding == null)
     {                    
        System.out.println("method binding = null");
     }
     else
     {
         bindingInfo = binding.toString();
     }

    endVisitNode(node, bindingInfo); 
    }
} 
Run Code Online (Sandbox Code Playgroud)

Ida*_*Ida 8

当你使用:parser.setSource(source); 什么是param"source"的类型?

绑定信息从Java模型获得.这意味着编译单元必须相对于Java模型.当源代码来自setSource(ICompilationUnit)或setSource(IClassFile)时,会自动发生这种情况.当source由setSource(char [])提供时,必须通过调用setProject(IJavaProject)和setUnitName(String)显式地创建该位置.

这是来自http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/ASTParser.html 我想想也许你只需要使用setSource(char [])而不需要调用setProject(IJavaProject)和setUnitName(String)

  • 还可以使用parser.setEnvironment(...):“设置没有IJavaProject可用时可以使用的环境。” (2认同)

sat*_*esh 2

可能的原因是您不应该直接调用 Visitor 实例中的方法。你应该做类似的事情:

unit.accept(visitor);
Run Code Online (Sandbox Code Playgroud)

CompilationUnit的父类ASTNode有一个接受方法,该方法接受ASTVisitor类型的访问者。

您编写的 Visitor GenericVisitor确实对抽象类ASTVisitor进行子类化,并覆盖您感兴趣的节点类型的实现。因此,我认为更改代码以上述形式进行调用可以解决您的问题。