diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt index 34ab87ebca1..08782632225 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/KotlinUastLanguagePlugin.kt @@ -250,15 +250,28 @@ internal object KotlinConverter { } - internal fun convert(entry: KtStringTemplateEntry, parent: UElement?): UExpression = when (entry) { - is KtStringTemplateEntryWithExpression -> KotlinConverter.convertOrEmpty(entry.expression, parent) - is KtEscapeStringTemplateEntry -> KotlinStringULiteralExpression(entry, parent, entry.unescapedValue) - else -> { - KotlinStringULiteralExpression(entry, parent) + internal fun convertEntry(entry: KtStringTemplateEntry, + parentCallback: (() -> UElement?)?, + requiredType: Class? = null): UExpression? { + return with(requiredType) { + if (entry is KtStringTemplateEntryWithExpression) { + expr { + val parent = if (parentCallback == null) null else (parentCallback() ?: return null) + KotlinConverter.convertOrEmpty(entry.expression, parent) + } + } + else { + expr { + val parent = if (parentCallback == null) null else (parentCallback() ?: return null) + if (entry is KtEscapeStringTemplateEntry) + KotlinStringULiteralExpression(entry, parent, entry.unescapedValue) + else + KotlinStringULiteralExpression(entry, parent) + } + } } } - internal fun convertExpression(expression: KtExpression, parentCallback: (() -> UElement?)?, requiredType: Class? = null): UExpression? { @@ -272,14 +285,17 @@ internal object KotlinConverter { return with (requiredType) { when (expression) { is KtVariableDeclaration -> expr(build(::convertVariablesDeclaration)) - is KtStringTemplateExpression -> expr { - val parent = if (parentCallback == null) null else (parentCallback() ?: return null) - if (expression.entries.isEmpty()) - KotlinStringULiteralExpression(expression, parent, "") + is KtStringTemplateExpression -> { + if (expression.entries.isEmpty()) { + val parent = if (parentCallback == null) null else (parentCallback() ?: return null) + expr { KotlinStringULiteralExpression(expression, parent, "") } + } else if (expression.entries.size == 1) - convert(expression.entries[0], parent) - else - KotlinStringTemplateUPolyadicExpression(expression, parent) + convertEntry(expression.entries[0], parentCallback, requiredType) + else { + val parent = if (parentCallback == null) null else (parentCallback() ?: return null) + expr { KotlinStringTemplateUPolyadicExpression(expression, parent) } + } } is KtDestructuringDeclaration -> expr { val parent = if (parentCallback == null) null else (parentCallback() ?: return null) diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt index f01611d76cf..a84f3e89f50 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/expressions/KotlinStringTemplateUPolyadicExpression.kt @@ -29,6 +29,6 @@ class KotlinStringTemplateUPolyadicExpression( UPolyadicExpression, KotlinUElementWithType, KotlinEvaluatableUElement { - override val operands: List by lz { psi.entries.map { KotlinConverter.convert(it, this) } } + override val operands: List by lz { psi.entries.map { KotlinConverter.convertEntry(it, { this })!! } } override val operator = UastBinaryOperator.PLUS } \ No newline at end of file diff --git a/plugins/uast-kotlin/testData/StringTemplateWithVar.kt b/plugins/uast-kotlin/testData/StringTemplateWithVar.kt new file mode 100644 index 00000000000..ea64ccac87c --- /dev/null +++ b/plugins/uast-kotlin/testData/StringTemplateWithVar.kt @@ -0,0 +1,2 @@ +val bar = "bar" +val f = "foo$bar" diff --git a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt index f924540448d..81495438083 100644 --- a/plugins/uast-kotlin/tests/KotlinUastApiTest.kt +++ b/plugins/uast-kotlin/tests/KotlinUastApiTest.kt @@ -1,11 +1,10 @@ package org.jetbrains.uast.test.kotlin import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry -import org.jetbrains.uast.UAnnotation -import org.jetbrains.uast.UFile -import org.jetbrains.uast.ULiteralExpression +import org.jetbrains.kotlin.psi.KtStringTemplateExpression +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.uast.* import org.jetbrains.uast.test.env.findElementByText -import org.jetbrains.uast.toUElement import org.junit.Assert import org.junit.Test @@ -32,4 +31,13 @@ class KotlinUastApiTest : AbstractKotlinUastTest() { } } + + @Test fun testConvertStringTemplateWithExpectedType() { + doTest("StringTemplateWithVar") { _, file -> + val index = file.psi.text.indexOf("foo") + val stringTemplate = file.psi.findElementAt(index)!!.getParentOfType(false) + val uLiteral = stringTemplate.toUElementOfType() + assertNull(uLiteral) + } + } }