Skip to content

Commit 7707c82

Browse files
committed
tuple drop
1 parent d3f4ece commit 7707c82

File tree

10 files changed

+678
-8
lines changed

10 files changed

+678
-8
lines changed

gradle/code-generation/src/main/kotlin/code-generation.generate.gradle.kts

Lines changed: 84 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ val generate: TaskProvider<Task> = tasks.register("generate") {
6767

6868
val tupleMap = createStringBuilder(packageName)
6969

70+
val tupleDrop = createStringBuilder(packageName)
71+
7072
val tupleFactory = StringBuilder(dontModifyNotice)
7173
.append("@file:Suppress(\"MethodOverloading\", \"FunctionName\")\n")
7274
.append("package ").append(packageName).append("\n\n")
@@ -342,13 +344,47 @@ val generate: TaskProvider<Task> = tasks.register("generate") {
342344
).appendLine()
343345

344346
appendMap("a$argNum", "A$argNum")
345-
346347
if (upperNumber <= 3) {
347-
val argNameToMap = getArgName(argNum)
348-
val argNameCapitalized = argNameToMap.replaceFirstChar {
348+
val argName = getArgName(argNum)
349+
val argNameCapitalized = argName.replaceFirstChar {
349350
if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
350351
}
351-
appendMap(argNameToMap, argNameCapitalized)
352+
appendMap(argName, argNameCapitalized)
353+
}
354+
355+
if (upperNumber >= 3) {
356+
val numberWithoutDrop = numbers.toMutableList()
357+
numberWithoutDrop.remove(argNum)
358+
val typeArgsWithoutDrop = numberWithoutDrop.joinToString(", ") { "A${it}" }
359+
val upperNumberOneLower = upperNumber - 1
360+
val tupleNameOneLower = getTupleName(upperNumberOneLower)
361+
362+
fun appendDrop(argNameToDrop: String, argNameCapitalized: String) =
363+
tupleDrop.append(
364+
"""
365+
|/**
366+
| * Creates a new [$tupleNameOneLower] by copying `this` [$tupleName] but dropping its ${
367+
withOrdinalIndicator(argNum)
368+
} component ([$tupleName.$argNameToDrop]).
369+
| *
370+
| * @return The newly created [$tupleNameOneLower].
371+
| *
372+
| * @since 3.2.0
373+
| */
374+
|fun <$typeArgs> $tupleName<$typeArgs>.drop$argNameCapitalized(): $tupleNameOneLower<$typeArgsWithoutDrop> =
375+
| Tuple(${numberWithoutDrop.joinToString(", ") { "a$it" }})
376+
|
377+
""".trimMargin()
378+
).appendLine()
379+
380+
appendDrop("a$argNum", "A$argNum")
381+
if (upperNumber <= 3) {
382+
val argName = getArgName(argNum)
383+
val argNameCapitalized = argName.replaceFirstChar {
384+
if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
385+
}
386+
appendDrop(argName, argNameCapitalized)
387+
}
352388
}
353389
}
354390
}
@@ -667,6 +703,9 @@ val generate: TaskProvider<Task> = tasks.register("generate") {
667703
val tupleMapFile = packageDir.resolve("tupleMap.kt")
668704
tupleMapFile.writeText(tupleMap.toString())
669705

706+
val tupleDropFile = packageDir.resolve("tupleDrop.kt")
707+
tupleDropFile.writeText(tupleDrop.toString())
708+
670709
val tupleFactoryFile = packageDir.resolve("tupleFactory.kt")
671710
tupleFactoryFile.writeText(tupleFactory.toString())
672711

@@ -831,7 +870,8 @@ val generateTest: TaskProvider<Task> = tasks.register("generateTest") {
831870
val (value1, rest) = toValues(type)
832871
val values = rest + arrayOf(value1)
833872
val valuesSize = values.size
834-
return arrayOfNulls<String>(size).mapIndexed { index, _ -> values[index % valuesSize] }.joinToString(", ")
873+
return arrayOfNulls<String>(size).mapIndexed { index, _ -> values[index % valuesSize] }
874+
.joinToString(", ")
835875
}
836876

837877
primitiveTypes.forEach { (type, arrayTypeUpper) ->
@@ -1066,6 +1106,9 @@ val generateTest: TaskProvider<Task> = tasks.register("generateTest") {
10661106
val tupleMapTest = createStringBuilder("$packageName.map")
10671107
.appendTest("${tupleName}MapTest")
10681108

1109+
val tupleDropTest = createStringBuilder("$packageName.drop")
1110+
.appendTest("${tupleName}DropTest")
1111+
10691112
val toTupleTest = createStringBuilder("$packageName.toTuple")
10701113
.appendTest("Tuple${upperNumber}LikeToTupleTest")
10711114

@@ -1141,18 +1184,45 @@ val generateTest: TaskProvider<Task> = tasks.register("generateTest") {
11411184

11421185
appendMapTest("A$argNum")
11431186

1144-
if(upperNumber <= 3){
1187+
if (upperNumber <= 3) {
11451188
val argNameToMap = getArgName(argNum)
11461189
val argNameCapitalized = argNameToMap.replaceFirstChar {
11471190
if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
11481191
}
11491192
appendMapTest(argNameCapitalized)
11501193
}
11511194

1195+
if (upperNumber >= 3) {
1196+
1197+
fun appendDropTest(argNameCapitalized: String) {
1198+
tupleDropTest.append(
1199+
"""
1200+
| @Test
1201+
| fun drop${argNameCapitalized}() {
1202+
| $vals
1203+
| val tuple = $tupleCreation
1204+
|
1205+
| expect(tuple.drop${argNameCapitalized}()) {
1206+
| ${
1207+
(1..upperNumber - 1).joinToString("\n ") {
1208+
"feature { f(it::a${it}) }.toBeTheInstance(a${if (it < argNum) it else it + 1})"
1209+
}
1210+
}
1211+
| }
1212+
| }
11521213
1214+
""".trimMargin()
1215+
).appendLine()
1216+
}
11531217

1154-
1155-
1218+
if (upperNumber <= 3) {
1219+
val argNameToDrop = getArgName(argNum)
1220+
val argNameCapitalized = argNameToDrop.replaceFirstChar {
1221+
if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
1222+
}
1223+
appendDropTest(argNameCapitalized)
1224+
}
1225+
}
11561226
}
11571227

11581228
toTupleTest.append(
@@ -1300,6 +1370,12 @@ val generateTest: TaskProvider<Task> = tasks.register("generateTest") {
13001370
val mapTestFile = packageDir.resolve("map/${tupleName}MapTest.kt")
13011371
mapTestFile.writeText(tupleMapTest.toString())
13021372

1373+
tupleDropTest.append("}")
1374+
if (upperNumber >= 3) {
1375+
val dropTestFile = packageDir.resolve("drop/${tupleName}DropTest.kt")
1376+
dropTestFile.writeText(tupleDropTest.toString())
1377+
}
1378+
13031379
toTupleTest
13041380
.append(
13051381
"""

0 commit comments

Comments
 (0)