[tree generators] Factor out common transformer printing logic

This commit is contained in:
Sergej Jaskiewicz
2023-12-11 18:04:03 +01:00
committed by Space Team
parent 9670de74f1
commit 80c9eae409
10 changed files with 89 additions and 132 deletions
@@ -0,0 +1,72 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.generators.tree
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.generators.tree.printer.FunctionParameter
import org.jetbrains.kotlin.generators.tree.printer.printBlock
import org.jetbrains.kotlin.generators.tree.printer.printFunctionDeclaration
import org.jetbrains.kotlin.generators.tree.printer.printFunctionWithBlockBody
import org.jetbrains.kotlin.utils.SmartPrinter
abstract class AbstractTransformerPrinter<Element : AbstractElement<Element, Field, *>, Field : AbstractField<Field>>(
printer: SmartPrinter,
) : AbstractVisitorPrinter<Element, Field>(printer) {
override fun visitMethodReturnType(element: Element) = element.transformerClass
context(ImportCollector)
override fun printMethodsForElement(element: Element) {
printer.run {
println()
val elementParameterName = element.safeDecapitalizedName
if (element.isRootElement) {
val elementTP = TypeVariable("E", listOf(element))
printFunctionDeclaration(
name = "transformElement",
parameters = listOf(
FunctionParameter(elementParameterName, elementTP),
FunctionParameter("data", dataTypeVariable)
),
returnType = elementTP,
typeParameters = listOf(elementTP),
modality = Modality.ABSTRACT,
)
println()
} else {
val parentInVisitor = parentInVisitor(element) ?: return
printFunctionWithBlockBody(
name = "transform" + element.name,
parameters = listOf(
FunctionParameter(elementParameterName, element),
FunctionParameter("data", dataTypeVariable)
),
returnType = visitMethodReturnType(element),
typeParameters = element.params,
modality = Modality.OPEN,
) {
println("return transform", parentInVisitor.name, "(", elementParameterName, ", data)")
}
}
println()
printVisitMethodDeclaration(
element = element,
modality = Modality.FINAL,
override = true,
)
printBlock {
println(
"return transform",
element.name,
"(",
element.visitorParameterName,
", ",
"data)"
)
}
}
}
}
@@ -79,3 +79,9 @@ internal fun <Field : AbstractField<*>> List<Field>.reorderFieldsIfNecessary(ord
val ImplementationKind.hasLeafBuilder: Boolean
get() = this == ImplementationKind.FinalClass || this == ImplementationKind.OpenClass
val AbstractElement<*, *, *>.safeDecapitalizedName: String
get() = when (name) {
"Class" -> "klass"
else -> name.replaceFirstChar(Char::lowercaseChar)
}