KotlinKSP:如何生成聚合输出文件

问题描述 投票:0回答:0
应在

@AutoModule
类中收集

GeneratedModule

的所有类,由

AutoModuleProcessor
    (汇总输出)创建。
  • @GenerateAutoModule
    注释的类别应生成另一类,并用
    @AutoModule
    注释(由
    GenerateAutoModuleProcessor
    创建)
  • 用注释
    @Component
    的类应生成
    Generated${ClassName}
    ComponentProcessor
  • @Component
    注释在参数中具有
    GeneratedModule
    GeneratedModule
    在完成之前不存在)
  • 中列出的所有类参数必须对成功生成的所有类都有效。
    代码示例:
    AutoModuleProcessor
    相关代码应如下:
    @Component
  • 可以在此处找到示例项目:
  • https://github.com/bomiyr/ksp-playground
    
    
    电流设置需要
    ComponentProcessor
  • 在几轮中运行,我无法理解如何正确生成文件:

如果我每回合都会生成文件,我会得到
class ExistingModule

@AutoModule
class SimpleAutoModule

@GenerateAutoModule
class ComplexAutoModule

@Component(
    // GeneratedModule not exists before AutoModuleProcessor execution
    [ExistingModule::class, GeneratedModule::class]
)
interface SourceComponent

如果我将文件生成转移到

@AutoModule class GeneratedComplexAutoModule @Module( [ com.example.SimpleAutoModule::class, com.example.GeneratedComplexAutoModule::class ] ) class GeneratedModule class GeneratedSourceComponent
,则无法生成
AutoModuleProcessor

,因为FileAlreadyExistsException在执行时无法解决。

如果我尝试将处理推迟到下一轮,我没有任何有意义的条件可以停止处理并最终生成文件。

我获得的唯一解决方案是在
finish()

    GeneratedSourceComponent
  1. 中进行硬码弹性计数,但这似乎不是很可靠:
    GeneratedModule
  2. 那么处理此类案件的正确方法是什么?
    	
    公元前比硬编码更好:
    您可以合并
    ComponentProcessor
    AutoModuleProcessor
    。然后,您可以将所有元素推迟到没有更多元素为止。
  3. 标记您的点3:有意义的条件将是“上一轮中没有添加与
  4. 2
  5. 的元素”。但是,这不能使用,因为没有添加元素的回合可能是终止的回合,您永远不会到达下一轮进行此检查。

kotlin kotlin-symbol-processing ksp
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.