[FIR] Add fir copy function generation
This commit is contained in:
+4
@@ -152,6 +152,10 @@ abstract class AbstractBuilderConfigurator<T : AbstractFirTreeBuilder>(val firTr
|
|||||||
fun openBuilder() {
|
fun openBuilder() {
|
||||||
builder.isOpen = true
|
builder.isOpen = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun withCopy() {
|
||||||
|
builder.wantsCopy = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun builder(name: String? = null, block: IntermediateBuilderConfigurationContext.() -> Unit): IntermediateBuilderDelegateProvider {
|
fun builder(name: String? = null, block: IntermediateBuilderConfigurationContext.() -> Unit): IntermediateBuilderDelegateProvider {
|
||||||
|
|||||||
+1
@@ -49,6 +49,7 @@ class LeafBuilder(val implementation: Implementation) : Builder() {
|
|||||||
|
|
||||||
override val packageName: String = implementation.packageName.replace(".impl", ".builder")
|
override val packageName: String = implementation.packageName.replace(".impl", ".builder")
|
||||||
var isOpen: Boolean = false
|
var isOpen: Boolean = false
|
||||||
|
var wantsCopy: Boolean = false
|
||||||
}
|
}
|
||||||
|
|
||||||
class IntermediateBuilder(override val type: String) : Builder() {
|
class IntermediateBuilder(override val type: String) : Builder() {
|
||||||
|
|||||||
+41
@@ -111,6 +111,11 @@ private fun SmartPrinter.printBuilder(builder: Builder) {
|
|||||||
if (builder is LeafBuilder) {
|
if (builder is LeafBuilder) {
|
||||||
println()
|
println()
|
||||||
printDslBuildFunction(builder, hasRequiredFields)
|
printDslBuildFunction(builder, hasRequiredFields)
|
||||||
|
|
||||||
|
if (builder.wantsCopy) {
|
||||||
|
println()
|
||||||
|
printDslBuildCopyFunction(builder, hasRequiredFields)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,4 +266,40 @@ private fun SmartPrinter.printDslBuildFunction(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
println("}")
|
println("}")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun SmartPrinter.printDslBuildCopyFunction(
|
||||||
|
builder: LeafBuilder,
|
||||||
|
hasRequiredFields: Boolean
|
||||||
|
) {
|
||||||
|
println("@OptIn(ExperimentalContracts::class)")
|
||||||
|
print("inline ")
|
||||||
|
print("fun ")
|
||||||
|
builder.implementation.element.typeArguments.takeIf { it.isNotEmpty() }?.let {
|
||||||
|
print(it.joinToString(separator = ", ", prefix = "<", postfix = "> ") { it.name })
|
||||||
|
}
|
||||||
|
val builderType = builder.typeWithArguments
|
||||||
|
val name = builder.implementation.name?.replaceFirst("Fir", "") ?: builder.implementation.element.name
|
||||||
|
print("build${name}Copy(")
|
||||||
|
print("original: ${builder.implementation.element.typeWithArguments}, init: $builderType.() -> Unit")
|
||||||
|
if (!hasRequiredFields) {
|
||||||
|
print(" = {}")
|
||||||
|
}
|
||||||
|
println("): ${builder.implementation.element.typeWithArguments} {")
|
||||||
|
withIndent {
|
||||||
|
println("contract {")
|
||||||
|
withIndent {
|
||||||
|
println("callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)")
|
||||||
|
}
|
||||||
|
println("}")
|
||||||
|
println("val copyBuilder = $builderType()")
|
||||||
|
for (field in builder.allFields) {
|
||||||
|
when (field.origin) {
|
||||||
|
is FieldList -> println("copyBuilder.${field.name}.addAll(original.${field.name})")
|
||||||
|
else -> println("copyBuilder.${field.name} = original.${field.name}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println("return copyBuilder.apply(init).build()")
|
||||||
|
}
|
||||||
|
println("}")
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user