Получите параметры аннотации (или экземпляр аннотации) от Kotlin PSI - PullRequest
1 голос
/ 16 октября 2019

У меня есть аннотация 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?

...