接续上一篇的 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 参数後,就可以决定我们要产生哪边的程序码了!
有了 processor 的结构,我们就要来处理 generator 。
因为我们要针对两个平台产生不同的程序码,这会先分成两类:一种是专门处理 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
终於来到弹跳球的最後一部分~ 这篇我们主要就是要讲解倾斜面存在的状况下,程序的撰写方法! 老实说我原...
2021/08/02 大家好,我是韦恩。 新的一年的铁人赛又到了,在这个时候,回顾下上次比赛结尾时的...
今天内容为把我们做好的Unity打包出去执行,并且同时打开後测试房间以及连线。 ...
因为前阵子发表的研讨会文章被转期刊,所以这几天都在忙着重写文章,遇到一个大家都觉得很烦排版的问题,这...
StylesProvider 他和 Theme Provider 很像,其实就是用 context ...