From 8c75526130ac76a84d66c19c494b0a1d7ca28f62 Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Tue, 5 Dec 2023 14:42:14 +0100 Subject: [PATCH] [FIR generator] Move each visitor printer into its own file --- .../printer/DefaultVisitorVoidPrinter.kt | 51 +++++++++++++ .../tree/generator/printer/VisitorPrinter.kt | 73 ------------------- .../generator/printer/VisitorVoidPrinter.kt | 40 ++++++++++ .../fir/tree/generator/printer/utils.kt | 13 ++++ 4 files changed, 104 insertions(+), 73 deletions(-) create mode 100644 compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/DefaultVisitorVoidPrinter.kt create mode 100644 compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorVoidPrinter.kt diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/DefaultVisitorVoidPrinter.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/DefaultVisitorVoidPrinter.kt new file mode 100644 index 00000000000..ace2cea8035 --- /dev/null +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/DefaultVisitorVoidPrinter.kt @@ -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(printer) { + + override val visitorTypeParameters: List + get() = emptyList() + + override val visitorDataType: TypeRef + get() = StandardTypes.nothing.copy(nullable = true) + + override fun visitMethodReturnType(element: Element) = StandardTypes.unit + + override val visitorSuperType: ClassRef + 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, generationPath: File) = + printVisitorCommon(elements, generationPath, firDefaultVisitorVoidType, ::DefaultVisitorVoidPrinter) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorPrinter.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorPrinter.kt index 30d3087ccbe..ffe7b9725e1 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorPrinter.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorPrinter.kt @@ -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, generationPath: File, visitSuperTypeBy VisitorPrinter(printer, visitorType, visitSuperTypeByDefault) } -private class VisitorVoidPrinter( - printer: SmartPrinter, - override val visitorType: ClassRef<*>, -) : AbstractVisitorVoidPrinter(printer) { - - override val visitorSuperClass: ClassRef - 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, generationPath: File) = - printVisitorCommon(elements, generationPath, firVisitorVoidType, ::VisitorVoidPrinter) - -private class DefaultVisitorVoidPrinter( - printer: SmartPrinter, - override val visitorType: ClassRef<*>, -) : AbstractVisitorPrinter(printer) { - - override val visitorTypeParameters: List - get() = emptyList() - - override val visitorDataType: TypeRef - get() = StandardTypes.nothing.copy(nullable = true) - - override fun visitMethodReturnType(element: Element) = StandardTypes.unit - - override val visitorSuperType: ClassRef - 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, generationPath: File) = - printVisitorCommon(elements, generationPath, firDefaultVisitorVoidType, ::DefaultVisitorVoidPrinter) - -private fun printVisitorCommon( - elements: List, - generationPath: File, - visitorType: ClassRef<*>, - makePrinter: (SmartPrinter, ClassRef<*>) -> AbstractVisitorPrinter, -): GeneratedFile = - printGeneratedType(generationPath, TREE_GENERATOR_README, visitorType.packageName, visitorType.simpleName) { - makePrinter(this, visitorType).printVisitor(elements) - } \ No newline at end of file diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorVoidPrinter.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorVoidPrinter.kt new file mode 100644 index 00000000000..2167ef624da --- /dev/null +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/VisitorVoidPrinter.kt @@ -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(printer) { + + override val visitorSuperClass: ClassRef + 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, generationPath: File) = + printVisitorCommon(elements, generationPath, firVisitorVoidType, ::VisitorVoidPrinter) diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt index 1abb2f1f19b..b2be225e743 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/utils.kt @@ -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, + generationPath: File, + visitorType: ClassRef<*>, + makePrinter: (SmartPrinter, ClassRef<*>) -> AbstractVisitorPrinter, +): GeneratedFile = + printGeneratedType(generationPath, TREE_GENERATOR_README, visitorType.packageName, visitorType.simpleName) { + makePrinter(this, visitorType).printVisitor(elements) + }