Как сделать так, чтобы метод возвращал тип сгенерированного класса в KotlinPoet?

#kotlinpoet

Вопрос:

Мне нужно создать Builder класс с помощью KotlinPoet . Для этой цели мне нужно, чтобы метод возвращал Builder тип. Я делаю это следующим образом:

     private fun generateInitUserBehaviorClass() = TypeSpec.classBuilder("Init")
    .addType(generateInitBuilderClass())
    .build()

private fun generateInitBuilderClass() = TypeSpec.classBuilder("Builder")
    .addProperty(generateInitBuilderEndpointProperty())
    .addFunction(generateInitBuilderEndpointSetter())
    .build()

private fun generateInitBuilderEndpointProperty() = PropertySpec.builder(
    "endpoint",
    Class.forName("android.net.Uri").asTypeName().copy(nullable = true),
    KModifier.PRIVATE
).mutable(true)
    .initializer("null")
    .build()

private fun generateInitBuilderEndpointSetter() = FunSpec.builder("setEndpoint")
    .addParameter("endpoint", Class.forName("android.net.Uri"))
    .returns(Class.forName("com.idfinance.userbehavior.utils.Init.Builder"))
    .build()
 

Но когда я создаю модуль, я ловлю ошибку, которая Class.forName("com.idfinance.userbehavior.utils.Init.Builder") не может найти класс Builder . Пакет правильный, и, как я понимаю, проблема в том, что я пытаюсь использовать класс в качестве возвращаемого типа, когда он еще не создан. Но как я могу решить эту проблему?

Ответ №1:

Вы можете просто создать экземпляр a ClassName с помощью его конструктора, он не обязательно должен быть объявленным классом:

 private fun generateInitBuilderEndpointSetter() = FunSpec.builder("setEndpoint")
    .addParameter("endpoint", ClassName("android.net", "Uri"))
    .returns(ClassName("com.idfinance.userbehavior.utils", "Init", "Builder"))
    .build()