如何使用KotlinPoet为PropertySpec获取正确的TypeName



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

不赞成使用TypeMirror.asTypeName((KotlinPoet函数,因为它并不总是适用于Kotlin类型。

但是,我找不到一个例子来说明如何使用kotlinpoeter元数据API为Kotlin类(例如Kotlin.String(获得正确的TypeName,就像弃用消息所说的那样。

kotlinpoeter元数据API的文档似乎也完全崩溃了(请访问https://square.github.io/kotlinpoet/interop-kotlinx-metadata/#interop-使用kotlinx元数据并单击API部分下的任何内容(

有没有人举过一个例子,说明如何用一些kotlinpoeter元数据代码替换TypeMirror.asTypeName((来获得TypeName,这样我就可以创建PropertySpec了?

不太确定这是否符合弃用消息的意图,但这就是我让它工作的原因。

我首先必须添加kotlinpoeter元数据规范。

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

然后使用com.squareup.kotlinpoet.metadata.specs.internal.ClassInspectorUtil中的util方法来创建className。

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()

由于可以访问processingEnv:,我已经找到了在AbstractProcessor中获取TypeElementTypeName的方法

val kmClass = (typeElement.kotlinClassMetadata() as KotlinClassMetadata.Class).toKmClass()
val elementName: TypeName = ClassName(processingEnv.elementUtils.getPackageOf(typeElement).toString(), kmClass.name.substringAfterLast("/"))

在没有processingEnv的情况下,手动拆分kmClass.name也是可行的。

最新更新