日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Gradle构建和应用AST转换

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Gradle构建和应用AST转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近,我想在Gradle項目中構建并應用本地ast轉換。 雖然我可以找到一些有關如何編寫轉換的示例,但找不到完整的示例來顯示完整的構建過程。 轉換必須單獨編譯,然后放在類路徑中,因此其源代碼不能簡單地放在Groovy源代碼樹的其余部分中。 這是讓我絆倒了一段時間的細節。

最初,我設置了一個單獨的GroovyCompile任務來處理其余注釋,然后再處理其余注釋(摘自Peter Niederwieser在Gradle論壇上的有用建議)。 在此可行的同時,要應用轉換的一個更簡單的解決方案是設置多項目構建。 主項目依賴于具有ast轉換源文件的子項目。 這是一個最小示例的目錄結構:

ast/build.gradle
ast構建文件
ast/src/main/groovy/com/cholick/ast/Marker.groovy 標記界面 ast/src/main/groovy/com/cholick/ast/Transform.groovy AST轉型 build.gradle 主構建文件 settings.gradle 項目層次結構配置 src/main/groovy/com/cholick/main/Main.groovy 轉換源

對于完整的工作源(具有簡單的測試,沒有*導入),請克隆https://github.com/cholick/gradle_ast_example

根build.gradle文件包含對ast項目的依賴項:

dependencies {...compile(project(':ast')) }

根settings.gradle定義ast子項目:

include 'ast'

基礎項目還具有src / main / groovy / com / cholick / main / Main.groovy,其中包含要轉換的源文件。 在此示例中,我編寫的ast轉換將名為“ added”的方法添加到類中。

package com.cholick.mainimport com.cholick.ast.Marker@Marker class Main {static void main(String[] args) {new Main().run()}def run() {println 'Running main'assert this.class.declaredMethods.find { it.name == 'added' }added()} }

在ast子項目中,ast / src / main / groovy / com / cholick / ast / Marker.groovy定義一個接口來標記ast轉換的類:

package com.cholick.astimport org.codehaus.groovy.transform.GroovyASTTransformationClassimport java.lang.annotation.*@Retention(RetentionPolicy.SOURCE) @Target([ElementType.TYPE]) @GroovyASTTransformationClass(['com.cholick.ast.Transform']) public @interface Marker {}

最后,ast轉換類處理源類并添加一個方法:

package com.cholick.astimport org.codehaus.groovy.ast.* import org.codehaus.groovy.ast.builder.AstBuilder import org.codehaus.groovy.control.* import org.codehaus.groovy.transform.*@GroovyASTTransformation(phase = CompilePhase.INSTRUCTION_SELECTION) class Transform implements ASTTransformation {void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {if (!astNodes) returnif (!astNodes[0]) returnif (!astNodes[1]) returnif (!(astNodes[0] instanceof AnnotationNode)) returnif (astNodes[0].classNode?.name != Marker.class.name) returnClassNode annotatedClass = (ClassNode) astNodes[1]MethodNode newMethod = makeMethod(annotatedClass)annotatedClass.addMethod(newMethod)}MethodNode makeMethod(ClassNode source) {def ast = new AstBuilder().buildFromString(CompilePhase.INSTRUCTION_SELECTION, false,"def added() { println 'Added' }")return (MethodNode) ast[1].methods.find { it.name == 'added' }} }

感謝Hamlet D'Arcy提供的一個出色的AST轉換示例,并感謝Peter Niederwieser在論壇上回答了我的問題 。

翻譯自: https://www.javacodegeeks.com/2014/09/using-gradle-to-build-apply-ast-transformations.html

總結

以上是生活随笔為你收集整理的使用Gradle构建和应用AST转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。