UAST: findAttributeValue returns default value when no declared value found

This commit is contained in:
Vyacheslav Gerasimov
2017-08-29 01:20:00 +03:00
parent 56a075eab6
commit f4da6c2cc6
2 changed files with 19 additions and 1 deletions
@@ -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)
}
}
@@ -104,4 +104,12 @@ class KotlinUastApiTest : AbstractKotlinUastTest() {
assertEquals("String", elvisExpression.getExpressionType()!!.presentableText)
}
}
@Test fun testFindAttributeDefaultValue() {
doTest("AnnotationParameters") { _, file ->
val witDefaultValue = file.findElementByText<UAnnotation>("@WithDefaultValue")
assertEquals(42, witDefaultValue.findAttributeValue("value")!!.evaluate())
assertEquals(42, witDefaultValue.findAttributeValue(null)!!.evaluate())
}
}
}