From 1b162e0294b52887b71da2560c119825faac629d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 18 Nov 2015 15:15:32 +0300 Subject: [PATCH] Introduce Parameter: Support extraction of string template fragments --- .../KotlinIntroduceParameterHandler.kt | 36 +++--- .../brokenEntryWithBlockExpr.kt | 3 + .../brokenEntryWithBlockExpr.kt.conflicts | 1 + .../stringTemplates/brokenEntryWithExpr.kt | 3 + .../brokenEntryWithExpr.kt.conflicts | 1 + .../stringTemplates/brokenEscapeEntry.kt | 3 + .../brokenEscapeEntry.kt.conflicts | 1 + .../stringTemplates/extractFalse.kt | 6 + .../stringTemplates/extractFalse.kt.after | 6 + .../stringTemplates/extractIntegerLiteral.kt | 7 ++ .../extractIntegerLiteral.kt.after | 7 ++ .../stringTemplates/extractTrue.kt | 6 + .../stringTemplates/extractTrue.kt.after | 6 + .../stringTemplates/fullContent.kt | 6 + .../stringTemplates/fullContent.kt.after | 6 + .../stringTemplates/fullEntryWithBlockExpr.kt | 6 + .../fullEntryWithBlockExpr.kt.after | 6 + .../fullEntryWithSimpleName.kt | 6 + .../fullEntryWithSimpleName.kt.after | 6 + .../multipleEntriesWithPrefix.kt | 5 + .../multipleEntriesWithPrefix.kt.after | 5 + .../multipleEntriesWithSubstring.kt | 5 + .../multipleEntriesWithSubstring.kt.after | 5 + .../multipleEntriesWithSuffix.kt | 5 + .../multipleEntriesWithSuffix.kt.after | 5 + .../rawTemplateWithSubstring.kt | 9 ++ .../rawTemplateWithSubstring.kt.after | 8 ++ .../stringTemplates/singleEntryPrefix.kt | 6 + .../singleEntryPrefix.kt.after | 6 + .../stringTemplates/singleEntrySubstring.kt | 6 + .../singleEntrySubstring.kt.after | 6 + .../stringTemplates/singleEntrySuffix.kt | 6 + .../singleEntrySuffix.kt.after | 6 + .../introduce/ExtractionTestGenerated.java | 105 ++++++++++++++++++ 34 files changed, 295 insertions(+), 15 deletions(-) create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt.conflicts create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt.conflicts create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt.conflicts create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt create mode 100644 idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt index 773f426d8b0..33f42371e46 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt @@ -38,14 +38,13 @@ import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.idea.core.moveInsideParenthesesAndReplaceWith +import org.jetbrains.kotlin.idea.core.refactoring.removeTemplateEntryBracesIfPossible import org.jetbrains.kotlin.idea.core.refactoring.runRefactoringWithPostprocessing +import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle import org.jetbrains.kotlin.idea.refactoring.changeSignature.* -import org.jetbrains.kotlin.idea.refactoring.introduce.KotlinIntroduceHandlerBase +import org.jetbrains.kotlin.idea.refactoring.introduce.* import org.jetbrains.kotlin.idea.refactoring.introduce.extractionEngine.* -import org.jetbrains.kotlin.idea.refactoring.introduce.selectElementsWithTargetParent -import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint -import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHintByKey import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.application.executeCommand @@ -205,9 +204,10 @@ public open class KotlinIntroduceParameterHandler( val helper: KotlinIntroduceParameterHelper = KotlinIntroduceParameterHelper.Default ): KotlinIntroduceHandlerBase() { open fun invoke(project: Project, editor: Editor, expression: KtExpression, targetParent: KtNamedDeclaration) { - val context = expression.analyze() + val physicalExpression = expression.substringContextOrThis + val context = physicalExpression.analyze() - val expressionType = context.getType(expression) + val expressionType = expression.extractableSubstringInfo?.type ?: context.getType(physicalExpression) if (expressionType == null) { showErrorHint(project, editor, "Expression has no type", INTRODUCE_PARAMETER) return @@ -246,7 +246,7 @@ public open class KotlinIntroduceParameterHandler( val occurrencesToReplace = expression.toRange() .match(body, KotlinPsiUnifier.DEFAULT) .filterNot { - val textRange = it.range.getTextRange() + val textRange = it.range.getPhysicalTextRange() forbiddenRanges.any { it.intersects(textRange) } } .mapNotNull { @@ -267,7 +267,10 @@ public open class KotlinIntroduceParameterHandler( val haveLambdaArgumentsToReplace = occurrencesToReplace.any { it.elements.any { it is KtFunctionLiteralExpression && it.parent is KtFunctionLiteralArgument } } - val inplaceIsAvailable = editor.settings.isVariableInplaceRenameEnabled && !isTestMode && !haveLambdaArgumentsToReplace + val inplaceIsAvailable = editor.settings.isVariableInplaceRenameEnabled + && !isTestMode + && !haveLambdaArgumentsToReplace + && expression.extractableSubstringInfo == null val originalExpression = KtPsiUtil.safeDeparenthesize(expression) val psiFactory = KtPsiFactory(project) @@ -286,14 +289,17 @@ public open class KotlinIntroduceParameterHandler( occurrenceReplacer = { val expressionToReplace = it.elements.single() as KtExpression val replacingExpression = psiFactory.createExpression(newParameterName) - if (expressionToReplace.isFunctionLiteralOutsideParentheses()) { - expressionToReplace - .getStrictParentOfType()!! - .moveInsideParenthesesAndReplaceWith(replacingExpression, context) - } - else { - expressionToReplace.replace(replacingExpression) + val substringInfo = expressionToReplace.extractableSubstringInfo + val result = when { + expressionToReplace.isFunctionLiteralOutsideParentheses() -> { + expressionToReplace + .getStrictParentOfType()!! + .moveInsideParenthesesAndReplaceWith(replacingExpression, context) + } + substringInfo != null -> substringInfo.replaceWith(replacingExpression) + else -> expressionToReplace.replaced(replacingExpression) } + result.removeTemplateEntryBracesIfPossible() } ) ) diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt new file mode 100644 index 00000000000..8d3f78f7b2c --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt @@ -0,0 +1,3 @@ +fun foo(param: Int): String { + return "abc${param}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt.conflicts b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt.conflicts new file mode 100644 index 00000000000..21617cc617d --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt.conflicts @@ -0,0 +1 @@ +Cannot perform refactoring without an expression \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt new file mode 100644 index 00000000000..a7ef59f2d42 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt @@ -0,0 +1,3 @@ +fun foo(param: Int): String { + return "abc$param" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt.conflicts b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt.conflicts new file mode 100644 index 00000000000..21617cc617d --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt.conflicts @@ -0,0 +1 @@ +Cannot perform refactoring without an expression \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt new file mode 100644 index 00000000000..3cc3e6f3471 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt @@ -0,0 +1,3 @@ +fun foo(a: Int): String { + return "abc$a\ndef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt.conflicts b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt.conflicts new file mode 100644 index 00000000000..21617cc617d --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt.conflicts @@ -0,0 +1 @@ +Cannot perform refactoring without an expression \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt new file mode 100644 index 00000000000..1ec4ee42caf --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt @@ -0,0 +1,6 @@ +fun foo(param: Int): String { + val x = "xyfalsez" + val y = "xyFalsez" + val z = false + return "abfalsedef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt.after new file mode 100644 index 00000000000..4c0ea7e0582 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt.after @@ -0,0 +1,6 @@ +fun foo(param: Int, b: Boolean = false): String { + val x = "xy${b}z" + val y = "xyFalsez" + val z = false + return "ab${b}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt new file mode 100644 index 00000000000..826c73d618f --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt @@ -0,0 +1,7 @@ +fun foo(param: Int): String { + val x = "a1234_" + val y = "-4123a" + val z = "+1243a" + val u = 123 + return "ab123def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt.after new file mode 100644 index 00000000000..f0fc7b2368b --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt.after @@ -0,0 +1,7 @@ +fun foo(param: Int, i: Int = 123): String { + val x = "a${i}4_" + val y = "-4${i}a" + val z = "+1243a" + val u = 123 + return "ab${i}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt new file mode 100644 index 00000000000..7d6dde97219 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt @@ -0,0 +1,6 @@ +fun foo(param: Int): String { + val x = "atrue123" + val x = "aTRUE123" + val z = true + return "abtruedef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt.after new file mode 100644 index 00000000000..20fa96f7223 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt.after @@ -0,0 +1,6 @@ +fun foo(param: Int, b: Boolean = true): String { + val x = "a${b}123" + val x = "aTRUE123" + val z = true + return "ab${b}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt new file mode 100644 index 00000000000..8b10cb97d4c --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): String { + val x = "abc$a" + val y = "abc${a}" + val z = "abc{$a}def" + return "abc$a" + "def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt.after new file mode 100644 index 00000000000..21c7fde46d2 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt.after @@ -0,0 +1,6 @@ +fun foo(a: Int, s: String = "abc$a"): String { + val x = s + val y = s + val z = "abc{$a}def" + return s + "def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt new file mode 100644 index 00000000000..2a19834a5bc --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): String { + val x = "-${a + 1}" + val y = "x${a + 1}y" + val z = "x${a - 1}y" + return "abc${a + 1}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt.after new file mode 100644 index 00000000000..d9740ed9a3f --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt.after @@ -0,0 +1,6 @@ +fun foo(a: Int, i: Int = a + 1): String { + val x = "-$i" + val y = "x${i}y" + val z = "x${a - 1}y" + return "abc${i}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt new file mode 100644 index 00000000000..b3e5ea58080 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): String { + val x = "-$a" + val y = "x${a}y" + val z = "x$ay" + return "abc${a}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt.after new file mode 100644 index 00000000000..f576cc737b6 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt.after @@ -0,0 +1,6 @@ +fun foo(a: Int, i: Int = a): String { + val x = "-$i" + val y = "x${i}y" + val z = "x$ay" + return "abc${i}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt new file mode 100644 index 00000000000..e059fcf9732 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt @@ -0,0 +1,5 @@ +fun foo(a: Int): String { + val x = "+cd$a:${a + 1}efg" + val y = "+cd$a${a + 1}efg" + return "abcd$a:${a + 1}ef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt.after new file mode 100644 index 00000000000..cce02a16c09 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt.after @@ -0,0 +1,5 @@ +fun foo(a: Int, s: String = "cd$a:${a + 1}ef"): String { + val x = "+${s}g" + val y = "+cd$a${a + 1}efg" + return "ab$s" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt new file mode 100644 index 00000000000..e81ce108d0d --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt @@ -0,0 +1,5 @@ +fun foo(a: Int): String { + val x = "_c$a:${a + 1}d_" + val y = "_$a:${a + 1}d_" + return "abc$a:${a + 1}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt.after new file mode 100644 index 00000000000..cf060c54c32 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt.after @@ -0,0 +1,5 @@ +fun foo(a: Int, s: String = "c$a:${a + 1}d"): String { + val x = "_${s}_" + val y = "_$a:${a + 1}d_" + return "ab${s}ef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt new file mode 100644 index 00000000000..f77d65ff3a2 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt @@ -0,0 +1,5 @@ +fun foo(a: Int): String { + val x = "_ab$a:${a + 1}cd__" + val y = "_a$a:${a + 1}cd__" + return "ab$a:${a + 1}cdef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt.after new file mode 100644 index 00000000000..66ce4a9f0c3 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt.after @@ -0,0 +1,5 @@ +fun foo(a: Int, s: String = "ab$a:${a + 1}cd"): String { + val x = "_${s}__" + val y = "_a$a:${a + 1}cd__" + return "${s}ef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt new file mode 100644 index 00000000000..d4f1d34ed57 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt @@ -0,0 +1,9 @@ +fun foo(a: Int): String { + val x = """_c$a + :${a + 1}d_""" + val y = "_$a:${a + 1}d_" + val z = """_c$a:${a + 1}d_""" + val u = "_c$a\n:${a + 1}d_" + return """abc$a + :${a + 1}def""" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt.after new file mode 100644 index 00000000000..f6fa52c447a --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt.after @@ -0,0 +1,8 @@ +fun foo(a: Int, s: String = """c$a + :${a + 1}d"""): String { + val x = """_${s}_""" + val y = "_$a:${a + 1}d_" + val z = """_c$a:${a + 1}d_""" + val u = "_c$a\n:${a + 1}d_" + return """ab${s}ef""" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt new file mode 100644 index 00000000000..9dc8211a168 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): String { + val x = "xabc$a" + val y = "${a}abcx" + val z = "xacb$a" + return "abcdef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt.after new file mode 100644 index 00000000000..c5b8ef234ec --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt.after @@ -0,0 +1,6 @@ +fun foo(a: Int, s: String = "abc"): String { + val x = "x$s$a" + val y = "${a}${s}x" + val z = "xacb$a" + return "${s}def" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt new file mode 100644 index 00000000000..091f98c39f1 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): String { + val x = "xcd$a" + val y = "${a}cdx" + val z = "xcf$a" + return "abcdef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt.after new file mode 100644 index 00000000000..a9c709eb53d --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt.after @@ -0,0 +1,6 @@ +fun foo(a: Int, s: String = "cd"): String { + val x = "x$s$a" + val y = "${a}${s}x" + val z = "xcf$a" + return "ab${s}ef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt new file mode 100644 index 00000000000..53d3c4eff51 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt @@ -0,0 +1,6 @@ +fun foo(a: Int): String { + val x = "xdef$a" + val y = "${a}defx" + val z = "xddf$a" + return "abcdef" +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt.after b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt.after new file mode 100644 index 00000000000..63fb7ec376b --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt.after @@ -0,0 +1,6 @@ +fun foo(a: Int, s: String = "def"): String { + val x = "x$s$a" + val y = "${a}${s}x" + val z = "xddf$a" + return "abc$s" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index 5a0da257ea1..9da7cb86b74 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -3294,6 +3294,111 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/while.kt"); doIntroduceSimpleParameterTest(fileName); } + + @TestMetadata("idea/testData/refactoring/introduceParameter/stringTemplates") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class StringTemplates extends AbstractExtractionTest { + public void testAllFilesPresentInStringTemplates() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/refactoring/introduceParameter/stringTemplates"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("brokenEntryWithBlockExpr.kt") + public void testBrokenEntryWithBlockExpr() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithBlockExpr.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("brokenEntryWithExpr.kt") + public void testBrokenEntryWithExpr() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/brokenEntryWithExpr.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("brokenEscapeEntry.kt") + public void testBrokenEscapeEntry() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/brokenEscapeEntry.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("extractFalse.kt") + public void testExtractFalse() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/extractFalse.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("extractIntegerLiteral.kt") + public void testExtractIntegerLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/extractIntegerLiteral.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("extractTrue.kt") + public void testExtractTrue() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/extractTrue.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("fullContent.kt") + public void testFullContent() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/fullContent.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("fullEntryWithBlockExpr.kt") + public void testFullEntryWithBlockExpr() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithBlockExpr.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("fullEntryWithSimpleName.kt") + public void testFullEntryWithSimpleName() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/fullEntryWithSimpleName.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("multipleEntriesWithPrefix.kt") + public void testMultipleEntriesWithPrefix() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithPrefix.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("multipleEntriesWithSubstring.kt") + public void testMultipleEntriesWithSubstring() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSubstring.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("multipleEntriesWithSuffix.kt") + public void testMultipleEntriesWithSuffix() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/multipleEntriesWithSuffix.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("rawTemplateWithSubstring.kt") + public void testRawTemplateWithSubstring() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/rawTemplateWithSubstring.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("singleEntryPrefix.kt") + public void testSingleEntryPrefix() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/singleEntryPrefix.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("singleEntrySubstring.kt") + public void testSingleEntrySubstring() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySubstring.kt"); + doIntroduceSimpleParameterTest(fileName); + } + + @TestMetadata("singleEntrySuffix.kt") + public void testSingleEntrySuffix() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/stringTemplates/singleEntrySuffix.kt"); + doIntroduceSimpleParameterTest(fileName); + } + } } @TestMetadata("idea/testData/refactoring/introduceLambdaParameter")