KSP 的实作方向

这系列的文章不会讲完全部 KSP 的实作,毕竟我也还正在实作中,不过实作的方向应该是跟前几篇讲的差不多,只是换一个 annotation processor 的工具而已。

class KspProcessor(
    private val codeGenerator: CodeGenerator,
    private val logger: KSPLogger,
    private val options: Map<String, String>
): SymbolProcessor {
    override fun process(resolver: Resolver): List<KSAnnotated> {
        // 略
    }
}

在 KSP 里面,他有提供一些工具可以做使用,像是 CodeGenerator ,是一个官方给的让你可以直接产生 Java 或 Kotlin 的程序码,类似像 KotlinPoet 的东西,但我觉得是比较阳春一点,KotlinPoet 的 API 写出来的程序也比较易读,也有比较多功能的 API 可以用,至於效能的部分,可能要在做一下实验会比较了解。

以下是官方范例中 CodeGenerator 的用法:

val javaFile = codeGenerator.createNewFile(Dependencies(false), "", "Generated", "java")
javaFile.appendText("class Generated {}")

val fileKt = codeGenerator.createNewFile(Dependencies(false), "", "HELLO", "java")
fileKt.appendText("public class HELLO{\n")
fileKt.appendText("public int foo() { return 1234; }\n")
fileKt.appendText("}")

用法真的比 KotlinPoet 单纯很多,只要直接 append 程序码就好,但在写的时候可能就需要注意一下输出的时候,程序码的缩排是否会像我们想像的那样。

除了 CodeGenerator ,还有 KSPLogger 。一样也是封装的好好的,不用我们额外做事情就可以顺顺地用,很棒!

interface KSPLogger {

    fun logging(message: String, symbol: KSNode? = null)
    fun info(message: String, symbol: KSNode? = null)
    fun warn(message: String, symbol: KSNode? = null)
    fun error(message: String, symbol: KSNode? = null)

    fun exception(e: Throwable)
}

另外,KSP 的 option 也可以在它提供 options 的 map 里面拿到,我觉得这个真的是相当方便。./

// 加在要用 annotation processor 的 module 的 kts 档里面
ksp {
    arg("pureKotlinParser", "true")
}

最後一个未解的谜团就是 process function 里的 Resolver ,大部分的 API 其实跟 Java 版本的 annotation processor 差不多,官方甚至有列出一张,来对照 KSP 的 API ,有兴趣的朋友可以去了解一下。

Screen Shot 2021-09-21 at 7.23.37 PM.png

目前 KtRssReader KSP 的版本还在施工中,有兴趣关注的朋友可以关注一下这个 branch ,feature 开发完,code review 过了没什麽问题才会 release 。大致上的改动,会把 annotation processor 从 KAPT 改成 KSP ,跑跑看测试有没有需要修改的部分,其他程序码的实作内容不会变动太多,我会努力抽空实作的... ? 那如果想要看到更完整的 KSP 范例,可以直接下载官方的范例 project ,直接给它玩玩看会更有上手的感觉,更多资讯也可以参考 KSP github


<<:  Day 19 规划隐私资料敏感度分级

>>:  Day 21 Arraylist

Day 27 - styled-components 笔记2

Q_Q .. 把 props 传入 styled-components import styled...

Day 21 ASP.NET Core Identity

今天来实作身分验证的部分,笔者此前是用 ASP.NET Core Web API 搭配 Blazor...

【Day10】「如果肚子饿了,就吃香蕉」--流程判断逻辑

tags: JavaScript 「如果肚子饿了,就吃香蕉」--流程判断逻辑 最简单的流程控制,就是...

进击的软件工程师之路-软件战斗营 第七周

学习进度 JAVA常见错误(Error、Exception) 例外处理(throws、try cat...

# Day28--让commit像战国时代一样分分合合

上一篇我们学到怎麽使用Vim,还有修改commit message,这次要做的事情呢,就是要来合并跟...