从Kotlin PSI

时间:2019-10-16 18:57:48

标签: kotlin abstract-syntax-tree detekt intellij-platform-psi

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

0 个答案:

没有答案