从 Kotlin psi API 检索 Kotlin 属性 类型

Retrieve Kotlin Property type from Kotlin psi API

我正在尝试为 detekt project 创建新规则。为此,我必须知道 Kotlin 的确切类型 属性。例如,val x: Int 的类型为 Int.

不幸的是,对于 private val a = 3 类型的 属性,我收到以下信息:

  1. property.typeReferencenull
  2. property.typeParameters为空
  3. property.typeConstraints为空
  4. property.typeParameterList为空
  5. property.textprivate val a = 3
  6. property.node.children().joinToString() 具有上一项的对象表示法
  7. property.delegate 为空
  8. property.getType(bindingContext) 为空(属性 bindingContextKtTreeVisitorVoid 的一部分,已使用

问题:如何获取类型名称(或者更好的是,对象 KClass)以将实际的 属性 类型与 Boolean class类型? (例如,我只需要得到 if 属性 boolean of not)

代码:

    override fun visitProperty(property: org.jetbrains.kotlin.psi.KtProperty) {
        val type: String = ??? //property.typeReference?.text - doesn't work

        if(property.identifierName().startsWith("is") && type != "Boolean") {
            report(CodeSmell(
                issue,
                Entity.from(property),
                message = "Non-boolean properties shouldn't start with 'is' prefix. Actual type: $type")
            )
        }
    }

正确解:

fun getTypeName(parameter: KtCallableDeclaration): String? {
        return parameter.createTypeBindingForReturnType(bindingContext)
            ?.type
            ?.getJetTypeFqName(false)
    }

布尔类型至少有以下值:kotlin.Booleanjava.lang.Boolean

完整 code is here.