通过复写同一类名下的函数,我解锁了 ksp 的新玩法

博客又是摆烂了好几个月,今天来分享一个我在最近的项目中因为自己疏忽而无意间发现的一个有关 KSP 的新玩法。

最近在开发一个基于 Compose Multiplatform 的项目 A。介于现版本 Compose Multiplatform 自带的资源读取库的实现非常初级,我自行实现了一个轻量的可缓慢过渡迁移的 i18n 库 O3o。这个名字是 neta internationalization 的缩写为 i18n,我将 Omico 写作 O3o。

在最开始,这个库并没有抽出来作为单独的项目,而是被我直接将其作为一个模块放在了我那项目 A 里。在初步实现后,我打算迁移出来将其变为单独的项目。

由于自己的疏忽,我无意间在项目 A 中漏删了一个属于 O3o 的一个类。而在 O3o 中这个类包含了更多的函数,于是我遇到了在运行项目 A 后出现无法找到函数的情况。

这使我灵机一动意识到了一个问题:如果我在项目 A中复写 O3o 中的这个同名类,那么我是不是就可以在项目 A 中使用被复写后的函数了呢?

经过测试,答案令我感到振奋。

这完全可行!!!

至此我对 KSP 感到不满的最后一个地方消失了! 我们知道 KSP 在没编译的情况下,代码是会出现高亮错误的,因为那些函数或类是在 Gradle 运行编译时生成的。

而现在,通过此方式,我们可以在使用者无感知的情况下,将 KSP 生成的代码隐藏在一个被复写的同名类的同名函数中,这样我们就可以在没编译的情况下,确保高亮是正常的了!