From f4da6c2cc60bf02c9141abd594728b7d29ad16d1 Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Tue, 29 Aug 2017 01:20:00 +0300 Subject: [PATCH] UAST: findAttributeValue returns default value when no declared value found --- .../uast/kotlin/declarations/KotlinUAnnotation.kt | 12 +++++++++++- plugins/uast-kotlin/tests/KotlinUastApiTest.kt | 8 ++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt index 5fac24f2852..e68e1e8d9b7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/declarations/KotlinUAnnotation.kt @@ -42,7 +42,7 @@ class KotlinUAnnotation( } override fun findAttributeValue(name: String?): UExpression? = - findDeclaredAttributeValue(name) + findDeclaredAttributeValue(name) ?: findAttributeDefaultValue(name ?: "value") override fun findDeclaredAttributeValue(name: String?): UExpression? { return attributeValues.find { @@ -52,5 +52,15 @@ class KotlinUAnnotation( }?.expression } + private fun findAttributeDefaultValue(name: String): UExpression? { + val parameter = resolvedAnnotation + ?.annotationClass + ?.unsubstitutedPrimaryConstructor + ?.valueParameters + ?.find { it.name.asString() == name } ?: return null + + val defaultValue = (parameter.source.getPsi() as? KtParameter)?.defaultValue ?: return null + return getLanguagePlugin().convertWithParent(defaultValue) + } } diff --git a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt index 65feb55de6b..467cc501127 100644 --- a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt @@ -104,4 +104,12 @@ class KotlinUastApiTest : AbstractKotlinUastTest() { assertEquals("String", elvisExpression.getExpressionType()!!.presentableText) } } + + @Test fun testFindAttributeDefaultValue() { + doTest("AnnotationParameters") { _, file -> + val witDefaultValue = file.findElementByText("@WithDefaultValue") + assertEquals(42, witDefaultValue.findAttributeValue("value")!!.evaluate()) + assertEquals(42, witDefaultValue.findAttributeValue(null)!!.evaluate()) + } + } }