Code Generator 结构

接续上一篇的 annotation processor 实作,我们的 annotation processor 如果有需要分平台产生不同 parser 的话,可以利用 KAPT 的参数来让使用者进行设定。举例来说,我们现在要用 annotation processor 产生纯 Kotlin 和 Android 的 parser ,这两者内部的实作方式不太一样,一个是用 DOM parser ,另一个是用 XmlPullParser ,这时候我们就可以定义 KAPT 的参数让使用者做选择。

kapt {
    arguments {
        arg("pureKotlinParser", true)
    }
}

这个参数设定我们可以要求使用者加在使用到我们 library 的 module 下的 build.gradle 。之後我们可以在 processor 里面拿到这个设定好的参数。

const val KAPT_OPTION_KEY = "pureKotlinParser"

@AutoService(Processor::class)
class RssAnnotationProcessor : AbstractProcessor() {
  // 略
	override fun process(typeElementSet: MutableSet<out TypeElement>?, roundEnvironment: RoundEnvironment?): Boolean {
	    val logger = Logger(processingEnv.messager)
	    val isPureKotlinParser = processingEnv.options[KAPT_OPTION_KEY]?.toBoolean() ?: false
	    if (isPureKotlinParser) {
	        generateClassesForKotlin(logger, roundEnvironment)
	    } else {
	        generateClassesForAndroid(logger, roundEnvironment)
	    }
	    return true
	}
  // 略
}

processingEnv 是 AbstractProcessor 提供的参数,让我们可以拿到 processor 的环境变数和 logger 等。我们拿到 isPureKotlinParser 参数後,就可以决定我们要产生哪边的程序码了!

Generator

有了 processor 的结构,我们就要来处理 generator 。

generators.png

因为我们要针对两个平台产生不同的程序码,这会先分成两类:一种是专门处理 Parser 的程序码 ParserGenerator ,另一种是 ExtensionGenerator ,专门产生 library 会用到的 extension function ,有点像是 util 类型的程序码。Kotlin 和 Android 都各有自己的 generator ,比较特别的是 Android 这边有多一个 AndroidReaderGenerator ,这个是因为在 Android 这边还有帮忙载入和 快取 RSS 资料,这个类别是专门在产生 parser 产出结果後的对外接口程序码。这些 parser 和 generator 各司其职,帮我们的 annotation processor 产生两个平台的程序码。


<<:  .NET Core第21天_FormTagHelper的使用_防止跨站请求设置方式

>>:  Day13 数据图表化 - 如何建立 Dashboards

Day13 - 物理模拟篇 - 弹跳球世界IV - 成为Canvas Ninja ~ 理解2D渲染的精髓

终於来到弹跳球的最後一部分~ 这篇我们主要就是要讲解倾斜面存在的状况下,程序的撰写方法! 老实说我原...

写在VSCode Extension系列文之後 - 12th铁人赛颁奖典礼得奖致词

2021/08/02 大家好,我是韦恩。 新的一年的铁人赛又到了,在这个时候,回顾下上次比赛结尾时的...

Unity与Photon的新手相遇旅途 | Day25-Unity build测试Photon房间

今天内容为把我们做好的Unity打包出去执行,并且同时打开後测试房间以及连线。 ...

将Word(Excel)内容汇出成SVG

因为前阵子发表的研讨会文章被转期刊,所以这几天都在忙着重写文章,遇到一个大家都觉得很烦排版的问题,这...

Material UI in React [ Day 27 ] Styles API (part 2)

StylesProvider 他和 Theme Provider 很像,其实就是用 context ...