我最近一直在玩KSP,并且开发了有趣的功能(例如基于布局id的自动回收视图和视图保持生成器),到目前为止一切都很好。
但是,我现在正在尝试做一些不同于根据我设计的注释创建文件的事情。与创建文件不同,我只想填充一个带有我注释的类/对象的列表。
示例:
ClassA.kt
@MyAnnotation
class ClassA(context: Context): SomeBaseClass(context) {
override fun baseClassFunction() {
// custom code goes here
}
}ClassB.kt
@MyAnnotation
class ClassB(context: Context): SomeBaseClass(context) {
override fun baseClassFunction() {
// custom code goes here
}
}MyListAgregator.kt
object MyListAgregator {
const val classList: List<SomeBaseClass> = mutableListOf()
}其中,我的自定义KSP将执行以下操作
收集由我的@MyAnnotation
MyListAgregator
中的classList中
我总是可以到达类集合的要点(步骤1),但对我来说,其余的都是一个完全的谜,并且感觉好像KSP总是希望创建代码,而不是执行它?也许我对后一篇文章的看法是错误的,但我在现有的文档中找不到与此相关的任何内容。
我考虑过的另一种选择,但为了避免任何负面影响(例如,性能),实际上是直接修改MyListAgregator文件,以包括列表中的所有实例,就像我自己编写它们一样。不过,如果可能的话,我仍然倾向于采用前一种选择。
发布于 2022-06-10 18:49:27
首先,您需要建立一个规则集,该规则集将应用于带注释的类( KSP术语表中的符号)。例如,它们必须包含一个参数,该参数必须是一个成员属性,并且类型为Context,并且必须是SomeBaseClass的子类。我建议首先查找正确的继承,然后查找参数计数和类型。
您仍在阅读和浏览所有具有此符号的文件。根据这个规则集进行过滤,您将在第2点使用一组类。
在这里,KSP可以为您提供生成代码的接口。但是,KSP将不允许您编辑源文件,而是根据您的条件生成新的源文件。在这里,您必须编写overriden函数的实现,方法是访问它。
您可以保留输出(步骤2中新生成的类)并生成MyListAggregator对象。
https://stackoverflow.com/questions/72467134
复制相似问题