我有一个 Kotlin 注释:
@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.CLASS)
annotation class Type(
val type: String
)
它可以通过两种方式在 Kotlin 类上使用:使用命名参数语法,或使用位置参数语法:
@Type(type = "named")
data class Named(
…
)
@Type("positional")
data class Positional
…
)
我在我的自定义检测规则中使用此注释进行一些额外的检查。我需要提取type
参数的值以基于它执行一些检查。我这样做:
private fun getType(klass: KtClass): String? {
val annotation = klass
.annotationEntries
.find {
"Type" == it?.shortName?.asString()
}
val type = (annotation
?.valueArguments
?.find {
it.getArgumentName()?.asName?.asString() == "type"
}
?.getArgumentExpression() as? KtStringTemplateExpression)
?.takeUnless { it.hasInterpolation() }
?.plainContent
return type
}
但是此代码仅适用于“命名”参数语法,并且对于位置参数无效。无论使用什么语法,有什么方法可以获取注释参数的值?如果我可以直接从 PSI / AST / s获取我的Type
注释实例并像往常一样使用它,那将是完美的。KtElement
是否可以从 PSI 树实例化注释?