KotlinPoet — Генерация модуля Koin

Я новичок в KotlinPoet и не могу найти, как создать следующий оператор модуля Koin:

internal val apiModules = module {
    single<Name1> { get<Retrofit>().create(Name1::class.java) }
    single<Name2> { get<Retrofit>().create(Name2::class.java) } 
}

непосредственно в файл Kotlin (без класса-оболочки)

Я играл с PropertySpec и CodeBlock, но я не знаю, как импортировать Koin DSL или как ссылаться на эти импортированные классы при генерации кода. Я также не смог сгенерировать код путем чистой генерации строк.


person m0skit0    schedule 23.05.2019    source источник


Ответы (1)


Вам нужно сгенерировать файл, используя FileSpec, и добавить PropertySpec для модуля.

Это должно выглядеть примерно так

val moduleClassName = ClassName("org.koin.core.module.Module", "Module") //This will take care of the import

val moduleMemberName = MemberName("org.koin.dsl.module", "module") //This will take care of the import

val moduleInitilizerCodeBlock = 
    CodeBlock.Builder()
        .beginControlFlow("%M", moduleMemberName) //This will take care of the {} and indentations 
        .addStatment(ADD ANOTHER CODE BLOCK SIMNILAR TO THIS FOR THE SINGLE/FACTORY)
        .endControlFlow()
        .build()

val module = PropertySpec.builder("YOUR MODULE NAME", moduleClassName)
        .initializer(moduleInitilizerCodeBlock)
        .build()

FileSpec.Builder("FILE PACKAGE", "FILE NAME")
       .addProperty(module)
       .build()

Это не полный код, но он должен указать вам правильное направление. Боковое примечание: я могу ошибаться в конкретных именах, но опять же этого должно быть достаточно.

person Gil Goldzweig    schedule 23.05.2019
comment
Очень приятно, большое спасибо. У меня это работает, однако FunSpec.Builder("FILE PACKAGE", "FILE NAME") не компилируется, вы можете отредактировать это. Я думаю, вы хотели FileSpec вместо этого. - person m0skit0; 23.05.2019
comment
Круто, я имел в виду файл, я исправлю - person Gil Goldzweig; 23.05.2019