从 Kotlin psi API 检索 Kotlin 属性 类型
Retrieve Kotlin Property type from Kotlin psi API
我正在尝试为 detekt project 创建新规则。为此,我必须知道 Kotlin 的确切类型 属性。例如,val x: Int
的类型为 Int
.
不幸的是,对于 private val a = 3
类型的 属性,我收到以下信息:
property.typeReference
是 null
property.typeParameters
为空
property.typeConstraints
为空
property.typeParameterList
为空
property.text
是 private val a = 3
property.node.children().joinToString()
具有上一项的对象表示法
property.delegate
为空
property.getType(bindingContext)
为空(属性 bindingContext
是 KtTreeVisitorVoid
的一部分,已使用
问题:如何获取类型名称(或者更好的是,对象 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.Boolean
和java.lang.Boolean
完整 code is here.
我正在尝试为 detekt project 创建新规则。为此,我必须知道 Kotlin 的确切类型 属性。例如,val x: Int
的类型为 Int
.
不幸的是,对于 private val a = 3
类型的 属性,我收到以下信息:
property.typeReference
是null
property.typeParameters
为空property.typeConstraints
为空property.typeParameterList
为空property.text
是private val a = 3
property.node.children().joinToString()
具有上一项的对象表示法property.delegate
为空property.getType(bindingContext)
为空(属性bindingContext
是KtTreeVisitorVoid
的一部分,已使用
问题:如何获取类型名称(或者更好的是,对象 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.Boolean
和java.lang.Boolean
完整 code is here.