使用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
中获取TypeElement
的TypeName
的方法
val kmClass = (typeElement.kotlinClassMetadata() as KotlinClassMetadata.Class).toKmClass()
val elementName: TypeName = ClassName(processingEnv.elementUtils.getPackageOf(typeElement).toString(), kmClass.name.substringAfterLast("/"))
在没有processingEnv
的情况下,手动拆分kmClass.name
也是可行的。