[FIR generator] Move each visitor printer into its own file

This commit is contained in:
Sergej Jaskiewicz
2023-12-05 14:42:14 +01:00
committed by Space Team
parent 0c0f7f9899
commit 8c75526130
4 changed files with 104 additions and 73 deletions
@@ -0,0 +1,51 @@
/*
* 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.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.firDefaultVisitorVoidType
import org.jetbrains.kotlin.fir.tree.generator.firVisitorVoidType
import org.jetbrains.kotlin.fir.tree.generator.model.Element
import org.jetbrains.kotlin.fir.tree.generator.model.Field
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
private class DefaultVisitorVoidPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
) : AbstractVisitorPrinter<Element, Field>(printer) {
override val visitorTypeParameters: List<TypeVariable>
get() = emptyList()
override val visitorDataType: TypeRef
get() = StandardTypes.nothing.copy(nullable = true)
override fun visitMethodReturnType(element: Element) = StandardTypes.unit
override val visitorSuperType: ClassRef<PositionTypeParameterRef>
get() = firVisitorVoidType
override val allowTypeParametersInVisitorMethods: Boolean
get() = true
context(ImportCollector)
override fun printMethodsForElement(element: Element) {
val parentInVisitor = element.parentInVisitor ?: return
printer.run {
printVisitMethodDeclaration(
element,
hasDataParameter = false,
override = true,
)
println(" = ", parentInVisitor.visitFunctionName, "(", element.visitorParameterName, ")")
println()
}
}
}
fun printDefaultVisitorVoid(elements: List<Element>, generationPath: File) =
printVisitorCommon(elements, generationPath, firDefaultVisitorVoidType, ::DefaultVisitorVoidPrinter)
@@ -7,14 +7,10 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.firDefaultVisitorType
import org.jetbrains.kotlin.fir.tree.generator.firDefaultVisitorVoidType
import org.jetbrains.kotlin.fir.tree.generator.firVisitorType
import org.jetbrains.kotlin.fir.tree.generator.firVisitorVoidType
import org.jetbrains.kotlin.fir.tree.generator.model.Element
import org.jetbrains.kotlin.fir.tree.generator.model.Field
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
@@ -56,72 +52,3 @@ fun printVisitor(elements: List<Element>, generationPath: File, visitSuperTypeBy
VisitorPrinter(printer, visitorType, visitSuperTypeByDefault)
}
private class VisitorVoidPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
) : AbstractVisitorVoidPrinter<Element, Field>(printer) {
override val visitorSuperClass: ClassRef<PositionTypeParameterRef>
get() = firVisitorType
override val allowTypeParametersInVisitorMethods: Boolean
get() = true
override val useAbstractMethodForRootElement: Boolean
get() = true
override val overriddenVisitMethodsAreFinal: Boolean
get() = true
override fun parentInVisitor(element: Element): Element = AbstractFirTreeBuilder.baseFirElement
}
fun printVisitorVoid(elements: List<Element>, generationPath: File) =
printVisitorCommon(elements, generationPath, firVisitorVoidType, ::VisitorVoidPrinter)
private class DefaultVisitorVoidPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
) : AbstractVisitorPrinter<Element, Field>(printer) {
override val visitorTypeParameters: List<TypeVariable>
get() = emptyList()
override val visitorDataType: TypeRef
get() = StandardTypes.nothing.copy(nullable = true)
override fun visitMethodReturnType(element: Element) = StandardTypes.unit
override val visitorSuperType: ClassRef<PositionTypeParameterRef>
get() = firVisitorVoidType
override val allowTypeParametersInVisitorMethods: Boolean
get() = true
context(ImportCollector)
override fun printMethodsForElement(element: Element) {
val parentInVisitor = element.parentInVisitor ?: return
printer.run {
printVisitMethodDeclaration(
element,
hasDataParameter = false,
override = true,
)
println(" = ", parentInVisitor.visitFunctionName, "(", element.visitorParameterName, ")")
println()
}
}
}
fun printDefaultVisitorVoid(elements: List<Element>, generationPath: File) =
printVisitorCommon(elements, generationPath, firDefaultVisitorVoidType, ::DefaultVisitorVoidPrinter)
private fun printVisitorCommon(
elements: List<Element>,
generationPath: File,
visitorType: ClassRef<*>,
makePrinter: (SmartPrinter, ClassRef<*>) -> AbstractVisitorPrinter<Element, Field>,
): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, visitorType.packageName, visitorType.simpleName) {
makePrinter(this, visitorType).printVisitor(elements)
}
@@ -0,0 +1,40 @@
/*
* 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.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.firVisitorType
import org.jetbrains.kotlin.fir.tree.generator.firVisitorVoidType
import org.jetbrains.kotlin.fir.tree.generator.model.Element
import org.jetbrains.kotlin.fir.tree.generator.model.Field
import org.jetbrains.kotlin.generators.tree.AbstractVisitorVoidPrinter
import org.jetbrains.kotlin.generators.tree.ClassRef
import org.jetbrains.kotlin.generators.tree.PositionTypeParameterRef
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
private class VisitorVoidPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
) : AbstractVisitorVoidPrinter<Element, Field>(printer) {
override val visitorSuperClass: ClassRef<PositionTypeParameterRef>
get() = firVisitorType
override val allowTypeParametersInVisitorMethods: Boolean
get() = true
override val useAbstractMethodForRootElement: Boolean
get() = true
override val overriddenVisitMethodsAreFinal: Boolean
get() = true
override fun parentInVisitor(element: Element): Element = AbstractFirTreeBuilder.baseFirElement
}
fun printVisitorVoid(elements: List<Element>, generationPath: File) =
printVisitorCommon(elements, generationPath, firVisitorVoidType, ::VisitorVoidPrinter)
@@ -10,8 +10,11 @@ import org.jetbrains.kotlin.fir.tree.generator.firTransformerType
import org.jetbrains.kotlin.fir.tree.generator.model.*
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.FunctionParameter
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.printFunctionDeclaration
import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
context(ImportCollector)
fun SmartPrinter.transformFunctionDeclaration(
@@ -89,3 +92,13 @@ fun Field.getMutableType(forBuilder: Boolean = false): TypeRefWithNullability =
}
val Element.safeDecapitalizedName: String get() = if (name == "Class") "klass" else name.replaceFirstChar(Char::lowercaseChar)
internal fun printVisitorCommon(
elements: List<Element>,
generationPath: File,
visitorType: ClassRef<*>,
makePrinter: (SmartPrinter, ClassRef<*>) -> AbstractVisitorPrinter<Element, Field>,
): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, visitorType.packageName, visitorType.simpleName) {
makePrinter(this, visitorType).printVisitor(elements)
}