深入解析Google KSP项目中的KSP2 API变更
ksp Kotlin Symbol Processing API 项目地址: https://gitcode.com/gh_mirrors/ks/ksp
前言
Kotlin Symbol Processing (KSP)是Kotlin语言的符号处理工具,它提供了比传统注解处理器更高效、更Kotlin友好的API。随着KSP2的发布,API在保持二进制兼容性的同时,对某些行为进行了重要调整。本文将全面解析这些变更,帮助开发者更好地理解和使用KSP2。
类型解析改进
隐式类型解析
在解析包含不存在类型的容器类型时,KSP2有了更精确的错误报告机制:
val error = mutableMapOf<String, NonExistType>()
- KSP1:整个类型会被标记为错误类型
- KSP2:能成功解析容器类型,仅对不存在的类型参数报告错误
这种改进使得错误定位更加精确,开发者可以更快地识别和修复问题。
无界类型参数处理
对于未指定上界的类型参数:
- KSP1:不设置任何边界
- KSP2:统一插入
Any?
作为上界
这一变更确保了类型系统的一致性,减少了边界情况下的不确定性。
类型别名处理
在函数类型和注解中使用类型别名时:
- KSP1:会展开为底层非别名类型
- KSP2:保持原样不展开,与其他场景保持一致
这种统一行为减少了开发者的认知负担,使API行为更加可预测。
类型系统变更
内部类型参数
处理内部类的类型参数时:
- KSP1:内部类型包含外部类型的参数
- KSP2:内部类型不包含外部类型的参数
星投影处理
对于星投影(*
)的类型参数:
- KSP1:根据声明处的有效变型展开类型参数
- KSP2:不展开,类型参数为null
Java数组变型
- KSP1:Java数组具有不变的上界
- KSP2:Java数组具有协变的上界
枚举类型处理
枚举条目类型
- KSP1:每个枚举条目有自己的类型
- KSP2:所有枚举条目共享枚举类的类型
注解中的枚举条目
当枚举条目作为注解参数时:
- KSP1:评估为对应枚举条目的
KSType
- KSP2:直接评估为枚举条目的
KSClassDeclaration
合成成员
对于枚举类:
- KSP1:Kotlin源码中定义的枚举缺少
values
和valueOf
方法 - KSP2:始终包含这些合成方法
类继承与重写
多重继承场景
考虑以下继承层次:
interface GrandBaseInterface1 { fun foo() }
interface GrandBaseInterface2 { fun foo() }
interface BaseInterface1 : GrandBaseInterface1
interface BaseInterface2 : GrandBaseInterface2
class OverrideOrder1 : BaseInterface1, GrandBaseInterface2 {
override fun foo() = TODO()
}
class OverrideOrder2 : BaseInterface2, GrandBaseInterface1 {
override fun foo() = TODO()
}
- KSP1:采用BFS顺序查找重写符号
- KSP2:采用DFS顺序查找重写符号
这一变更使得重写解析更符合Kotlin语言规范。
其他重要变更
Java修饰符
- KSP1:transient/volatile字段默认为final
- KSP2:这些字段默认为open
类型注解
- KSP1:类型参数上的注解仅反映在类型参数符号上
- KSP2:这些注解现在也出现在解析后的类型中
可变参数
- KSP1:Java源码中的可变参数被视为
Array
类型 - KSP2:保持声明类型的一致性
数据类合成成员
- KSP1:Kotlin源码中定义的数据类缺少
componentN
和copy
方法 - KSP2:始终包含这些合成方法
枚举类的超类型
- KSP1:枚举类的超类型是
Any
- KSP2:枚举类的超类型是
Enum
结论
KSP2的这些API变更主要聚焦于提高一致性、精确性和符合语言规范。虽然保持了二进制兼容性,但开发者需要注意这些行为变化可能对现有代码产生的影响。理解这些变更有助于开发者编写更健壮、更可靠的符号处理器。
建议开发者在迁移到KSP2时,仔细检查处理器中涉及上述变更点的代码,确保它们在新版本下的行为符合预期。
ksp Kotlin Symbol Processing API 项目地址: https://gitcode.com/gh_mirrors/ks/ksp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考