【问题标题】:How to use Kotlin Symbol Processing (KSP) to populate an existing list如何使用 Kotlin 符号处理 (KSP) 填充现有列表
【发布时间】:2022-06-11 02:49:27
【问题描述】:

我最近一直在玩 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 将执行以下操作

  1. 收集所有由我注释的类/对象(通常) @MyAnnotation
  2. 使用适当的创建它们的实例 参数(在这种情况下只是一个上下文)
  3. 将每一项添加到classList 中的MyListAgregator

我总能找到类集合的重点(第 1 步),但其余部分对我来说完全是个谜,感觉 KSP 总是希望创建代码,而不是执行它?也许我对后一个不正确,但我找不到与可用文档中解释的内容相关的任何内容。

我考虑过的另一种选择,但宁愿避免担心任何负面影响(例如性能)是实际修改 MyListAgregator 文件以将所有实例包含在列表中,就好像我已经编写它们一样我。但是,如果可能的话,我仍然更愿意使用上一个选项。

【问题讨论】:

  • KSP 在编译时运行,因此它无法在应用程序运行时执行某些操作,如果这就是您所说的“执行代码”
  • @gpunto 我明白了,所以我的感觉是正确的,它的目的是创建代码,而不是执行代码代码 - 除了创建代码本身所必需的(符号等)。
  • KSP 的工作方式与您的 IDE 中的插件类似,该插件可以根据您的其他源代码生成源代码。您可以使用 KSP 生成您的 MyListAgregator,其中包含初始化所有类的代码。
  • @broot 知道了,所以基本上我想避免的“B计划”实际上是唯一且正确的选择

标签: android kotlin annotations ksp


【解决方案1】:

首先,您需要建立一个规则集,该规则集将应用于使用您的注解(KSP 词汇表中的符号)注解的类。例如,它们必须包含一个参数,该参数必须是成员属性,类型为Context,并且必须是SomeBaseClass 的子类。我建议首先查找正确的继承,然后查找参数计数和类型。

您仍在阅读和探索所有带有此符号的文件。根据此规则集进行过滤,您将在第 2 点获得一组类。

在这里,KSP 可以为您提供生成代码的接口。但是,KSP 不会让您编辑源文件,而是根据您的条件生成新文件。在这里,您必须通过访问它来编写覆盖函数的实现

您可以保留输出(步骤 2 中新生成的类)并生成您的 MyListAggregator 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2019-08-12
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2017-08-25
    相关资源
    最近更新 更多