这系列的文章不会讲完全部 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 ,有兴趣的朋友可以去了解一下。
目前 KtRssReader KSP 的版本还在施工中,有兴趣关注的朋友可以关注一下这个 branch ,feature 开发完,code review 过了没什麽问题才会 release 。大致上的改动,会把 annotation processor 从 KAPT 改成 KSP ,跑跑看测试有没有需要修改的部分,其他程序码的实作内容不会变动太多,我会努力抽空实作的... ? 那如果想要看到更完整的 KSP 范例,可以直接下载官方的范例 project ,直接给它玩玩看会更有上手的感觉,更多资讯也可以参考 KSP github 。
Q_Q .. 把 props 传入 styled-components import styled...
今天来实作身分验证的部分,笔者此前是用 ASP.NET Core Web API 搭配 Blazor...
tags: JavaScript 「如果肚子饿了,就吃香蕉」--流程判断逻辑 最简单的流程控制,就是...
学习进度 JAVA常见错误(Error、Exception) 例外处理(throws、try cat...
上一篇我们学到怎麽使用Vim,还有修改commit message,这次要做的事情呢,就是要来合并跟...