Groovy Transformation:AST Transformation经验谈

Kartik Shah在自己的Blog上介绍了使用AST Transformation的一些技巧

他介绍的技巧如下:

  • 使用Ast查看器查看AST:虽然Groovy 1.7已经大大简化了AST的创建,但是如果是使用AstBuilder.buildFromSpec,你依旧需要了解Statement/Expression API。写出你要产生的目标代码,然后使用AST查看器观察其结构,之后使用API来复制该结构,可以大大的减轻你的工作。Groovy Console和Eclipse都提供了这样的工具。在Groovy Console中启动它的快捷键是“Ctrl+T”。
  • 使用脚本进行观察:拜AstBuilder所赐,我们现在可以很容易的在Groovy Console中使用脚本来产生AST。如果只是想比较产生的和显示的,这种方式最简单,而且非常有用。假设代码如下:
        import org.codehaus.groovy.ast.builder.AstBuilder
        def nodes = new AstBuilder().buildFromCode{
            println 1
        }
        
  • 现在console中运行它,然后键入“ctrl-t”,将弹出以下画面,请留意图中标记出来的部分,这部分对应以上代码的AST。为什么前后会有那么多其他的“噪音”?原因很简单:对于所有Groovy脚本,Groovy都会把它们生成一个类,只有“MethodNode - run”部分才对应你在console中输入的脚本。

  • 使用变量的注意事项:如果你使用了一个将会在运行时被替换掉的变量,那么先使用静态值看看它是否能工作。如要产生以下代码:
  • def advice = new <<variableClassName>>()

    那么,先用一个静态值,如java.lang.String,来产生它,之后再采用比较通用的做法,如其值为用户在标注时指定。

  • 单独编译文件(如果使用IDE):因为Transformation类似一个编织过程,为了避免老的类被调用,最好分别编译Transformation和目标类。
  • 使用字节码查看器观察产生的类。
  • 通过Testcase了解AstBuilder,使用AstAssert来比较预期和实际。因为AstAssert没有随Groovy 1.7打包,因此要使用它得单独下载
  • 分而治之,一次测试一部分,一步一个脚印。

Hamlet D'Arcy在评论中进行了补充:

……AstAssert算不上一个通用的assert方法,所以没有包含在Groovy中。……如果你想用它最好把它包含在你的项目里,因为你可能得要对它进行一些修改。

还有,TranformTestHelper类可以避免类的旧副本问题……


本系列的其余内容:

By foxgem - Posted on 19 二月 2010