4

我有一个 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 树实例化注释?

4

0 回答 0