【问题标题】:Eclipse JDT AST: How to write generated AST to java file?Eclipse JDT AST:如何将生成的 AST 写入 java 文件?
【发布时间】:2012-04-13 21:53:28
【问题描述】:

我目前正在使用 eclipse AST 来生成源代码。除了大多数示例之外,我是在独立应用程序中从头开始生成源代码,而不是使用 Eclipse 插件。

从 ASTParser 读入时,您可以通过调用 recordModifications() 来激活修改,但这在 AST 是从头开始创建时不起作用,例如致电newCompilationUnit()

因此,无法通过DocumentTextEdit 将源代码写入文件 - 有一个异常表明尚未启用修改记录。
从头开始生成 AST 并写入文件的任何经验? 谢谢!

【问题讨论】:

  • 在为 Java 打印可编译的 AST 方面拥有丰富的经验,但在 Eclipse 方面却没有。您的问题需要 Eclipse 吗?
  • 为什么要将“生成的 AST”写入文件?也许它只是措辞,但我得到的印象是您想将漂亮打印的源文本写入文件,该源文本是从 AST 生成的。
  • 好吧,我正在使用 Eclipse,因为它被广泛使用,并且“Java 开发工具”(JDT) AST 实现允许往返工程,因此您可以从内存中生成代码AST,或者您可以通过进行最小的更改来修改现有的源代码。在这种情况下,“生成”意味着 AST 以编程方式构建在内存中。
  • 你实际上并没有回答我的问题。
  • 可能我没有理解正确。我没有严格绑定到 Eclipse,实际上我只使用 Eclipse 项目中的一个库。所以:不,Eclipse 不是必需的。是的,我想将漂亮打印的源文本写入文件,源文本是从 AST 生成的。然而,一个要求是 AST 以读/写方式工作,因此它允许修改现有源代码以及从头开始生成源代码。

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


【解决方案1】:

为什么不先创建文件,然后从中生成 AST,如下所示:

ICompilationUnit unit = JavaCore.createCompilationUnitFrom(file);
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setResolveBindings(true);
parser.setSource(unit);
// Parse the source code and generate an AST.
CompilationUnit ast = (CompilationUnit) parser.createAST(null);

如果文件是新创建的并且是空白的,那么推测 AST 将是空的,然后您可以替换 ast 对象的根并将其写入文件。此外,如果您没有绑定到 Eclipse,您可以使用 JSR199 标准做同样的事情,并以正常方式将该 AST 写入文件。简介见here

【讨论】:

  • 您能否举一个“然后您可以替换 ast 对象的根并将其写入文件”的示例。部分?
  • 嗯。我不确定我在那里是否很清楚。如果您已经生成了 Java 代码文件,那么我上面代码中的 file 是一个真正的 Java 文件,那么我在这里给出的代码应该正确解析它并为您提供一个您可以使用的 AST...
【解决方案2】:

感谢您的建议! 与此同时,我找到了一种通过内部类“ASTFlatener”发出源代码的方法,该类创建了一个 AST 的字符串表示。这对我来说效果很好....

【讨论】:

  • 这是最好的答案,因为您得到了一个字符串,因此回答了更一般的问题“如何从 AST 中获取字符串?”。如果根本不需要文件(用于测试,作为中间结果,..),它特别有用。
【解决方案3】:

我一直在努力寻找同一个问题的答案。 根据上面的答案,到目前为止我发现的最优雅的解决方案如下:

ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setCompilerOptions(....);

Document document = new Document("");
parser.setSource(document.get().toCharArray());
CompilationUnit unit = (CompilationUnit)parser.createAST(null);
unit.recordModifications();

TextEdit edits = unit.rewrite(document, null);
edits.apply(document);

// now write document.get() to file

【讨论】:

    【解决方案4】:

    如果您从头开始生成源代码,也许您可​​以编写能够解析到临时文件的最小源代码,将您的修改应用于 Ast,然后像您一样将其作为文本编辑写回该文件否则。然后阅读源码。然后,您可以将其转移到您想要的任何地方。

    可能有一个更优雅的解决方案,但这可能会奏效。

    【讨论】:

      【解决方案5】:

      从 AST 创建编译单元后,我正在做:

      AST ast = AST.newAST(AST.JLS4);    
      CompilationUnit unit = ast.newCompilationUnit();
      

      ...填充编译单元,然后...

      package.createCompilationUnit(className + ".java", unit.toString(), true, null);
      

      其中:
      package = IPackageFragment
      className = String(生成的类名)
      unit => CompilationUnitast
      true =>强制替换
      null => 进度监视器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        相关资源
        最近更新 更多