Macros Groovy只能在类和方法上创建宏吗?

Macros Groovy只能在类和方法上创建宏吗?,macros,groovy,Macros,Groovy,在我看来(来自Groovy in Action第二版),Groovy只能将AST作为可能的AST的一个特定子集来操作—类、方法、字段定义等。但是,似乎不可能对任何其他代码段进行注释/操作 这个观察正确吗 为什么会这样?这就是为什么我不能注释任何表达式 是否有计划允许至少对闭包进行注释 例如,我想做这样的事情 def some_method() { @with_resource(my_resource) { // do something } } 使用类,您可以

在我看来(来自Groovy in Action第二版),Groovy只能将AST作为可能的AST的一个特定子集来操作—类、方法、字段定义等。但是,似乎不可能对任何其他代码段进行注释/操作

  • 这个观察正确吗
  • 为什么会这样?这就是为什么我不能注释任何表达式
  • 是否有计划允许至少对闭包进行注释
  • 例如,我想做这样的事情

    def some_method() {
        @with_resource(my_resource) {
             // do something
        }
    }
    
    使用类,您可以检测闭包并执行您想要修改它的任何操作。这是一个

    AST允许您修改代码中的任何内容,并允许您构建功能强大的工具。浏览手术室并亲自查看

    编辑:我们讨论的是注释,而不是纯AST,这里有一个附录

    不能对代码块(或闭包)进行注释,这不是Groovy AST的限制,这是Java的限制,因为注释的目标仅限于这些

    你能做的是:

    def some_method(@with_resource(my_resource) Closure cl) {
        cl.call()
    }
    

    不,您还可以对属性和脚本变量进行注释。在我的脑海中,
    @Lazy
    @Field
    是两个例子。同样,这需要一个方法作为输入。我想在一个方法中转换一个闭包。请给出一个你认为你不能做的例子。我想我并没有真正理解您的观点,因为您在介绍它时,我认为我的_资源被认为是一个方法调用,而不是闭包本身。ASTTransformation可以做任何您想做的事情,但是注释仅限于Java所限于的:类、方法和字段等,所谓的my_资源只是指应该操作的资源。只需假设给定给@with_资源的块将打开一个数据库连接,在其上执行给定的块,然后再次关闭它,并将所有内容包装到一个try-catch块中