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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gradle 构建应用流程_使用Gradle构建和应用AST转换

發(fā)布時(shí)間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gradle 构建应用流程_使用Gradle构建和应用AST转换 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

gradle 構(gòu)建應(yīng)用流程

最近,我想在Gradle項(xiàng)目中構(gòu)建并應(yīng)用本地ast轉(zhuǎn)換。 雖然我可以找到幾個(gè)有關(guān)如何編寫轉(zhuǎn)換的示例,但找不到完整的示例來顯示完整的構(gòu)建過程。 轉(zhuǎn)換必須單獨(dú)編譯然后放在類路徑中,因此其源代碼不能簡(jiǎn)單地放在Groovy源代碼樹的其余部分中。 這是讓我絆倒了一段時(shí)間的細(xì)節(jié)。

最初,我設(shè)置了一個(gè)單獨(dú)的GroovyCompile任務(wù)來處理其余注釋,然后再處理其余注釋(摘自Gradle論壇上Peter Niederwieser的有用建議)。 在此可行的同時(shí),要應(yīng)用轉(zhuǎn)換的一個(gè)更簡(jiǎn)單的解決方案是設(shè)置多項(xiàng)目構(gòu)建。 主項(xiàng)目依賴于具有ast轉(zhuǎn)換源文件的子項(xiàng)目。 這是一個(gè)最小示例的目錄結(jié)構(gòu):

ast/build.gradle
ast構(gòu)建文件
ast/src/main/groovy/com/cholick/ast/Marker.groovy 標(biāo)記界面 ast/src/main/groovy/com/cholick/ast/Transform.groovy AST轉(zhuǎn)型 build.gradle 主構(gòu)建文件 settings.gradle 項(xiàng)目層次結(jié)構(gòu)配置 src/main/groovy/com/cholick/main/Main.groovy 轉(zhuǎn)化源

對(duì)于完整的工作源(具有簡(jiǎn)單的測(cè)試,沒有*導(dǎo)入),請(qǐng)克隆https://github.com/cholick/gradle_ast_example

根build.gradle文件包含對(duì)ast項(xiàng)目的依賴項(xiàng):

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

根settings.gradle定義ast子項(xiàng)目:

include 'ast'

基礎(chǔ)項(xiàng)目還具有src / main / groovy / com / cholick / main / Main.groovy,其中包含要轉(zhuǎn)換的源文件。 在此示例中,我編寫的ast轉(zhuǎn)換將名為“ 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子項(xiàng)目中,ast / src / main / groovy / com / cholick / ast / Marker.groovy定義一個(gè)接口來標(biāo)記ast轉(zhuǎn)換的類:

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轉(zhuǎn)換類處理源類并添加一個(gè)方法:

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提供的一個(gè)出色的AST轉(zhuǎn)換示例,并感謝Peter Niederwieser在論壇上回答了我的問題 。

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

gradle 構(gòu)建應(yīng)用流程

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。