java - 如何使用 Java 9+ 修改 AST

标签 java abstract-syntax-tree javac java-9 java-11

<分区>

我一直在尝试使用注释处理器修改 AST。我尝试扩展 Lombok,但这似乎太难了,所以我决定使用 com.sun.source.* 和 com.sun.tools.javac.* 中的内容,但是,我使用的是 java 11,以及我正在学习的文档, “Javac 黑客指南” http://scg.unibe.ch/archive/projects/Erni08b.pdf ,使用 Java 6。他们使用的 api 现在是内部的,我的模块无法读取它。

在 IntelliJ 中,它给了我一些错误,但我点击了建议(上面写着“添加 --Xxx-xxx 到 xxx”之类的东西)而没有注意它们。当我尝试用 Maven 编译时,它失败了,因为该模块不读取 jdk.compiler 的内部结构。

这些是我的一些导入:

    import com.sun.source.util.Trees;
    import com.sun.tools.javac.tree.JCTree;
    import com.sun.tools.javac.tree.TreeMaker;
    import com.sun.tools.javac.tree.TreeTranslator;
    import com.sun.tools.javac.util.Context;

我的模块信息文件包含

    requires jdk.compiler;
    requires java.compiler;

我收到类似“[ERROR]package com.sun.tools.javac.util is declared in module jdk.compiler, which does not export it to module OtherAnnot”和“[ERROR] (package com.sun.tools .javac.tree 在模块 jdk.compiler 中声明,它不会将其导出到模块 OtherAnnot)"

编辑:我猜这是重复的,但我想知道在 Java 9 中是否有一些用于 AST 转换的替代 API。

最佳答案

随着 Project Jigsaw 的推出,JDK 已经模块化,允许用户创建自己的模块。这些模块允许您导出您的包,允许需要您的模块的程序(在它们的 module-info.java 中)使用导出的包。

理想情况下,您将被禁止使用驻留在导出的包中的类。但是,为了不破坏向后兼容性,引入了 VM 标志,允许您将包(不属于您)强制导出到您的模块。

鉴于您的错误消息,要添加的相应 VM 标志是:

--add-exports jdk.compiler/com.sun.tools.javac.tree=OtherAnnot

这里的模式是:

--add-exports THEIR_MODULE/THEIR_PACKAGE=YOUR_MODULE

如果编译器提示包未导出到未命名模块,那么您可以使用以下命令:

--add-exports THEIR_MODULE/THEIR_PACKAGE=ALL-UNNAMED

关于java - 如何使用 Java 9+ 修改 AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57420268/

相关文章:

java如何获取特定用户的最新推文

java - 如何在 Eclipse JDT 中保留注释

javac - javac编译错误

SQL 数据库连接中的 java.sql.SQLSyntaxErrorException

java - 如何通过 cmd 将输入作为文件提供给 jar 应用程序?

java - 如何重新分配一维数组中的值?

parsing - Antlr:如果重复列表,我可以以不同的方式重写树吗

python - 如何使用 ast.NodeTransformer 将 List Comprehensions 转换为 For Loops?

java - 使用 ant 任务编译 Groovy 文件

Javac版本没有更新