如何使用 Kotlinpoet 生成以下代码行?
val myMap:Map<String, KClass<out Any>>
Run Code Online (Sandbox Code Playgroud)
我在 init 块中初始化 myMap。
我是 KotlinPoet 的新手,我找不到如何创建以下 Koin 模块语句:
internal val apiModules = module {
single<Name1> { get<Retrofit>().create(Name1::class.java) }
single<Name2> { get<Retrofit>().create(Name2::class.java) }
}
Run Code Online (Sandbox Code Playgroud)
直接写入 Kotlin 文件(无包装类)
我一直在使用 PropertySpec 和 CodeBlock,但我不知道如何导入 Koin DSL 或如何在代码生成中引用这些导入的类。我也无法通过纯字符串生成来生成代码。
由Fleshgrinder在GitHub 上提交。
如何为Comparable当前正在生成的类实现?
有ParameterizedTypeName.get(Comparable::class, ?)方法,但不清楚如何传递第二个参数。生成类时唯一可用的ClassName是它的 。
最小的例子:
FileSpec.builder("com.fleshgrinder", "KotlinPoet").apply {
val className = ClassName("com.fleshgrinder", "KotlinPoet")
addType(TypeSpec.classBuilder(className).apply {
addSuperinterface(ParameterizedTypeName.get(Comparable::class, Any::class))
}.build())
}.build().writeTo(System.out)
Run Code Online (Sandbox Code Playgroud)
产生:
package com.fleshgrinder
import kotlin.Any
import kotlin.Comparable
class KotlinPoet : Comparable<Any>
Run Code Online (Sandbox Code Playgroud)
我想要什么:
package com.fleshgrinder
class KotlinPoet : Comparable<KotlinPoet>
Run Code Online (Sandbox Code Playgroud) 我想生成一个非常简单的类,只包含扩展函数,如下所示:
import com.my.app.SomeClass
fun SomeClass.function() {
}
Run Code Online (Sandbox Code Playgroud)
我尝试的:
val packageName = ...
val annotatedClassName = annotatedElement.simpleName
val fileName = "${annotatedClassName}_KotArgsExtensions"
val extensionBuilder = FileSpec.builder(packageName, fileName)
val funSpecBuilder= FunSpec.builder("${SomeClass::class.java.simpleName}.function").build()
extensionBuilder.addImport(SomeClass::class.java.`package`.name, SomeClass::class.java.simpleName)
extensionBuilder.addFunction(funSpecBuilder)
Run Code Online (Sandbox Code Playgroud)
我得到什么:
import com.my.app.SomeClass
fun `SomeClass.function`() {
}
Run Code Online (Sandbox Code Playgroud)
问题
如何正确创建像这样的扩展函数fun SomeClass.function()?