前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

作者头像
韩曙亮
发布2023-03-30 11:05:51
2020
发布2023-03-30 11:05:51
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、ASTTransformation#visit 方法简介


在上一篇博客 【Groovy】编译时元编程 ( 编译 ASTTransformation | 打包 ASTTransformation 字节码文件 | 编译 Groovy 类同进行编译时处理 ) 中 , 写的进行 Groovy 编译时处理 ASTTransformation 如下 :

代码语言:javascript
复制
import org.codehaus.groovy.ast.ASTNode
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.transform.ASTTransformation
import org.codehaus.groovy.transform.GroovyASTTransformation

@GroovyASTTransformation
class MyASTTransformation implements ASTTransformation {
    /**
     * 编译时处理方法
     * @param nodes AST 抽象语法树节点 , 是 ASTNode 数组类型
     * @param source 源单元 , 可以通过该对象拿到源文件
     */
    @Override
    void visit(ASTNode[] nodes, SourceUnit source) {
        println nodes
        println source
    }
}

打印结果为 :

代码语言:javascript
复制
[org.codehaus.groovy.ast.ModuleNode@2609b277]
org.codehaus.groovy.control.SourceUnit@1fd14d74

在 visit 方法中 , ASTNode[] nodes 参数是 AST 语法树根节点 , SourceUnit source 参数代表源码 ;

二、org.codehaus.groovy.ast.ModuleNode 脚本节点


ASTNode[] nodes 参数是 AST 语法树节点 , 该数组的值是

代码语言:javascript
复制
[org.codehaus.groovy.ast.ModuleNode@2609b277]

AST 语法树节点是 org.codehaus.groovy.ast.ModuleNode 类型对象 ;

org.codehaus.groovy.ast.ModuleNode 是 Groovy 脚本的语法树节点 ;

  • 其内部封装的 List<ClassNode> classes = new LinkedList<ClassNode>(); 成员表示该脚本中定义了多少个 Groovy 类节点 ;
  • private List<MethodNode> methods = new ArrayList<MethodNode>(); 成员表示该脚本中有多少个方法 ;
  • private Map<String, ImportNode> imports = new HashMap<String, ImportNode>(); 成员表示导入了多少类 ;

通过 ModuleNode 类 , 可以拿到 Groovy 脚本中几乎所有的内容 ;

org.codehaus.groovy.ast.ModuleNode 原型如下 :

代码语言:javascript
复制
/**
 * 表示一个模块,该模块通常由一个类声明组成,
 * 但可以包括一些导入、一些语句和多个类,
 * 这些类与Python或Ruby中的脚本等语句混合在一起
 *
 * @author Jochen Theodorou
 * @author Paul King
 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
 */
public class ModuleNode extends ASTNode implements Opcodes {

    private BlockStatement statementBlock = new BlockStatement();
    List<ClassNode> classes = new LinkedList<ClassNode>();
    private List<MethodNode> methods = new ArrayList<MethodNode>();
    private Map<String, ImportNode> imports = new HashMap<String, ImportNode>();
    private List<ImportNode> starImports = new ArrayList<ImportNode>();
    private Map<String, ImportNode> staticImports = new LinkedHashMap<String, ImportNode>();
    private Map<String, ImportNode> staticStarImports = new LinkedHashMap<String, ImportNode>();
    private CompileUnit unit;
    private PackageNode packageNode;
    private String description;
    private boolean createClassForStatements = true;
    private transient SourceUnit context;
    private boolean importsResolved = false;
    private ClassNode scriptDummy;
    private String mainClassName = null;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、ASTTransformation#visit 方法简介
  • 二、org.codehaus.groovy.ast.ModuleNode 脚本节点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档