3

我正在尝试为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)为 null(该属性bindingContextKtTreeVisitorVoidused的一部分

问题:如何获取类型名称(或者,更好的是 object KClass)以将实际属性类型与Boolean类类型进行比较?(例如,我只需要获取属性布尔值是否为非)

代码:

    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")
            )
        }
    }
4

1 回答 1

2

正确的解决方案:

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

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

完整代码在这里

于 2020-06-18T11:45:46.730 回答