【问题标题】:Extracting data from Eclipse's JDT visitor pattern从 Eclipse 的 JDT 访问者模式中提取数据
【发布时间】:2017-01-05 16:02:43
【问题描述】:

所以我正在使用 Eclipse 的 JDT API 并尝试构建一个小型应用程序。但是,我在从访问的节点中提取数据时遇到了困难,因为我只能打印它们。

例如,我希望能够将 getSuperclassType() 的值返回或添加到 List 或 HashMap。然而,由于新的 ASTVisitor 是一个内部类,Java 不允许我在没有 final 关键字的情况下声明一个在 ASTVisitor 内部使用的对象。

private static void get(String src) {
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(src.toCharArray());
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setResolveBindings(true);
    parser.setBindingsRecovery(true);

    final CompilationUnit cu = (CompilationUnit) parser.createAST(null);

    cu.accept(new ASTVisitor() {
        Set names = new HashSet();

        public boolean visit(TypeDeclaration typeDecNode) {
            if(!typeDecNode.isInterface()) {
                System.out.println(typeDecNode.getName().toString());
                System.out.println(typeDecNode.getSuperclassType());
                System.out.println(typeDecNode.superInterfaceTypes().toString());

                return true;
            }
...

是否可以通过这样的一段代码将每个访问节点的所需数据存储到数据结构中?或者也许是另一种在不使用访问者模式的情况下从 AST 遍历节点的方法?

【问题讨论】:

    标签: java abstract-syntax-tree eclipse-jdt visitor-pattern


    【解决方案1】:

    只需使用扩展 ASTVisitor 的普通类作为访问者,而不是您当前使用的匿名类,并在类中存储您喜欢的任何内容。

    例如对于像这样的超类型:

    class MyVisitor extends ASTVisitor
    {
      private List<Type> superTypes = new ArrayList<>();
    
      @Override
      public boolean visit(TypeDeclaration typeDecNode) {
           if(!typeDecNode.isInterface()) {
                superTypes.add(typeDecNode.getSuperclassType());
                return true;
           }
      }
    
      List<Type> getSuperTypes() {
         return superTypes;
      }
    }
    

    并用于:

    MyVisitor myVisitor = new MyVisitor();
    
    cu.accept(myVisitor);
    
    List<Type> superTypes = myVisitor.getSuperTypes();
    

    或者,您可以像这样在匿名类中访问final 列表:

    final List<Type> superTypes = new ArrayList<>();
    
    cu.accept(new ASTVisitor() {
         public boolean visit(TypeDeclaration typeDecNode) {
            if(!typeDecNode.isInterface()) {
                superTypes.add(typeDecNode.getSuperclassType());
    
                return true;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2022-12-04
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多