首页 > 解决方案 > 如何在 Java AST 中返回泛型类型

问题描述

我正在编写一个程序来修改 Java 抽象语法树 (AST),但我不知道如何生成通用返回类型。谁能帮我?

生成的方法如下所示:

public static List<String> converter() {
     return new ArrayList<String>();
}

我正在使用 com.sun.tools.javac.tree.TreeMaker.MethodDef() 来生成方法的 JCTree,如下所示:

return treeMaker.MethodDef(
                modifiers,
                method,
                returnType,
                List.nil(),
                List.nil(),
                List.nil(),
                methodBody,
                null
        );

一切都很好,但问题是“returnType”参数

它是一个 JCExpression 类型,我只能设置为“java.util.List”。

我该如何设置它List<String>

似乎没有人回答我。我应该怎么办?

标签: javaabstract-syntax-tree

解决方案


用. returnType_TreeMaker.TypeApply(JCExpression, List<JCExpression>)


例如:

JCTree.JCMethodDecl method = treeMaker.MethodDef(
        treeMaker.Modifiers(Flags.PUBLIC | Flags.STATIC),
        names.fromString("getStrings"),
        treeMaker.TypeApply(
                treeMaker.QualIdent((Symbol) elements.getTypeElement("java.util.List")),
                List.of(treeMaker.QualIdent((Symbol) elements.getTypeElement("java.lang.String")))
        ),
        List.nil(),
        List.nil(),
        List.nil(),
        treeMaker.Block(
            0,
            List.of(treeMaker.Return(
                treeMaker.NewClass(
                    null,
                    List.nil(),
                    treeMaker.TypeApply(
                        treeMaker.QualIdent((Symbol) elements.getTypeElement("java.util.List")),
                        List.of(treeMaker.QualIdent((Symbol) elements.getTypeElement("java.lang.String")))
                    ),
                    List.nil(),
                    null
                )
            ))
        ),
        null
    );

会产生这样的东西:

public static java.util.List<java.lang.String> getStrings() {
    return new java.util.List<java.lang.String>();
}

推荐阅读