Uast: making KotlinStringTemplateUPolyadicExpression.operands always non-empty (EA-231393)

This commit is contained in:
Nicolay Mitropolsky
2020-04-27 21:09:41 +03:00
parent b7e715045a
commit 00b44c1e68
16 changed files with 126 additions and 10 deletions
@@ -36,7 +36,7 @@ class KotlinStringTemplateUPolyadicExpression(
this,
DEFAULT_EXPRESSION_TYPES_LIST
)!!
}
}.takeIf { it.isNotEmpty() } ?: listOf(KotlinStringULiteralExpression(sourcePsi, this, ""))
}
override val operator = UastBinaryOperator.PLUS
@@ -124,7 +124,8 @@ UFile (package = )
ULiteralExpression (value = "%i %i %i")
UQualifiedReferenceExpression
UQualifiedReferenceExpression
UPolyadicExpression (value = "")
UPolyadicExpression (operator = +)
ULiteralExpression (value = "")
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))
UIdentifier (Identifier (chunked))
USimpleNameReferenceExpression (identifier = chunked, resolvesTo = null)
+2 -1
View File
@@ -124,7 +124,8 @@ UFile (package = )
ULiteralExpression (value = "%i %i %i")
UQualifiedReferenceExpression
UQualifiedReferenceExpression
UPolyadicExpression (value = "")
UPolyadicExpression (operator = +)
ULiteralExpression (value = "")
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1))
UIdentifier (Identifier (chunked))
USimpleNameReferenceExpression (identifier = chunked, resolvesTo = null)
+2
View File
@@ -8,6 +8,8 @@ val literalInLiteral = "a ${"literal$case4"} z"
val literalInLiteral2 = "a ${"literal$case4".repeat(4)} z"
val empty = ""
fun simpleForTemplate(i: Int = 0) = "$i"
fun foo() {
@@ -45,11 +45,16 @@ UFile (package = )
USimpleNameReferenceExpression (identifier = repeat, resolvesTo = null)
ULiteralExpression (value = 4)
ULiteralExpression (value = " z")
UField (name = empty)
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
UPolyadicExpression (operator = +)
ULiteralExpression (value = "")
UMethod (name = getMuchRecur)
UMethod (name = getCase4)
UMethod (name = getCase5)
UMethod (name = getLiteralInLiteral)
UMethod (name = getLiteralInLiteral2)
UMethod (name = getEmpty)
UMethod (name = simpleForTemplate)
UParameter (name = i)
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
@@ -4,11 +4,13 @@ public final class StringTemplateComplexKt {
@org.jetbrains.annotations.NotNull private static final var case5: java.lang.String = "a " + "literal" + " " + "literal" + " z"
@org.jetbrains.annotations.NotNull private static final var literalInLiteral: java.lang.String = "a " + "literal" + case4 + " z"
@org.jetbrains.annotations.NotNull private static final var literalInLiteral2: java.lang.String = "a " + "literal" + case4.repeat(4) + " z"
@org.jetbrains.annotations.NotNull private static final var empty: java.lang.String = ""
public static final fun getMuchRecur() : java.lang.String = UastEmptyExpression
public static final fun getCase4() : java.lang.String = UastEmptyExpression
public static final fun getCase5() : java.lang.String = UastEmptyExpression
public static final fun getLiteralInLiteral() : java.lang.String = UastEmptyExpression
public static final fun getLiteralInLiteral2() : java.lang.String = UastEmptyExpression
public static final fun getEmpty() : java.lang.String = UastEmptyExpression
public static final fun simpleForTemplate(@org.jetbrains.annotations.NotNull i: int) : java.lang.String {
return i
}
@@ -45,11 +45,16 @@ UFile (package = ) [public final class StringTemplateComplexKt {...]
USimpleNameReferenceExpression (identifier = repeat, resolvesTo = null) [repeat] : PsiType:String
ULiteralExpression (value = 4) [4] : PsiType:int
ULiteralExpression (value = " z") [" z"] : PsiType:String
UField (name = empty) [@org.jetbrains.annotations.NotNull private static final var empty: java.lang.String = ""]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
UPolyadicExpression (operator = +) [""] : PsiType:String
ULiteralExpression (value = "") [""] : PsiType:String
UMethod (name = getMuchRecur) [public static final fun getMuchRecur() : java.lang.String = UastEmptyExpression]
UMethod (name = getCase4) [public static final fun getCase4() : java.lang.String = UastEmptyExpression]
UMethod (name = getCase5) [public static final fun getCase5() : java.lang.String = UastEmptyExpression]
UMethod (name = getLiteralInLiteral) [public static final fun getLiteralInLiteral() : java.lang.String = UastEmptyExpression]
UMethod (name = getLiteralInLiteral2) [public static final fun getLiteralInLiteral2() : java.lang.String = UastEmptyExpression]
UMethod (name = getEmpty) [public static final fun getEmpty() : java.lang.String = UastEmptyExpression]
UMethod (name = simpleForTemplate) [public static final fun simpleForTemplate(@org.jetbrains.annotations.NotNull i: int) : java.lang.String {...}]
UParameter (name = i) [@org.jetbrains.annotations.NotNull var i: int = 0]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
@@ -0,0 +1,85 @@
UFile (package = ) [public final class StringTemplateComplexKt {...]
UClass (name = StringTemplateComplexKt) [public final class StringTemplateComplexKt {...}]
UField (name = muchRecur) [@org.jetbrains.annotations.NotNull private static final var muchRecur: java.lang.String = "abc"]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
UPolyadicExpression (operator = +) ["abc"] = "abc"
UPolyadicExpression (operator = +) ["abc"] = "abc"
UPolyadicExpression (operator = +) ["abc"] = "abc"
UPolyadicExpression (operator = +) ["abc"] = "abc"
ULiteralExpression (value = "abc") ["abc"] = "abc"
UField (name = case4) [@org.jetbrains.annotations.NotNull private static final var case4: java.lang.String = "a " + "literal" + " z"]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
UPolyadicExpression (operator = +) ["a " + "literal" + " z"] = "a literal z"
ULiteralExpression (value = "a ") ["a "] = "a "
UPolyadicExpression (operator = +) ["literal"] = "literal"
ULiteralExpression (value = "literal") ["literal"] = "literal"
ULiteralExpression (value = " z") [" z"] = " z"
UField (name = case5) [@org.jetbrains.annotations.NotNull private static final var case5: java.lang.String = "a " + "literal" + " " + "literal" + " z"]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
UPolyadicExpression (operator = +) ["a " + "literal" + " " + "literal" + " z"] = "a literal literal z"
ULiteralExpression (value = "a ") ["a "] = "a "
UPolyadicExpression (operator = +) ["literal"] = "literal"
ULiteralExpression (value = "literal") ["literal"] = "literal"
ULiteralExpression (value = " ") [" "] = " "
UPolyadicExpression (operator = +) ["literal"] = "literal"
ULiteralExpression (value = "literal") ["literal"] = "literal"
ULiteralExpression (value = " z") [" z"] = " z"
UField (name = literalInLiteral) [@org.jetbrains.annotations.NotNull private static final var literalInLiteral: java.lang.String = "a " + "literal" + case4 + " z"]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
UPolyadicExpression (operator = +) ["a " + "literal" + case4 + " z"] = Undetermined
ULiteralExpression (value = "a ") ["a "] = "a "
UPolyadicExpression (operator = +) ["literal" + case4] = Undetermined
ULiteralExpression (value = "literal") ["literal"] = "literal"
USimpleNameReferenceExpression (identifier = case4) [case4] = external case4()
ULiteralExpression (value = " z") [" z"] = " z"
UField (name = literalInLiteral2) [@org.jetbrains.annotations.NotNull private static final var literalInLiteral2: java.lang.String = "a " + "literal" + case4.repeat(4) + " z"]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
UPolyadicExpression (operator = +) ["a " + "literal" + case4.repeat(4) + " z"] = Undetermined
ULiteralExpression (value = "a ") ["a "] = "a "
UQualifiedReferenceExpression ["literal" + case4.repeat(4)] = external repeat(4)(4)
UPolyadicExpression (operator = +) ["literal" + case4] = Undetermined
ULiteralExpression (value = "literal") ["literal"] = "literal"
USimpleNameReferenceExpression (identifier = case4) [case4] = external case4()
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [repeat(4)] = external repeat(4)(4)
UIdentifier (Identifier (repeat)) [UIdentifier (Identifier (repeat))]
USimpleNameReferenceExpression (identifier = repeat, resolvesTo = null) [repeat] = external repeat(4)(4)
ULiteralExpression (value = 4) [4] = 4
ULiteralExpression (value = " z") [" z"] = " z"
UField (name = empty) [@org.jetbrains.annotations.NotNull private static final var empty: java.lang.String = ""]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
UPolyadicExpression (operator = +) [""] = ""
ULiteralExpression (value = "") [""] = ""
UMethod (name = getMuchRecur) [public static final fun getMuchRecur() : java.lang.String = UastEmptyExpression]
UMethod (name = getCase4) [public static final fun getCase4() : java.lang.String = UastEmptyExpression]
UMethod (name = getCase5) [public static final fun getCase5() : java.lang.String = UastEmptyExpression]
UMethod (name = getLiteralInLiteral) [public static final fun getLiteralInLiteral() : java.lang.String = UastEmptyExpression]
UMethod (name = getLiteralInLiteral2) [public static final fun getLiteralInLiteral2() : java.lang.String = UastEmptyExpression]
UMethod (name = getEmpty) [public static final fun getEmpty() : java.lang.String = UastEmptyExpression]
UMethod (name = simpleForTemplate) [public static final fun simpleForTemplate(@org.jetbrains.annotations.NotNull i: int) : java.lang.String {...}]
UParameter (name = i) [@org.jetbrains.annotations.NotNull var i: int = 0]
UAnnotation (fqName = org.jetbrains.annotations.NotNull) [@org.jetbrains.annotations.NotNull]
ULiteralExpression (value = 0) [0] = 0
UBlockExpression [{...}] = Nothing
UReturnExpression [return i] = Nothing
UPolyadicExpression (operator = +) [i] = Undetermined
USimpleNameReferenceExpression (identifier = i) [i] = Undetermined
UMethod (name = foo) [public static final fun foo() : void {...}]
UBlockExpression [{...}] = Undetermined
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) [println(baz)] = external println(baz)(external baz())
UIdentifier (Identifier (println)) [UIdentifier (Identifier (println))]
USimpleNameReferenceExpression (identifier = println, resolvesTo = null) [println] = external println(baz)(external baz())
UPolyadicExpression (operator = +) [baz] = external baz()
USimpleNameReferenceExpression (identifier = baz) [baz] = external baz()
UDeclarationsExpression [var template1: java.lang.String = simpleForTemplate()] = Undetermined
ULocalVariable (name = template1) [var template1: java.lang.String = simpleForTemplate()]
UPolyadicExpression (operator = +) [simpleForTemplate()] = external simpleForTemplate()()
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) [simpleForTemplate()] = external simpleForTemplate()()
UIdentifier (Identifier (simpleForTemplate)) [UIdentifier (Identifier (simpleForTemplate))]
USimpleNameReferenceExpression (identifier = simpleForTemplate, resolvesTo = null) [simpleForTemplate] = external simpleForTemplate()()
UDeclarationsExpression [var template2: java.lang.String = "." + simpleForTemplate()] = Undetermined
ULocalVariable (name = template2) [var template2: java.lang.String = "." + simpleForTemplate()]
UPolyadicExpression (operator = +) ["." + simpleForTemplate()] = Undetermined
ULiteralExpression (value = ".") ["."] = "."
UCallExpression (kind = UastCallKind(name='method_call'), argCount = 0)) [simpleForTemplate()] = external simpleForTemplate()()
UIdentifier (Identifier (simpleForTemplate)) [UIdentifier (Identifier (simpleForTemplate))]
USimpleNameReferenceExpression (identifier = simpleForTemplate, resolvesTo = null) [simpleForTemplate] = external simpleForTemplate()()
@@ -8,6 +8,8 @@ val literalInLiteral = "a ${"literal$case4"} z"
val literalInLiteral2 = "a ${"literal$case4".repeat(4)} z"
val empty = ""
fun simpleForTemplate(i: Int = 0) = "$i"
fun foo() {
@@ -45,11 +45,16 @@ UFile (package = )
USimpleNameReferenceExpression (identifier = repeat, resolvesTo = null)
ULiteralExpression (value = 4)
ULiteralExpression (value = " z")
UField (name = empty)
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
UPolyadicExpression (operator = +)
ULiteralExpression (value = "")
UMethod (name = getMuchRecur)
UMethod (name = getCase4)
UMethod (name = getCase5)
UMethod (name = getLiteralInLiteral)
UMethod (name = getLiteralInLiteral2)
UMethod (name = getEmpty)
UMethod (name = simpleForTemplate)
UParameter (name = i)
UAnnotation (fqName = org.jetbrains.annotations.NotNull)
@@ -4,11 +4,13 @@ public final class StringTemplateComplexForUInjectionHostKt {
@org.jetbrains.annotations.NotNull private static final var case5: java.lang.String = "a " + "literal" + " " + "literal" + " z"
@org.jetbrains.annotations.NotNull private static final var literalInLiteral: java.lang.String = "a " + "literal" + case4 + " z"
@org.jetbrains.annotations.NotNull private static final var literalInLiteral2: java.lang.String = "a " + "literal" + case4.repeat(4) + " z"
@org.jetbrains.annotations.NotNull private static final var empty: java.lang.String = ""
public static final fun getMuchRecur() : java.lang.String = UastEmptyExpression
public static final fun getCase4() : java.lang.String = UastEmptyExpression
public static final fun getCase5() : java.lang.String = UastEmptyExpression
public static final fun getLiteralInLiteral() : java.lang.String = UastEmptyExpression
public static final fun getLiteralInLiteral2() : java.lang.String = UastEmptyExpression
public static final fun getEmpty() : java.lang.String = UastEmptyExpression
public static final fun simpleForTemplate(@org.jetbrains.annotations.NotNull i: int) : java.lang.String {
return i
}
@@ -36,5 +36,6 @@ UFile (package = )
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 1))
UIdentifier (Identifier (UnsupportedOperationException))
USimpleNameReferenceExpression (identifier = <init>, resolvesTo = UnsupportedOperationException)
UPolyadicExpression (value = "")
UPolyadicExpression (operator = +)
ULiteralExpression (value = "")
UMethod (name = )
@@ -36,5 +36,6 @@ UFile (package = )
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 1))
UIdentifier (Identifier (UnsupportedOperationException))
USimpleNameReferenceExpression (identifier = <init>, resolvesTo = UnsupportedOperationException)
UPolyadicExpression (value = "")
UPolyadicExpression (operator = +)
ULiteralExpression (value = "")
UMethod (name = Model$1$1)
@@ -36,5 +36,6 @@ UFile (package = ) [public abstract interface Callback {...]
UCallExpression (kind = UastCallKind(name='constructor_call'), argCount = 1)) [<init>("")] : PsiType:UnsupportedOperationException
UIdentifier (Identifier (UnsupportedOperationException)) [UIdentifier (Identifier (UnsupportedOperationException))]
USimpleNameReferenceExpression (identifier = <init>, resolvesTo = UnsupportedOperationException) [<init>] : PsiType:UnsupportedOperationException
UPolyadicExpression (value = "") [""] : PsiType:String
UPolyadicExpression (operator = +) [""] : PsiType:String
ULiteralExpression (value = "") [""] : PsiType:String
UMethod (name = Model$1$1) [fun Model$1$1() = UastEmptyExpression]
@@ -79,7 +79,7 @@ class KotlinUastResolveApiTest : KotlinLightCodeInsightFixtureTestCase() {
"s.kt", """
fun main(args: Array<String>) {
System.out.print(""
System.out.print("1"
}
"""
)
@@ -103,7 +103,7 @@ class KotlinUastResolveApiTest : KotlinLightCodeInsightFixtureTestCase() {
TestCase.assertEquals(PsiType.VOID, functionCall.getExpressionType())
val firstArgument = main.findElementByText<UElement>("\"\"")
val firstArgument = main.findElementByText<UElement>("\"1\"")
val firstParameter = functionCall.getArgumentForParameter(0)
TestCase.assertEquals(firstArgument, firstParameter)
}
@@ -124,7 +124,7 @@ class KotlinUastResolveApiTest : KotlinLightCodeInsightFixtureTestCase() {
"s.kt", """
fun main(args: Array<String>) {
JavaClass().setParameter(""
JavaClass().setParameter("1"
}
"""
)
@@ -144,7 +144,7 @@ class KotlinUastResolveApiTest : KotlinLightCodeInsightFixtureTestCase() {
TestCase.assertEquals(PsiType.VOID, functionCall.getExpressionType())
val firstArgument = main.findElementByText<UElement>("\"\"")
val firstArgument = main.findElementByText<UElement>("\"1\"")
val firstParameter = functionCall.getArgumentForParameter(0)
TestCase.assertEquals(firstArgument, firstParameter)
}
@@ -18,4 +18,7 @@ class KotlinUastValuesTest : AbstractKotlinValuesTest() {
@Test
fun testSimple() = doTest("Simple")
@Test
fun testStringTemplateComplex() = doTest("StringTemplateComplex")
}