Introduce Lambda Parameter: Support extraction of string template fragments

This commit is contained in:
Alexey Sedunov
2015-11-20 14:23:41 +03:00
parent c82d431cff
commit 736813c76a
34 changed files with 277 additions and 1 deletions
@@ -474,7 +474,7 @@ public open class KotlinIntroduceLambdaParameterHandler(
is KtClass -> targetParent.getBody()
else -> null
} ?: throw AssertionError("Body element is not found: ${targetParent.getElementTextWithContext()}")
val extractionData = ExtractionData(expression.getContainingKtFile(),
val extractionData = ExtractionData(targetParent.getContainingKtFile(),
expression.toRange(),
targetParent,
duplicateContainer,
@@ -0,0 +1,3 @@
fun foo(param: Int): String {
return "<selection>abc${pa</selection>ram}def"
}
@@ -0,0 +1 @@
Cannot perform refactoring without an expression
@@ -0,0 +1,3 @@
fun foo(param: Int): String {
return "<selection>abc$pa</selection>ram"
}
@@ -0,0 +1 @@
Cannot perform refactoring without an expression
@@ -0,0 +1,3 @@
fun foo(a: Int): String {
return "<selection>abc$a\</selection>ndef"
}
@@ -0,0 +1 @@
Cannot perform refactoring without an expression
@@ -0,0 +1,6 @@
fun foo(param: Int): String {
val x = "xyfalsez"
val y = "xyFalsez"
val z = false
return "ab<selection>false</selection>def"
}
@@ -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"
}
@@ -0,0 +1,7 @@
fun foo(param: Int): String {
val x = "a1234_"
val y = "-4123a"
val z = "+1243a"
val u = 123
return "ab<selection>123</selection>def"
}
@@ -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"
}
@@ -0,0 +1,6 @@
fun foo(param: Int): String {
val x = "atrue123"
val x = "aTRUE123"
val z = true
return "ab<selection>true</selection>def"
}
@@ -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"
}
@@ -0,0 +1,6 @@
fun foo(a: Int): String {
val x = "abc$a"
val y = "abc${a}"
val z = "abc{$a}def"
return "<selection>abc$a</selection>" + "def"
}
@@ -0,0 +1,6 @@
fun foo(a: Int, s: (Int) -> String = { a -> "abc$a" }): String {
val x = s(a)
val y = s(a)
val z = "abc{$a}def"
return s(a) + "def"
}
@@ -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<selection>${a + 1}</selection>def"
}
@@ -0,0 +1,6 @@
fun foo(a: Int, i: (Int) -> Int = { a -> a + 1 }): String {
val x = "-${i(a)}"
val y = "x${i(a)}y"
val z = "x${a - 1}y"
return "abc${i(a)}def"
}
@@ -0,0 +1,6 @@
fun foo(a: Int): String {
val x = "-$a"
val y = "x${a}y"
val z = "x$ay"
return "abc<selection>${a}</selection>def"
}
@@ -0,0 +1,6 @@
fun foo(a: Int, i: (Int) -> Int = { a -> a }): String {
val x = "-${i(a)}"
val y = "x${i(a)}y"
val z = "x$ay"
return "abc${i(a)}def"
}
@@ -0,0 +1,5 @@
fun foo(a: Int): String {
val x = "+cd$a:${a + 1}efg"
val y = "+cd$a${a + 1}efg"
return "ab<selection>cd$a:${a + 1}ef</selection>"
}
@@ -0,0 +1,5 @@
fun foo(a: Int, s: (Int) -> String = { a -> "cd$a:${a + 1}ef" }): String {
val x = "+${s(a)}g"
val y = "+cd$a${a + 1}efg"
return "ab${s(a)}"
}
@@ -0,0 +1,5 @@
fun foo(a: Int): String {
val x = "_c$a:${a + 1}d_"
val y = "_$a:${a + 1}d_"
return "ab<selection>c$a:${a + 1}d</selection>ef"
}
@@ -0,0 +1,5 @@
fun foo(a: Int, s: (Int) -> String = { a -> "c$a:${a + 1}d" }): String {
val x = "_${s(a)}_"
val y = "_$a:${a + 1}d_"
return "ab${s(a)}ef"
}
@@ -0,0 +1,5 @@
fun foo(a: Int): String {
val x = "_ab$a:${a + 1}cd__"
val y = "_a$a:${a + 1}cd__"
return "<selection>ab$a:${a + 1}cd</selection>ef"
}
@@ -0,0 +1,5 @@
fun foo(a: Int, s: (Int) -> String = { a -> "ab$a:${a + 1}cd" }): String {
val x = "_${s(a)}__"
val y = "_a$a:${a + 1}cd__"
return "${s(a)}ef"
}
@@ -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 """ab<selection>c$a
:${a + 1}d</selection>ef"""
}
@@ -0,0 +1,10 @@
fun foo(a: Int, s: (Int) -> String = { a ->
"""c$a
:${a + 1}d"""
}): String {
val x = """_${s(a)}_"""
val y = "_$a:${a + 1}d_"
val z = """_c$a:${a + 1}d_"""
val u = "_c$a\n:${a + 1}d_"
return """ab${s(a)}ef"""
}
@@ -0,0 +1,6 @@
fun foo(a: Int): String {
val x = "xabc$a"
val y = "${a}abcx"
val z = "xacb$a"
return "<selection>abc</selection>def"
}
@@ -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"
}
@@ -0,0 +1,6 @@
fun foo(a: Int): String {
val x = "xcd$a"
val y = "${a}cdx"
val z = "xcf$a"
return "ab<selection>cd</selection>ef"
}
@@ -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"
}
@@ -0,0 +1,6 @@
fun foo(a: Int): String {
val x = "xdef$a"
val y = "${a}defx"
val z = "xddf$a"
return "abc<selection>def</selection>"
}
@@ -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()}"
}
@@ -3462,6 +3462,111 @@ public class ExtractionTestGenerated extends AbstractExtractionTest {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/lambdaParamWithDefaultValue.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("idea/testData/refactoring/introduceLambdaParameter/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/introduceLambdaParameter/stringTemplates"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("brokenEntryWithBlockExpr.kt")
public void testBrokenEntryWithBlockExpr() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/brokenEntryWithBlockExpr.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("brokenEntryWithExpr.kt")
public void testBrokenEntryWithExpr() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/brokenEntryWithExpr.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("brokenEscapeEntry.kt")
public void testBrokenEscapeEntry() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/brokenEscapeEntry.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("extractFalse.kt")
public void testExtractFalse() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/extractFalse.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("extractIntegerLiteral.kt")
public void testExtractIntegerLiteral() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/extractIntegerLiteral.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("extractTrue.kt")
public void testExtractTrue() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/extractTrue.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("fullContent.kt")
public void testFullContent() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/fullContent.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("fullEntryWithBlockExpr.kt")
public void testFullEntryWithBlockExpr() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/fullEntryWithBlockExpr.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("fullEntryWithSimpleName.kt")
public void testFullEntryWithSimpleName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/fullEntryWithSimpleName.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("multipleEntriesWithPrefix.kt")
public void testMultipleEntriesWithPrefix() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/multipleEntriesWithPrefix.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("multipleEntriesWithSubstring.kt")
public void testMultipleEntriesWithSubstring() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/multipleEntriesWithSubstring.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("multipleEntriesWithSuffix.kt")
public void testMultipleEntriesWithSuffix() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/multipleEntriesWithSuffix.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("rawTemplateWithSubstring.kt")
public void testRawTemplateWithSubstring() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/rawTemplateWithSubstring.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("singleEntryPrefix.kt")
public void testSingleEntryPrefix() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/singleEntryPrefix.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("singleEntrySubstring.kt")
public void testSingleEntrySubstring() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/singleEntrySubstring.kt");
doIntroduceLambdaParameterTest(fileName);
}
@TestMetadata("singleEntrySuffix.kt")
public void testSingleEntrySuffix() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceLambdaParameter/stringTemplates/singleEntrySuffix.kt");
doIntroduceLambdaParameterTest(fileName);
}
}
}
@TestMetadata("idea/testData/refactoring/introduceJavaParameter")