[SIR generator] Add SirVisitorVoid class
This is convenient for cases when the visitor has no context to pass to each method
This commit is contained in:
committed by
Space Team
parent
80c9eae409
commit
80847b9ee2
+3
-8
@@ -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.Element
|
||||||
import org.jetbrains.kotlin.fir.tree.generator.model.Field
|
import org.jetbrains.kotlin.fir.tree.generator.model.Field
|
||||||
import org.jetbrains.kotlin.generators.tree.*
|
import org.jetbrains.kotlin.generators.tree.*
|
||||||
import org.jetbrains.kotlin.generators.tree.printer.printAcceptChildrenMethod
|
import org.jetbrains.kotlin.generators.tree.printer.*
|
||||||
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.utils.SmartPrinter
|
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||||
|
|
||||||
internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<Element, Field>(printer) {
|
internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<Element, Field>(printer) {
|
||||||
@@ -69,8 +66,7 @@ internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<El
|
|||||||
|
|
||||||
if (element.isRootElement) {
|
if (element.isRootElement) {
|
||||||
println()
|
println()
|
||||||
println("fun accept(visitor: ", firVisitorVoidType.render(), ") = accept(visitor, null)")
|
printAcceptVoidMethod(firVisitorVoidType)
|
||||||
|
|
||||||
printAcceptChildrenMethod(
|
printAcceptChildrenMethod(
|
||||||
element = element,
|
element = element,
|
||||||
visitorClass = firVisitorType,
|
visitorClass = firVisitorType,
|
||||||
@@ -78,8 +74,7 @@ internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<El
|
|||||||
)
|
)
|
||||||
println()
|
println()
|
||||||
println()
|
println()
|
||||||
println("fun acceptChildren(visitor: ", firVisitorVoidType.render(), ") = acceptChildren(visitor, null)")
|
printAcceptChildrenVoidMethod(firVisitorVoidType)
|
||||||
|
|
||||||
printTransformChildrenMethod(
|
printTransformChildrenMethod(
|
||||||
element = element,
|
element = element,
|
||||||
transformerClass = firTransformerType,
|
transformerClass = firTransformerType,
|
||||||
|
|||||||
+2
-2
@@ -60,8 +60,8 @@ abstract class AbstractVisitorVoidPrinter<Element, Field>(
|
|||||||
element,
|
element,
|
||||||
hasDataParameter = false,
|
hasDataParameter = false,
|
||||||
modality = when {
|
modality = when {
|
||||||
element.isRootElement && visitorType.kind == TypeKind.Class -> Modality.ABSTRACT
|
isAbstractVisitRootElementMethod && visitorType.kind == TypeKind.Class -> Modality.ABSTRACT
|
||||||
!element.isRootElement && visitorType.kind == TypeKind.Class -> Modality.OPEN
|
!isAbstractVisitRootElementMethod && visitorType.kind == TypeKind.Class -> Modality.OPEN
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+14
@@ -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 "."
|
fun AbstractField<*>.call(): String = if (nullable) "?." else "."
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ package org.jetbrains.kotlin.sir
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.sir.visitors.SirTransformer
|
import org.jetbrains.kotlin.sir.visitors.SirTransformer
|
||||||
import org.jetbrains.kotlin.sir.visitors.SirVisitor
|
import org.jetbrains.kotlin.sir.visitors.SirVisitor
|
||||||
|
import org.jetbrains.kotlin.sir.visitors.SirVisitorVoid
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The root interface of the Swift IR tree.
|
* The root interface of the Swift IR tree.
|
||||||
@@ -37,6 +38,8 @@ sealed interface SirElement {
|
|||||||
fun <E : SirElement, D> transform(transformer: SirTransformer<D>, data: D): E =
|
fun <E : SirElement, D> transform(transformer: SirTransformer<D>, data: D): E =
|
||||||
transformer.transformElement(this, data) as 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.
|
* Runs the provided [visitor] on subtrees with roots in this node's children.
|
||||||
*
|
*
|
||||||
@@ -49,6 +52,8 @@ sealed interface SirElement {
|
|||||||
*/
|
*/
|
||||||
fun <R, D> acceptChildren(visitor: SirVisitor<R, D>, data: D)
|
fun <R, D> acceptChildren(visitor: SirVisitor<R, D>, data: D)
|
||||||
|
|
||||||
|
fun acceptChildren(visitor: SirVisitorVoid) = acceptChildren(visitor, null)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively transforms this node's children *in place* using [transformer].
|
* Recursively transforms this node's children *in place* using [transformer].
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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<Unit, Nothing?>() {
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ fun main(args: Array<String>) {
|
|||||||
::ElementPrinter,
|
::ElementPrinter,
|
||||||
listOf(
|
listOf(
|
||||||
elementVisitorType to ::VisitorPrinter,
|
elementVisitorType to ::VisitorPrinter,
|
||||||
|
elementVisitorVoidType to ::VisitorVoidPrinter,
|
||||||
elementTransformerType to ::TransformerPrinter.bind(model.rootElement),
|
elementTransformerType to ::TransformerPrinter.bind(model.rootElement),
|
||||||
),
|
),
|
||||||
ImplementationConfigurator,
|
ImplementationConfigurator,
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ val enumCaseType = type(BASE_PACKAGE, "SirEnumCase", TypeKind.Class)
|
|||||||
private const val VISITORS_PACKAGE = "$BASE_PACKAGE.visitors"
|
private const val VISITORS_PACKAGE = "$BASE_PACKAGE.visitors"
|
||||||
|
|
||||||
val elementVisitorType = type(VISITORS_PACKAGE, "SirVisitor", TypeKind.Class)
|
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 elementTransformerType = type(VISITORS_PACKAGE, "SirTransformer", TypeKind.Class)
|
||||||
|
|
||||||
val swiftIrImplementationDetailAnnotation = type(BASE_PACKAGE, "SirImplementationDetail", TypeKind.Class)
|
val swiftIrImplementationDetailAnnotation = type(BASE_PACKAGE, "SirImplementationDetail", TypeKind.Class)
|
||||||
|
|||||||
+7
-4
@@ -7,13 +7,12 @@ package org.jetbrains.kotlin.sir.tree.generator.printer
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.generators.tree.*
|
import org.jetbrains.kotlin.generators.tree.*
|
||||||
import org.jetbrains.kotlin.generators.tree.printer.*
|
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.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.elementTransformerType
|
||||||
import org.jetbrains.kotlin.sir.tree.generator.elementVisitorType
|
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
|
import org.jetbrains.kotlin.utils.SmartPrinter
|
||||||
|
|
||||||
internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<Element, Field>(printer) {
|
internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<Element, Field>(printer) {
|
||||||
@@ -37,8 +36,12 @@ internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<El
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (element.isRootElement) {
|
if (element.isRootElement) {
|
||||||
|
println()
|
||||||
|
printAcceptVoidMethod(elementVisitorVoidType)
|
||||||
printAcceptChildrenMethod(element, elementVisitorType, TypeVariable("R"))
|
printAcceptChildrenMethod(element, elementVisitorType, TypeVariable("R"))
|
||||||
println()
|
println()
|
||||||
|
println()
|
||||||
|
printAcceptChildrenVoidMethod(elementVisitorVoidType)
|
||||||
printTransformChildrenMethod(element, elementTransformerType, StandardTypes.unit)
|
printTransformChildrenMethod(element, elementTransformerType, StandardTypes.unit)
|
||||||
println()
|
println()
|
||||||
}
|
}
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* 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.sir.tree.generator.printer
|
||||||
|
|
||||||
|
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.sir.tree.generator.elementVisitorType
|
||||||
|
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 VisitorVoidPrinter(
|
||||||
|
printer: SmartPrinter,
|
||||||
|
override val visitorType: ClassRef<*>,
|
||||||
|
) : AbstractVisitorVoidPrinter<Element, Field>(printer) {
|
||||||
|
|
||||||
|
override val visitorSuperClass: ClassRef<PositionTypeParameterRef>
|
||||||
|
get() = elementVisitorType
|
||||||
|
|
||||||
|
override val useAbstractMethodForRootElement: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
|
override val overriddenVisitMethodsAreFinal: Boolean
|
||||||
|
get() = true
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user