diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java index 16367f57392..fef6b0a40af 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2012 JetBrains s.r.o. + * Copyright 2010-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -826,6 +826,10 @@ public class KotlinBuiltIns { return !(type instanceof PackageType) && type.equals(getUnitType()); } + public boolean isString(@Nullable JetType type) { + return !(type instanceof PackageType) && getStringType().equals(type); + } + public boolean isData(@NotNull ClassDescriptor classDescriptor) { return containsAnnotation(classDescriptor, getDataClassAnnotation()); } diff --git a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt index 77782ebd9ae..d5f2c5c96f6 100644 --- a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt @@ -390,6 +390,7 @@ fun main(args: Array) { model("intentions/replaceWithDotQualifiedMethodCall", testMethod = "doTestReplaceWithDotQualifiedMethodCall") model("intentions/replaceWithInfixFunctionCall", testMethod = "doTestReplaceWithInfixFunctionCall") model("intentions/removeCurlyBracesFromTemplate", testMethod = "doTestRemoveCurlyFromTemplate") + model("intentions/convertToStringTemplateIntention", testMethod = "doTestConvertToStringTemplate") model("intentions/insertCurlyBracestsToTemplate", testMethod = "doTestInsertCurlyToTemplate") model("intentions/moveLambdaInsideParentheses", testMethod = "doTestMoveLambdaInsideParentheses") model("intentions/moveLambdaOutsideParentheses", testMethod = "doTestMoveLambdaOutsideParentheses") diff --git a/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/after.kt.template b/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/after.kt.template new file mode 100644 index 00000000000..025ec57dab4 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/after.kt.template @@ -0,0 +1,2 @@ +val x = "World" +val y = "Hello $x" diff --git a/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/before.kt.template b/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/before.kt.template new file mode 100644 index 00000000000..aa02c31e6cd --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/before.kt.template @@ -0,0 +1,2 @@ +val x = "World" +val y = "Hello " + x diff --git a/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/description.html b/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/description.html new file mode 100644 index 00000000000..ab36e0a7437 --- /dev/null +++ b/idea/resources/intentionDescriptions/ConvertToStringTemplateIntention/description.html @@ -0,0 +1,5 @@ + + +Converts a statement that builds a String using '+' to one that builds a String using a String template + + diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 4df3f79c1b9..c28f9d8ef54 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -709,6 +709,11 @@ Kotlin + + org.jetbrains.jet.plugin.intentions.ConvertToStringTemplateIntention + Kotlin + + org.jetbrains.jet.plugin.intentions.OperatorToFunctionIntention Kotlin @@ -749,14 +754,8 @@ level="WARNING" /> - - org.jetbrains.jet.plugin.intentions.InvertIfConditionIntention - Kotlin - - - diff --git a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties index 61074b9d57c..52dc67e1dae 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetBundle.properties +++ b/idea/src/org/jetbrains/jet/plugin/JetBundle.properties @@ -320,6 +320,8 @@ convert.to.for.each.loop.intention=Replace with a for each loop convert.to.for.each.loop.intention.family=Replace with a For Each Loop convert.to.for.each.function.call.intention=Replace with a forEach function call convert.to.for.each.function.call.intention.family=Replace with a forEach Function Call +convert.to.string.template=Convert concatenation to template +convert.to.string.template.family=Convert Concatenation to Template property.is.implemented.too.many=Has implementations property.is.overridden.too.many=Is overridden in subclasses diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/ConvertToStringTemplateIntention.kt b/idea/src/org/jetbrains/jet/plugin/intentions/ConvertToStringTemplateIntention.kt new file mode 100644 index 00000000000..c3eb286e80a --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/intentions/ConvertToStringTemplateIntention.kt @@ -0,0 +1,115 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.intentions + +import org.jetbrains.jet.lang.psi.JetBinaryExpression +import com.intellij.openapi.editor.Editor +import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache +import org.jetbrains.jet.lang.resolve.BindingContextUtils +import org.jetbrains.jet.lang.psi.JetExpression +import org.jetbrains.jet.lang.psi.JetPsiFactory +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression +import org.jetbrains.jet.lang.psi.JetConstantExpression +import org.jetbrains.jet.lang.psi.JetStringTemplateExpression +import org.jetbrains.jet.lang.evaluate.ConstantExpressionEvaluator +import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace +import org.jetbrains.jet.lang.resolve.constants.IntegerValueTypeConstant +import org.jetbrains.jet.lexer.JetTokens +import org.jetbrains.jet.lang.psi.JetPsiUtil +import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.util.PsiUtilCore +import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns + + +public class ConvertToStringTemplateIntention : JetSelfTargetingIntention("convert.to.string.template", javaClass()) { + override fun isApplicableTo(element: JetBinaryExpression): Boolean { + if (element.getOperationToken() != JetTokens.PLUS) return false + + val context = AnalyzerFacadeWithCache.getContextForElement(element) + val elementType = BindingContextUtils.getRecordedTypeInfo(element, context)?.getType() + if (!(KotlinBuiltIns.getInstance().isString(elementType))) return false + + val (left, right) = Pair(element.getLeft(), element.getRight()) + if (left == null || right == null) return false + + return !(PsiUtilCore.hasErrorElementChild(left) || PsiUtilCore.hasErrorElementChild(right)) + } + + override fun applyTo(element: JetBinaryExpression, editor: Editor) { + val parent = element.getParent() + if (parent is JetBinaryExpression && isApplicableTo(parent)) { + return applyTo(parent, editor) + } + + val rightStr = mkString(element.getRight(), false) + val resultStr = fold(element.getLeft(), rightStr) + val expr = JetPsiFactory.createExpression(element.getProject(), resultStr) + + element.replace(expr) + } + + private fun fold(left: JetExpression?, right: String): String { + val needsBraces = !right.isEmpty() && right.first() != '$' && Character.isJavaIdentifierPart(right.first()) + if (left is JetBinaryExpression && isApplicableTo(left)) { + val l_right = mkString(left.getRight(), needsBraces) + val newBase = "%s%s".format(l_right, right) + return fold(left.getLeft(), newBase) + } + else { + val leftStr = mkString(left, needsBraces) + return "\"%s%s\"".format(leftStr, right) + } + } + + private fun mkString(expr: JetExpression?, needsBraces: Boolean): String { + val expression = JetPsiUtil.deparenthesize(expr) + val expressionText = expression?.getText() ?: "" + return when (expression) { + is JetConstantExpression -> { + val context = AnalyzerFacadeWithCache.getContextForElement(expression) + val trace = DelegatingBindingTrace(context, "Trace for evaluating constant") + val constant = ConstantExpressionEvaluator.evaluate(expression, trace, null) + if (constant is IntegerValueTypeConstant) { + val elementType = BindingContextUtils.getRecordedTypeInfo(expression, context)?.getType() + constant.getValue(elementType!!).toString() + } + else { + constant?.getValue().toString() + } + } + is JetStringTemplateExpression -> { + val base = if (expressionText.startsWith("\"\"\"") && (expressionText.endsWith("\"\"\""))) { + val unquoted = expressionText.substring(3, expressionText.length - 3) + StringUtil.escapeStringCharacters(unquoted) + } + else { + StringUtil.unquoteString(expressionText) + } + if (needsBraces && base.endsWith('$')) { + base.substring(0, base.length - 1) + "\\$" + } + else { + base + } + } + is JetSimpleNameExpression -> + if (needsBraces) "\${${expressionText}}" else "\$${expressionText}" + null -> "" + else -> "\${${expressionText.replaceAll("\n+", " ")}}" + } + } +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/backslashNMultilineString.kt b/idea/testData/intentions/convertToStringTemplateIntention/backslashNMultilineString.kt new file mode 100644 index 00000000000..5eef6cf6e1a --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/backslashNMultilineString.kt @@ -0,0 +1,4 @@ +fun main(args: Array){ + val x = "foo" + """bar\n + """ +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/backslashNMultilineString.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/backslashNMultilineString.kt.after new file mode 100644 index 00000000000..d34755ac9da --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/backslashNMultilineString.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "foobar\\n\n " +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/combineEmptyStrings.kt b/idea/testData/intentions/convertToStringTemplateIntention/combineEmptyStrings.kt new file mode 100644 index 00000000000..9f43fbfba65 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/combineEmptyStrings.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "" + "" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/combineEmptyStrings.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/combineEmptyStrings.kt.after new file mode 100644 index 00000000000..abfdbda5b42 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/combineEmptyStrings.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings.kt b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings.kt new file mode 100644 index 00000000000..f5e60bbc0a8 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc" + 1 + 2 + 'a' + 3.2 +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings.kt.after new file mode 100644 index 00000000000..a62a2c3b6b5 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc12a3.2" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings2.kt b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings2.kt new file mode 100644 index 00000000000..226e6842569 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings2.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc" + 1 + 2 + 'a' + 3.2 +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings2.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings2.kt.after new file mode 100644 index 00000000000..a62a2c3b6b5 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings2.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc12a3.2" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/consecutiveNewlines.kt b/idea/testData/intentions/convertToStringTemplateIntention/consecutiveNewlines.kt new file mode 100644 index 00000000000..b2840bff266 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/consecutiveNewlines.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +fun main(args: Array){ + val y = "abcd" + listOf( 1, + + + + 2 ) +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/consecutiveNewlines.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/consecutiveNewlines.kt.after new file mode 100644 index 00000000000..de7014c9f15 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/consecutiveNewlines.kt.after @@ -0,0 +1,4 @@ +// WITH_RUNTIME +fun main(args: Array){ + val y = "abcd${listOf(1, 2)}" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplate.kt b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplate.kt new file mode 100644 index 00000000000..bd79fc7f7fd --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplate.kt @@ -0,0 +1,5 @@ +fun main(args: Array){ + val x = "abc" + val y = "cde" + val z = "$y" + "$x.bar" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplate.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplate.kt.after new file mode 100644 index 00000000000..39a086762da --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplate.kt.after @@ -0,0 +1,5 @@ +fun main(args: Array){ + val x = "abc" + val y = "cde" + val z = "$y$x.bar" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplateWithBraces.kt b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplateWithBraces.kt new file mode 100644 index 00000000000..968dc9e861b --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplateWithBraces.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +fun main(args: Array){ + val y = "cde" + val z = "${listOf(1, 2)}" + "$y.bar" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplateWithBraces.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplateWithBraces.kt.after new file mode 100644 index 00000000000..d05370cd5d4 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplateWithBraces.kt.after @@ -0,0 +1,5 @@ +// WITH_RUNTIME +fun main(args: Array){ + val y = "cde" + val z = "${listOf(1, 2)}$y.bar" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/insertBracesForSimpleNamedExpression.kt b/idea/testData/intentions/convertToStringTemplateIntention/insertBracesForSimpleNamedExpression.kt new file mode 100644 index 00000000000..6fbb612f2e1 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/insertBracesForSimpleNamedExpression.kt @@ -0,0 +1,4 @@ +fun main(args: Array){ + val x = "abc" + val y = x + "d" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/insertBracesForSimpleNamedExpression.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/insertBracesForSimpleNamedExpression.kt.after new file mode 100644 index 00000000000..bb9a7f7fc8a --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/insertBracesForSimpleNamedExpression.kt.after @@ -0,0 +1,4 @@ +fun main(args: Array){ + val x = "abc" + val y = "${x}d" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate2StringConstants.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2StringConstants.kt new file mode 100644 index 00000000000..216010a5fdc --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2StringConstants.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc" + "def" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate2StringConstants.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2StringConstants.kt.after new file mode 100644 index 00000000000..faa1c6e93e1 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2StringConstants.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abcdef" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate2Vals.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2Vals.kt new file mode 100644 index 00000000000..0bb03d89bdc --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2Vals.kt @@ -0,0 +1,5 @@ +fun main(args: Array){ + val a = "abc" + val b = "bcd" + val x = a + b +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate2Vals.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2Vals.kt.after new file mode 100644 index 00000000000..ba0fdf51d36 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate2Vals.kt.after @@ -0,0 +1,5 @@ +fun main(args: Array){ + val a = "abc" + val b = "bcd" + val x = "$a$b" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Left.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Left.kt new file mode 100644 index 00000000000..91038810b65 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Left.kt @@ -0,0 +1,5 @@ +fun main(args: Array){ + val a = "abc" + val c = "bcd" + val x = a + "b" + c +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Left.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Left.kt.after new file mode 100644 index 00000000000..da13aac5368 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Left.kt.after @@ -0,0 +1,5 @@ +fun main(args: Array){ + val a = "abc" + val c = "bcd" + val x = "${a}b$c" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Right.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Right.kt new file mode 100644 index 00000000000..1f2b0e735c8 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Right.kt @@ -0,0 +1,5 @@ +fun main(args: Array){ + val a = "abc" + val c = "bcd" + val x = a + "b" + c +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Right.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Right.kt.after new file mode 100644 index 00000000000..da13aac5368 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolate3Right.kt.after @@ -0,0 +1,5 @@ +fun main(args: Array){ + val a = "abc" + val c = "bcd" + val x = "${a}b$c" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateChar.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolateChar.kt new file mode 100644 index 00000000000..7021429bfd8 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateChar.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc" + 'd' +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateChar.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolateChar.kt.after new file mode 100644 index 00000000000..72aacc287e0 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateChar.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abcd" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateDollarSign.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolateDollarSign.kt new file mode 100644 index 00000000000..4aea185b8f6 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateDollarSign.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "$" + 'd' +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateDollarSign.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolateDollarSign.kt.after new file mode 100644 index 00000000000..349cfc17a96 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateDollarSign.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "\$d" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateMapAccess.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMapAccess.kt new file mode 100644 index 00000000000..f85b6b821ec --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMapAccess.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +fun main(args: Array){ + val x = mapOf("a" to "b") + val y = "abcd" + x["a"] +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateMapAccess.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMapAccess.kt.after new file mode 100644 index 00000000000..9b2d407f770 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMapAccess.kt.after @@ -0,0 +1,5 @@ +// WITH_RUNTIME +fun main(args: Array){ + val x = mapOf("a" to "b") + val y = "abcd${x["a"]}" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateMethodInvoke.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMethodInvoke.kt new file mode 100644 index 00000000000..175e4eef259 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMethodInvoke.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +fun main(args: Array){ + val x = "abcd" + val y = x + x.reverse() +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateMethodInvoke.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMethodInvoke.kt.after new file mode 100644 index 00000000000..07d781bfd19 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMethodInvoke.kt.after @@ -0,0 +1,5 @@ +// WITH_RUNTIME +fun main(args: Array){ + val x = "abcd" + val y = "$x${x.reverse()}" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateMultiline.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMultiline.kt new file mode 100644 index 00000000000..9d9caea5c9b --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMultiline.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +fun main(args: Array){ + val y = "abcd" + listOf( 1, + 2 ) +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateMultiline.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMultiline.kt.after new file mode 100644 index 00000000000..de7014c9f15 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateMultiline.kt.after @@ -0,0 +1,4 @@ +// WITH_RUNTIME +fun main(args: Array){ + val y = "abcd${listOf(1, 2)}" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithFloat.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithFloat.kt new file mode 100644 index 00000000000..077c146e090 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithFloat.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc" + 0.320 +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithFloat.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithFloat.kt.after new file mode 100644 index 00000000000..6c5c2412497 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithFloat.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc0.32" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithInt.kt b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithInt.kt new file mode 100644 index 00000000000..ed925924b09 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithInt.kt @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc" + 32 +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithInt.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithInt.kt.after new file mode 100644 index 00000000000..05622d974ad --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithInt.kt.after @@ -0,0 +1,3 @@ +fun main(args: Array){ + val x = "abc32" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/multilineString.kt b/idea/testData/intentions/convertToStringTemplateIntention/multilineString.kt new file mode 100644 index 00000000000..3198daba8bf --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/multilineString.kt @@ -0,0 +1,5 @@ +fun main(args: Array){ + var r = "a" + val x = "foo" + """bar + $r""" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/multilineString.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/multilineString.kt.after new file mode 100644 index 00000000000..c5238959521 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/multilineString.kt.after @@ -0,0 +1,4 @@ +fun main(args: Array){ + var r = "a" + val x = "foobar\n $r" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/noBracesForLastSimpleExpression.kt b/idea/testData/intentions/convertToStringTemplateIntention/noBracesForLastSimpleExpression.kt new file mode 100644 index 00000000000..c3d67af0da9 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/noBracesForLastSimpleExpression.kt @@ -0,0 +1,4 @@ +fun main(args: Array){ + val x = "abc" + val y = "d" + x +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/noBracesForLastSimpleExpression.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/noBracesForLastSimpleExpression.kt.after new file mode 100644 index 00000000000..242a2344ca5 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/noBracesForLastSimpleExpression.kt.after @@ -0,0 +1,4 @@ +fun main(args: Array){ + val x = "abc" + val y = "d$x" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/noBracesSimpleFollowedByDot.kt b/idea/testData/intentions/convertToStringTemplateIntention/noBracesSimpleFollowedByDot.kt new file mode 100644 index 00000000000..20c734f9e08 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/noBracesSimpleFollowedByDot.kt @@ -0,0 +1,4 @@ +fun main(args: Array){ + val x = "abc" + val y = x + ".bar" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/noBracesSimpleFollowedByDot.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/noBracesSimpleFollowedByDot.kt.after new file mode 100644 index 00000000000..ece061528ca --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/noBracesSimpleFollowedByDot.kt.after @@ -0,0 +1,4 @@ +fun main(args: Array){ + val x = "abc" + val y = "$x.bar" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/notApplicableForErrorElement.kt b/idea/testData/intentions/convertToStringTemplateIntention/notApplicableForErrorElement.kt new file mode 100644 index 00000000000..a64b53b7dcf --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/notApplicableForErrorElement.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun main(args: Array){ + val x = "x" + " +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/onlyForConcat.kt b/idea/testData/intentions/convertToStringTemplateIntention/onlyForConcat.kt new file mode 100644 index 00000000000..0a13ca4c712 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/onlyForConcat.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +// ERROR: Unresolved reference: / +fun main(args: Array){ + val x = "def" / "abc" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/onlyForStrings.kt b/idea/testData/intentions/convertToStringTemplateIntention/onlyForStrings.kt new file mode 100644 index 00000000000..603f7080246 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/onlyForStrings.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun main(args: Array){ + val x = 23 + 76 +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/requiresPlusOperator.kt b/idea/testData/intentions/convertToStringTemplateIntention/requiresPlusOperator.kt new file mode 100644 index 00000000000..1209ddcacdf --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/requiresPlusOperator.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +fun main(args: Array){ + var x = "abcd" + x += "42" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/tricky.kt b/idea/testData/intentions/convertToStringTemplateIntention/tricky.kt new file mode 100644 index 00000000000..bec65a36f13 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/tricky.kt @@ -0,0 +1,5 @@ +fun compute1(): Int = 777 +fun main(args: Array){ + val a = "a" + "a = " + a + ", b = " + (compute1() + 222) + " :)" +} diff --git a/idea/testData/intentions/convertToStringTemplateIntention/tricky.kt.after b/idea/testData/intentions/convertToStringTemplateIntention/tricky.kt.after new file mode 100644 index 00000000000..599144c38fb --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplateIntention/tricky.kt.after @@ -0,0 +1,5 @@ +fun compute1(): Int = 777 +fun main(args: Array){ + val a = "a" + "a = $a, b = ${compute1() + 222} :)" +} diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java b/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java index 628df8d30c9..97343a35bf9 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java @@ -63,6 +63,10 @@ public abstract class AbstractCodeTransformationTest extends LightCodeInsightTes doTestIntention(path, new IfThenToSafeAccessIntention()); } + public void doTestConvertToStringTemplate(@NotNull String path) throws Exception { + doTestIntention(path, new ConvertToStringTemplateIntention()); + } + public void doTestFoldIfToAssignment(@NotNull String path) throws Exception { doTestIntention(path, new FoldIfToAssignmentIntention()); } diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java index 8d93bb2e3cd..f405ba3294f 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java @@ -30,7 +30,7 @@ import org.jetbrains.jet.plugin.intentions.AbstractCodeTransformationTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") -@InnerTestClasses({CodeTransformationTestGenerated.DoubleBangToIfThen.class, CodeTransformationTestGenerated.IfThenToDoubleBang.class, CodeTransformationTestGenerated.ElvisToIfThen.class, CodeTransformationTestGenerated.IfThenToElvis.class, CodeTransformationTestGenerated.SafeAccessToIfThen.class, CodeTransformationTestGenerated.IfThenToSafeAccess.class, CodeTransformationTestGenerated.IfToAssignment.class, CodeTransformationTestGenerated.IfToReturn.class, CodeTransformationTestGenerated.IfToReturnAsymmetrically.class, CodeTransformationTestGenerated.WhenToAssignment.class, CodeTransformationTestGenerated.WhenToReturn.class, CodeTransformationTestGenerated.AssignmentToIf.class, CodeTransformationTestGenerated.AssignmentToWhen.class, CodeTransformationTestGenerated.PropertyToIf.class, CodeTransformationTestGenerated.PropertyToWhen.class, CodeTransformationTestGenerated.ReturnToIf.class, CodeTransformationTestGenerated.ReturnToWhen.class, CodeTransformationTestGenerated.IfToWhen.class, CodeTransformationTestGenerated.WhenToIf.class, CodeTransformationTestGenerated.Flatten.class, CodeTransformationTestGenerated.Merge.class, CodeTransformationTestGenerated.IntroduceSubject.class, CodeTransformationTestGenerated.EliminateSubject.class, CodeTransformationTestGenerated.Split.class, CodeTransformationTestGenerated.Join.class, CodeTransformationTestGenerated.ConvertMemberToExtension.class, CodeTransformationTestGenerated.ReconstructedType.class, CodeTransformationTestGenerated.RemoveUnnecessaryParentheses.class, CodeTransformationTestGenerated.ReplaceWithDotQualifiedMethodCall.class, CodeTransformationTestGenerated.ReplaceWithInfixFunctionCall.class, CodeTransformationTestGenerated.RemoveCurlyBracesFromTemplate.class, CodeTransformationTestGenerated.MoveLambdaInsideParentheses.class, CodeTransformationTestGenerated.MoveLambdaOutsideParentheses.class, CodeTransformationTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, CodeTransformationTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class, CodeTransformationTestGenerated.RemoveBraces.class, CodeTransformationTestGenerated.AddBraces.class, CodeTransformationTestGenerated.ReplaceGetIntention.class, CodeTransformationTestGenerated.ReplaceContainsIntention.class, CodeTransformationTestGenerated.ReplaceBinaryInfixIntention.class, CodeTransformationTestGenerated.ReplaceUnaryPrefixIntention.class, CodeTransformationTestGenerated.ReplaceInvokeIntention.class, CodeTransformationTestGenerated.SimplifyNegatedBinaryExpressionIntention.class, CodeTransformationTestGenerated.ConvertNegatedBooleanSequence.class, CodeTransformationTestGenerated.ConvertNegatedExpressionWithDemorgansLaw.class, CodeTransformationTestGenerated.SwapBinaryExpression.class, CodeTransformationTestGenerated.SplitIf.class, CodeTransformationTestGenerated.ReplaceWithOperatorAssign.class, CodeTransformationTestGenerated.ReplaceWithTraditionalAssignment.class, CodeTransformationTestGenerated.SimplifyBooleanWithConstants.class, CodeTransformationTestGenerated.InsertExplicitTypeArguments.class, CodeTransformationTestGenerated.RemoveExplicitTypeArguments.class, CodeTransformationTestGenerated.ConvertAssertToIf.class, CodeTransformationTestGenerated.ConvertIfToAssert.class, CodeTransformationTestGenerated.MakeTypeExplicitInLambda.class, CodeTransformationTestGenerated.MakeTypeImplicitInLambda.class, CodeTransformationTestGenerated.InvertIfCondition.class, CodeTransformationTestGenerated.OperatorToFunction.class, CodeTransformationTestGenerated.ConvertToForEachLoop.class, CodeTransformationTestGenerated.ConvertToForEachFunctionCall.class}) +@InnerTestClasses({CodeTransformationTestGenerated.DoubleBangToIfThen.class, CodeTransformationTestGenerated.IfThenToDoubleBang.class, CodeTransformationTestGenerated.ElvisToIfThen.class, CodeTransformationTestGenerated.IfThenToElvis.class, CodeTransformationTestGenerated.SafeAccessToIfThen.class, CodeTransformationTestGenerated.IfThenToSafeAccess.class, CodeTransformationTestGenerated.IfToAssignment.class, CodeTransformationTestGenerated.IfToReturn.class, CodeTransformationTestGenerated.IfToReturnAsymmetrically.class, CodeTransformationTestGenerated.WhenToAssignment.class, CodeTransformationTestGenerated.WhenToReturn.class, CodeTransformationTestGenerated.AssignmentToIf.class, CodeTransformationTestGenerated.AssignmentToWhen.class, CodeTransformationTestGenerated.PropertyToIf.class, CodeTransformationTestGenerated.PropertyToWhen.class, CodeTransformationTestGenerated.ReturnToIf.class, CodeTransformationTestGenerated.ReturnToWhen.class, CodeTransformationTestGenerated.IfToWhen.class, CodeTransformationTestGenerated.WhenToIf.class, CodeTransformationTestGenerated.Flatten.class, CodeTransformationTestGenerated.Merge.class, CodeTransformationTestGenerated.IntroduceSubject.class, CodeTransformationTestGenerated.EliminateSubject.class, CodeTransformationTestGenerated.Split.class, CodeTransformationTestGenerated.Join.class, CodeTransformationTestGenerated.ConvertMemberToExtension.class, CodeTransformationTestGenerated.ReconstructedType.class, CodeTransformationTestGenerated.RemoveUnnecessaryParentheses.class, CodeTransformationTestGenerated.ReplaceWithDotQualifiedMethodCall.class, CodeTransformationTestGenerated.ReplaceWithInfixFunctionCall.class, CodeTransformationTestGenerated.RemoveCurlyBracesFromTemplate.class, CodeTransformationTestGenerated.ConvertToStringTemplateIntention.class, CodeTransformationTestGenerated.MoveLambdaInsideParentheses.class, CodeTransformationTestGenerated.MoveLambdaOutsideParentheses.class, CodeTransformationTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, CodeTransformationTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class, CodeTransformationTestGenerated.RemoveBraces.class, CodeTransformationTestGenerated.AddBraces.class, CodeTransformationTestGenerated.ReplaceGetIntention.class, CodeTransformationTestGenerated.ReplaceContainsIntention.class, CodeTransformationTestGenerated.ReplaceBinaryInfixIntention.class, CodeTransformationTestGenerated.ReplaceUnaryPrefixIntention.class, CodeTransformationTestGenerated.ReplaceInvokeIntention.class, CodeTransformationTestGenerated.SimplifyNegatedBinaryExpressionIntention.class, CodeTransformationTestGenerated.ConvertNegatedBooleanSequence.class, CodeTransformationTestGenerated.ConvertNegatedExpressionWithDemorgansLaw.class, CodeTransformationTestGenerated.SwapBinaryExpression.class, CodeTransformationTestGenerated.SplitIf.class, CodeTransformationTestGenerated.ReplaceWithOperatorAssign.class, CodeTransformationTestGenerated.ReplaceWithTraditionalAssignment.class, CodeTransformationTestGenerated.SimplifyBooleanWithConstants.class, CodeTransformationTestGenerated.InsertExplicitTypeArguments.class, CodeTransformationTestGenerated.RemoveExplicitTypeArguments.class, CodeTransformationTestGenerated.ConvertAssertToIf.class, CodeTransformationTestGenerated.ConvertIfToAssert.class, CodeTransformationTestGenerated.MakeTypeExplicitInLambda.class, CodeTransformationTestGenerated.MakeTypeImplicitInLambda.class, CodeTransformationTestGenerated.InvertIfCondition.class, CodeTransformationTestGenerated.OperatorToFunction.class, CodeTransformationTestGenerated.ConvertToForEachLoop.class, CodeTransformationTestGenerated.ConvertToForEachFunctionCall.class}) public class CodeTransformationTestGenerated extends AbstractCodeTransformationTest { @TestMetadata("idea/testData/intentions/branched/doubleBangToIfThen") public static class DoubleBangToIfThen extends AbstractCodeTransformationTest { @@ -2157,6 +2157,149 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT } + @TestMetadata("idea/testData/intentions/convertToStringTemplateIntention") + public static class ConvertToStringTemplateIntention extends AbstractCodeTransformationTest { + public void testAllFilesPresentInConvertToStringTemplateIntention() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/intentions/convertToStringTemplateIntention"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("backslashNMultilineString.kt") + public void testBackslashNMultilineString() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/backslashNMultilineString.kt"); + } + + @TestMetadata("combineEmptyStrings.kt") + public void testCombineEmptyStrings() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/combineEmptyStrings.kt"); + } + + @TestMetadata("combinesNonStringsAsStrings.kt") + public void testCombinesNonStringsAsStrings() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings.kt"); + } + + @TestMetadata("combinesNonStringsAsStrings2.kt") + public void testCombinesNonStringsAsStrings2() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/combinesNonStringsAsStrings2.kt"); + } + + @TestMetadata("consecutiveNewlines.kt") + public void testConsecutiveNewlines() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/consecutiveNewlines.kt"); + } + + @TestMetadata("doesNotCorruptExistingTemplate.kt") + public void testDoesNotCorruptExistingTemplate() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplate.kt"); + } + + @TestMetadata("doesNotCorruptExistingTemplateWithBraces.kt") + public void testDoesNotCorruptExistingTemplateWithBraces() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/doesNotCorruptExistingTemplateWithBraces.kt"); + } + + @TestMetadata("insertBracesForSimpleNamedExpression.kt") + public void testInsertBracesForSimpleNamedExpression() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/insertBracesForSimpleNamedExpression.kt"); + } + + @TestMetadata("interpolate2StringConstants.kt") + public void testInterpolate2StringConstants() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolate2StringConstants.kt"); + } + + @TestMetadata("interpolate2Vals.kt") + public void testInterpolate2Vals() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolate2Vals.kt"); + } + + @TestMetadata("interpolate3Left.kt") + public void testInterpolate3Left() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolate3Left.kt"); + } + + @TestMetadata("interpolate3Right.kt") + public void testInterpolate3Right() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolate3Right.kt"); + } + + @TestMetadata("interpolateChar.kt") + public void testInterpolateChar() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolateChar.kt"); + } + + @TestMetadata("interpolateDollarSign.kt") + public void testInterpolateDollarSign() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolateDollarSign.kt"); + } + + @TestMetadata("interpolateMapAccess.kt") + public void testInterpolateMapAccess() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolateMapAccess.kt"); + } + + @TestMetadata("interpolateMethodInvoke.kt") + public void testInterpolateMethodInvoke() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolateMethodInvoke.kt"); + } + + @TestMetadata("interpolateMultiline.kt") + public void testInterpolateMultiline() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolateMultiline.kt"); + } + + @TestMetadata("interpolateStringWithFloat.kt") + public void testInterpolateStringWithFloat() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithFloat.kt"); + } + + @TestMetadata("interpolateStringWithInt.kt") + public void testInterpolateStringWithInt() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/interpolateStringWithInt.kt"); + } + + @TestMetadata("multilineString.kt") + public void testMultilineString() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/multilineString.kt"); + } + + @TestMetadata("noBracesForLastSimpleExpression.kt") + public void testNoBracesForLastSimpleExpression() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/noBracesForLastSimpleExpression.kt"); + } + + @TestMetadata("noBracesSimpleFollowedByDot.kt") + public void testNoBracesSimpleFollowedByDot() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/noBracesSimpleFollowedByDot.kt"); + } + + @TestMetadata("notApplicableForErrorElement.kt") + public void testNotApplicableForErrorElement() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/notApplicableForErrorElement.kt"); + } + + @TestMetadata("onlyForConcat.kt") + public void testOnlyForConcat() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/onlyForConcat.kt"); + } + + @TestMetadata("onlyForStrings.kt") + public void testOnlyForStrings() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/onlyForStrings.kt"); + } + + @TestMetadata("requiresPlusOperator.kt") + public void testRequiresPlusOperator() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/requiresPlusOperator.kt"); + } + + @TestMetadata("tricky.kt") + public void testTricky() throws Exception { + doTestConvertToStringTemplate("idea/testData/intentions/convertToStringTemplateIntention/tricky.kt"); + } + + } + @TestMetadata("idea/testData/intentions/moveLambdaInsideParentheses") public static class MoveLambdaInsideParentheses extends AbstractCodeTransformationTest { public void testAllFilesPresentInMoveLambdaInsideParentheses() throws Exception { @@ -4455,6 +4598,7 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT suite.addTestSuite(ReplaceWithDotQualifiedMethodCall.class); suite.addTestSuite(ReplaceWithInfixFunctionCall.class); suite.addTestSuite(RemoveCurlyBracesFromTemplate.class); + suite.addTestSuite(ConvertToStringTemplateIntention.class); suite.addTestSuite(MoveLambdaInsideParentheses.class); suite.addTestSuite(MoveLambdaOutsideParentheses.class); suite.addTestSuite(ReplaceExplicitFunctionLiteralParamWithIt.class);