diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/ElementPrinter.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/ElementPrinter.kt index 35e8c50776f..1686e500899 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/ElementPrinter.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/printer/ElementPrinter.kt @@ -10,10 +10,7 @@ import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder 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.printAcceptChildrenMethod -import org.jetbrains.kotlin.generators.tree.printer.printAcceptMethod -import org.jetbrains.kotlin.generators.tree.printer.printTransformChildrenMethod -import org.jetbrains.kotlin.generators.tree.printer.printTransformMethod +import org.jetbrains.kotlin.generators.tree.printer.* import org.jetbrains.kotlin.utils.SmartPrinter internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter(printer) { @@ -69,8 +66,7 @@ internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter( element, hasDataParameter = false, modality = when { - element.isRootElement && visitorType.kind == TypeKind.Class -> Modality.ABSTRACT - !element.isRootElement && visitorType.kind == TypeKind.Class -> Modality.OPEN + isAbstractVisitRootElementMethod && visitorType.kind == TypeKind.Class -> Modality.ABSTRACT + !isAbstractVisitRootElementMethod && visitorType.kind == TypeKind.Class -> Modality.OPEN else -> null } ) diff --git a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt index 641bf0de2a2..376bdd9b087 100644 --- a/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt +++ b/generators/tree-generator-common/src/org/jetbrains/kotlin/generators/tree/printer/printUtils.kt @@ -348,4 +348,18 @@ fun SmartPrinter.printTransformChildrenMethod( ) } +context(ImportCollector) +fun SmartPrinter.printAcceptVoidMethod(visitorType: ClassRef<*>) { + val visitorParameter = FunctionParameter("visitor", visitorType) + printFunctionDeclaration("accept", listOf(visitorParameter), StandardTypes.unit) + println(" = accept(", visitorParameter.name, ", null)") +} + +context(ImportCollector) +fun SmartPrinter.printAcceptChildrenVoidMethod(visitorType: ClassRef<*>) { + val visitorParameter = FunctionParameter("visitor", visitorType) + printFunctionDeclaration("acceptChildren", listOf(visitorParameter), StandardTypes.unit) + println(" = acceptChildren(", visitorParameter.name, ", null)") +} + fun AbstractField<*>.call(): String = if (nullable) "?." else "." diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirElement.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirElement.kt index 0031c89f1d5..31b0fbd60c6 100644 --- a/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirElement.kt +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/SirElement.kt @@ -10,6 +10,7 @@ package org.jetbrains.kotlin.sir import org.jetbrains.kotlin.sir.visitors.SirTransformer import org.jetbrains.kotlin.sir.visitors.SirVisitor +import org.jetbrains.kotlin.sir.visitors.SirVisitorVoid /** * The root interface of the Swift IR tree. @@ -37,6 +38,8 @@ sealed interface SirElement { fun transform(transformer: SirTransformer, data: D): E = transformer.transformElement(this, data) as E + fun accept(visitor: SirVisitorVoid) = accept(visitor, null) + /** * Runs the provided [visitor] on subtrees with roots in this node's children. * @@ -49,6 +52,8 @@ sealed interface SirElement { */ fun acceptChildren(visitor: SirVisitor, data: D) + fun acceptChildren(visitor: SirVisitorVoid) = acceptChildren(visitor, null) + /** * Recursively transforms this node's children *in place* using [transformer]. * diff --git a/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirVisitorVoid.kt b/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirVisitorVoid.kt new file mode 100644 index 00000000000..7abbabd9603 --- /dev/null +++ b/native/swift/sir/gen/org/jetbrains/kotlin/sir/visitors/SirVisitorVoid.kt @@ -0,0 +1,104 @@ +/* + * 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. + */ + +// This file was generated automatically. See native/swift/sir/tree-generator/Readme.md. +// DO NOT MODIFY IT MANUALLY. + +package org.jetbrains.kotlin.sir.visitors + +import org.jetbrains.kotlin.sir.* + +/** + * Auto-generated by [org.jetbrains.kotlin.sir.tree.generator.printer.VisitorVoidPrinter] + */ +abstract class SirVisitorVoid : SirVisitor() { + + final override fun visitElement(element: SirElement, data: Nothing?) { + visitElement(element) + } + + open fun visitElement(element: SirElement) { + } + + final override fun visitModule(module: SirModule, data: Nothing?) { + visitModule(module) + } + + open fun visitModule(module: SirModule) { + visitElement(module) + } + + final override fun visitDeclarationContainer(declarationContainer: SirDeclarationContainer, data: Nothing?) { + visitDeclarationContainer(declarationContainer) + } + + open fun visitDeclarationContainer(declarationContainer: SirDeclarationContainer) { + visitElement(declarationContainer) + } + + final override fun visitDeclaration(declaration: SirDeclaration, data: Nothing?) { + visitDeclaration(declaration) + } + + open fun visitDeclaration(declaration: SirDeclaration) { + visitElement(declaration) + } + + final override fun visitForeignDeclaration(foreignDeclaration: SirForeignDeclaration, data: Nothing?) { + visitForeignDeclaration(foreignDeclaration) + } + + open fun visitForeignDeclaration(foreignDeclaration: SirForeignDeclaration) { + visitDeclaration(foreignDeclaration) + } + + final override fun visitNamedDeclaration(namedDeclaration: SirNamedDeclaration, data: Nothing?) { + visitNamedDeclaration(namedDeclaration) + } + + open fun visitNamedDeclaration(namedDeclaration: SirNamedDeclaration) { + visitDeclaration(namedDeclaration) + } + + final override fun visitEnum(enum: SirEnum, data: Nothing?) { + visitEnum(enum) + } + + open fun visitEnum(enum: SirEnum) { + visitNamedDeclaration(enum) + } + + final override fun visitStruct(struct: SirStruct, data: Nothing?) { + visitStruct(struct) + } + + open fun visitStruct(struct: SirStruct) { + visitNamedDeclaration(struct) + } + + final override fun visitCallable(callable: SirCallable, data: Nothing?) { + visitCallable(callable) + } + + open fun visitCallable(callable: SirCallable) { + visitDeclaration(callable) + } + + final override fun visitFunction(function: SirFunction, data: Nothing?) { + visitFunction(function) + } + + open fun visitFunction(function: SirFunction) { + visitCallable(function) + } + + final override fun visitForeignFunction(foreignFunction: SirForeignFunction, data: Nothing?) { + visitForeignFunction(foreignFunction) + } + + open fun visitForeignFunction(foreignFunction: SirForeignFunction) { + visitCallable(foreignFunction) + } +} diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Main.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Main.kt index 8c706ac69df..e0abdc47f4d 100644 --- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Main.kt +++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Main.kt @@ -27,6 +27,7 @@ fun main(args: Array) { ::ElementPrinter, listOf( elementVisitorType to ::VisitorPrinter, + elementVisitorVoidType to ::VisitorVoidPrinter, elementTransformerType to ::TransformerPrinter.bind(model.rootElement), ), ImplementationConfigurator, diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt index cd8434a8bc0..c5838e7f42a 100644 --- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt +++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/Types.kt @@ -18,6 +18,7 @@ val enumCaseType = type(BASE_PACKAGE, "SirEnumCase", TypeKind.Class) private const val VISITORS_PACKAGE = "$BASE_PACKAGE.visitors" val elementVisitorType = type(VISITORS_PACKAGE, "SirVisitor", TypeKind.Class) +val elementVisitorVoidType = type(VISITORS_PACKAGE, "SirVisitorVoid", TypeKind.Class) val elementTransformerType = type(VISITORS_PACKAGE, "SirTransformer", TypeKind.Class) val swiftIrImplementationDetailAnnotation = type(BASE_PACKAGE, "SirImplementationDetail", TypeKind.Class) diff --git a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/printer/ElementPrinter.kt b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/printer/ElementPrinter.kt index 96a9c46fa09..aedf925188b 100644 --- a/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/printer/ElementPrinter.kt +++ b/native/swift/sir/tree-generator/src/org/jetbrains/kotlin/sir/tree/generator/printer/ElementPrinter.kt @@ -7,13 +7,12 @@ package org.jetbrains.kotlin.sir.tree.generator.printer import org.jetbrains.kotlin.generators.tree.* import org.jetbrains.kotlin.generators.tree.printer.* -import org.jetbrains.kotlin.sir.tree.generator.BASE_PACKAGE import org.jetbrains.kotlin.sir.tree.generator.SwiftIrTree -import org.jetbrains.kotlin.sir.tree.generator.model.Element -import org.jetbrains.kotlin.sir.tree.generator.model.Field import org.jetbrains.kotlin.sir.tree.generator.elementTransformerType import org.jetbrains.kotlin.sir.tree.generator.elementVisitorType -import org.jetbrains.kotlin.sir.tree.generator.model.SimpleField +import org.jetbrains.kotlin.sir.tree.generator.elementVisitorVoidType +import org.jetbrains.kotlin.sir.tree.generator.model.Element +import org.jetbrains.kotlin.sir.tree.generator.model.Field import org.jetbrains.kotlin.utils.SmartPrinter internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter(printer) { @@ -37,8 +36,12 @@ internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter, +) : AbstractVisitorVoidPrinter(printer) { + + override val visitorSuperClass: ClassRef + get() = elementVisitorType + + override val useAbstractMethodForRootElement: Boolean + get() = false + + override val overriddenVisitMethodsAreFinal: Boolean + get() = true +}