0

我正在尝试从带注释的类生成子类并使用下面的代码获取方法参数,我的问题是我总是得到 java 类型,而不是与父类冲突导致覆盖错误的 kotlin 类型,如何获得正确的类型 kotlin 或java 类型,这恰好发生在 String、Int 和 List

 method.parameters.onEach { variableElement ->
                        if (!variableElement.asType().asTypeName()
                                .toString()
                                .contains("Continuation")
                        ) {
                            val types = ElementFilter.typesIn(variableElement.enclosedElements)
                            val parameterBuilder = ParameterSpec.builder(
                                variableElement.simpleName.toString(),
                                variableElement.asType().asTypeName()
                            )
                            function.addParameter(parameterBuilder.build())
                        }
                    }
4

2 回答 2

1

KotlinPoet 将输出 kotlin.String。查看 kotlinpoet 单元测试中的很多示例,例如:

 @Test fun topLevelMembersRetainOrder() {
    val source = FileSpec.builder(tacosPackage, "Taco")
      .addFunction(FunSpec.builder("a").addModifiers(KModifier.PUBLIC).build())
      .addType(TypeSpec.classBuilder("B").build())
      .addProperty(
        PropertySpec.builder("c", String::class, KModifier.PUBLIC)
          .initializer("%S", "C")
          .build()
      )
      .addFunction(FunSpec.builder("d").build())
      .addType(TypeSpec.classBuilder("E").build())
      .addProperty(
        PropertySpec.builder("f", String::class, KModifier.PUBLIC)
          .initializer("%S", "F")
          .build()
      )
      .build()
    assertThat(source.toString()).isEqualTo(
      """
        |package com.squareup.tacos
        |
        |import kotlin.String
        |import kotlin.Unit
        |
        |public fun a(): Unit {
        |}
        |
        |public class B
        |
        |public val c: String = "C"
        |
        |public fun d(): Unit {
        |}
        |
        |public class E
        |
        |public val f: String = "F"
        |""".trimMargin()
    )

取自这里:

https://github.com/square/kotlinpoet/blob/7c6f4dbc324fff1019d3e625f8a5dbace6c7905c/kotlinpoet/src/test/java/com/squareup/kotlinpoet/KotlinPoetTest.kt#L49

于 2021-11-12T02:39:03.787 回答
0

@Metadata由于 Kotlin 类型只是底层 Java 类型的别名,因此如果不从类注释中读取它,您确实不会获得正确的类型信息。尝试interop:kotlinx-metadata包含从元数据中提取此类信息的帮助程序的工件。

于 2021-10-01T15:28:50.633 回答