All Downloads are FREE. Search and download functionalities are using the official Maven repository.

meta.rendering.CollectionPropertyRendererBase.kt Maven / Gradle / Ivy

package de.peekandpoke.ultra.mutator.meta.rendering

import com.squareup.kotlinpoet.TypeName
import de.peekandpoke.ultra.meta.KotlinPrinter
import de.peekandpoke.ultra.meta.ProcessorUtils

abstract class CollectionPropertyRendererBase(
    override val ctx: ProcessorUtils.Context,
    protected val root: PropertyRenderers
) : PropertyRenderer {

    protected fun KotlinPrinter.internalRenderProperty(name: String, typeParam: TypeName) {

        line("val $name by lazy {").indent {
            line("getResult().$name.mutator(").indent {
                line("{ modify(getResult()::$name, getResult().$name, it) },")

                append("{ ${1.asParam} -> ")
                root.run { renderBackwardMapper(typeParam, 1) }
                line(" },")

                line("{ ${1.asParam}, ${1.asOnModify} -> ").indent {
                    root.run { renderForwardMapper(typeParam, 1) }
                    newline()
                }
                line("}")
            }
            line(")")
        }
        line("}")
    }

    fun KotlinPrinter.internalRenderForwardMapper(type: TypeName, depth: Int) {

        val plus1 = depth + 1

        append("${depth.asParam}.mutator(${depth.asOnModify}, { ${plus1.asParam} -> ")
        root.run { renderBackwardMapper(type, plus1) }
        line(" }) { ${plus1.asParam}, ${plus1.asOnModify} -> ").indent {
            root.run { renderForwardMapper(type, plus1) }
            newline()
        }
        append("}")
    }

    fun KotlinPrinter.internalRenderBackwardMapper(depth: Int) {
        append("${depth.asParam}.getResult()")
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy