5

使用 KotlinPoet,为了生成用于向类和构造函数添加属性的 PropertySpec,您需要一个 TypeName 对象。

TypeMirror.asTypeName() KotlinPoet 函数已被弃用,因为它并不总是适用于 Kotlin 类型。

但是我找不到一个例子来说明如何使用 kotlinpoet-metadata API 为 Kotlin 类(例如 kotlin.String)获取正确的 TypeName,就像弃用消息所说的那样。

kotlinpoet-metadata API 的文档似乎也完全损坏了(转到https://square.github.io/kotlinpoet/interop-kotlinx-metadata/#interop-with-kotlinx-metadata并单击 API 部分下的任何内容)

有没有人有一个如何用一些 kotlinpoet-metadata 代码替换 TypeMirror.asTypeName() 以获得 TypeName 的示例,以便我可以创建一个 PropertySpec?

4

1 回答 1

3

不太确定这是否与弃用消息的意图一致,但这就是我让它发挥作用的原因。

我首先必须添加 kotlinpoet-metadata-specs。

implementation("com.squareup:kotlinpoet:1.7.1")
implementation("com.squareup:kotlinpoet-metadata:1.7.1")
implementation("com.squareup:kotlinpoet-metadata-specs:1.7.1")

然后使用 util 方法从com.squareup.kotlinpoet.metadata.specs.internal.ClassInspectorUtil创建类名。

val packageName = getPackage(element).qualifiedName.toString()
val typeMetadata = element.getAnnotation(Metadata::class.java)
val kmClass = typeMetadata.toImmutableKmClass()
val className = ClassInspectorUtil.createClassName(kmClass.name)

然后使用

val funSpec = FunSpec.builder("allNullableSet")
                     .receiver(className)
                     .returns(Boolean::class.java)
                     .addStatement(statement)
                     .build()
于 2021-06-05T09:29:48.643 回答