我有一个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
…
)
我在自定义detekt规则中使用了此注释,以进行一些额外的检查。我需要提取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 / Type
获取我的KtElement
注释实例并像往常一样使用它,那将是完美的。是否可以从PSI树实例化注释?