作者 | Sergio De Simone
译者 | 张卫滨
策划 | 丁晓昀
KSP 2.0 是 Kotlin 符号处理(Kotlin Symbol Processing)的演进版本,目前处于预览状态,谷歌的软件工程师 Ting-Yuan Huang 和 Jiaxiang Chen 说到,它引入了新的架构,旨在解决 KSP 1.0 中的一些局限性,并增加了对新的 K2 Kotlin 编译器的支持。
KSP1 是作为编译器插件的形式实现的,而 KSP2 是一个独立的库,无需设置编译器即可运行,并能完全控制其生命周期。Huang 和 Chen 说,这使得以编程方式调用 KSP 以及在 KSP 处理器中设置断点变得更容易。下面的代码展示了如何配置 KSP2 并执行它来处理符号的列表:
代码语言:javascript复制val kspConfig = KSPJvmConfig.Builder().apply {
// All configurations happen here.
}.build()
val exitCode = KotlinSymbolProcessing(kspConfig, listOfProcessors, kspLoggerImpl).execute()
KSP2 中另外一个值得注意的差异是,它使用了仍处于 beta 状态的 Kotlin K2 编译器来处理源码。不过,如果你愿意的话,也可以通过在gradle.properties
中设置languageVersion
属性,从而以 K1 的方式使用 KSP。
除此之外,KSP2 还旨在解决 KSP1 中的一个缺陷,即同一个源文件可能会被编译多次。借助与 K2 的集成,KSP2 尝试调整 K2 编译文件的方式,使其只处理一次,从而能够提升性能。
KSP2 还引入了一些行为的变化,以提高开发人员的工作效率,以及可调试性和错误恢复能力。
在 KSP 1.0.14 或更新的版本中,可以在gradle.properties
中使用一个标记来启用新的 KSP 预览版本:
ksp.useKSP2=true
KSP 是一个支持创建插件来扩展 Kotlin 编译器的 API。它以独立于编译器的方式理解 Kotlin 的语言特性,如扩展函数、声明处型变(declaration-site variance)和局部函数。
该 API 根据 Kotlin 语法在符号层对 Kotlin 程序结构进行建模。当基于 KSP 的插件处理源程序时,处理器可以访问类、类成员、函数和相关参数等构造结构,而 if 代码块和 for 循环等则无法访问。
这使得基于 KSP 的插件不像建立在kotlinc之上的插件那样脆弱,后者功能更强大,但是严格依赖于编译器的版本。
查看英文原文:
KSP2 Aims to Improve Kotlin Meta-Programming, Adds Support for the K2 Kotlin Compiler(https://www.infoq.com/news/2024/01/ksp2-kotlin-metaprogramming/)
声明:本文为 InfoQ 翻译,未经许可禁止转载。