У меня есть аннотация 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
}
Но этот код работает только с синтаксисом "именованных" параметров и не работает с позиционным. Есть ли способ получить значение параметра аннотации независимо от используемого синтаксиса? Было бы идеально, если бы я мог получить свой экземпляр аннотации Type
непосредственно из PSI / AST / KtElement
s и использовать его как обычно. Можно ли создать аннотацию из дерева PSI?