[FIR/IR generator] Extract visitFunctionName to AbstractElement

This commit is contained in:
Sergej Jaskiewicz
2023-11-13 18:31:37 +01:00
committed by Space Team
parent 8ba42a7ff2
commit 9a11208e67
5 changed files with 25 additions and 26 deletions
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.ElementOrRef as GenericElementOrRef import org.jetbrains.kotlin.generators.tree.ElementOrRef as GenericElementOrRef
import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef
class Element(override val name: String, override val propertyName: String, kind: Kind) : AbstractElement<Element, Field>() { class Element(name: String, override val propertyName: String, kind: Kind) : AbstractElement<Element, Field>(name) {
companion object { companion object {
private val allowedKinds = setOf( private val allowedKinds = setOf(
ImplementationKind.Interface, ImplementationKind.Interface,
@@ -79,9 +79,6 @@ class Element(override val name: String, override val propertyName: String, kind
var baseTransformerType: Element? = null var baseTransformerType: Element? = null
val transformerClass: Element get() = baseTransformerType ?: this val transformerClass: Element get() = baseTransformerType ?: this
override val visitFunctionName: String
get() = "visit$name"
override val visitorParameterName: String override val visitorParameterName: String
get() = safeDecapitalizedName get() = safeDecapitalizedName
@@ -71,7 +71,7 @@ object IrTree : AbstractTreeBuilder() {
skipInIrFactory() skipInIrFactory()
} }
override val rootElement: Element by element(Other, name = "element") { override val rootElement: Element by element(Other, name = "Element") {
hasAcceptMethod = true hasAcceptMethod = true
hasTransformMethod = true hasTransformMethod = true
transformByChildren = true transformByChildren = true
@@ -111,7 +111,7 @@ object IrTree : AbstractTreeBuilder() {
transformByChildren = true transformByChildren = true
transformerReturnType = statement transformerReturnType = statement
parentInVisitor = rootElement parentInVisitor = rootElement
visitorName = "declaration" nameInVisitorMethod = "Declaration"
parent(declaration) parent(declaration)
} }
@@ -731,7 +731,7 @@ object IrTree : AbstractTreeBuilder() {
} }
val memberAccessExpression: Element by element(Expression) { val memberAccessExpression: Element by element(Expression) {
parentInVisitor = declarationReference parentInVisitor = declarationReference
visitorName = "memberAccess" nameInVisitorMethod = "MemberAccess"
transformerReturnType = rootElement transformerReturnType = rootElement
val s = +param("S", symbolType) val s = +param("S", symbolType)
@@ -813,7 +813,7 @@ object IrTree : AbstractTreeBuilder() {
} }
val functionAccessExpression: Element by element(Expression) { val functionAccessExpression: Element by element(Expression) {
parentInVisitor = memberAccessExpression parentInVisitor = memberAccessExpression
visitorName = "functionAccess" nameInVisitorMethod = "FunctionAccess"
transformerReturnType = rootElement transformerReturnType = rootElement
parent(memberAccessExpression.withArgs("S" to functionSymbolType)) parent(memberAccessExpression.withArgs("S" to functionSymbolType))
@@ -834,7 +834,7 @@ object IrTree : AbstractTreeBuilder() {
} }
val getSingletonValue: Element by element(Expression) { val getSingletonValue: Element by element(Expression) {
parentInVisitor = declarationReference parentInVisitor = declarationReference
visitorName = "SingletonReference" nameInVisitorMethod = "SingletonReference"
parent(declarationReference) parent(declarationReference)
} }
@@ -1092,7 +1092,7 @@ object IrTree : AbstractTreeBuilder() {
} }
val fieldAccessExpression: Element by element(Expression) { val fieldAccessExpression: Element by element(Expression) {
parentInVisitor = declarationReference parentInVisitor = declarationReference
visitorName = "fieldAccess" nameInVisitorMethod = "FieldAccess"
ownsChildren = false ownsChildren = false
parent(declarationReference) parent(declarationReference)
@@ -1228,7 +1228,7 @@ object IrTree : AbstractTreeBuilder() {
} }
val typeOperatorCall: Element by element(Expression) { val typeOperatorCall: Element by element(Expression) {
parentInVisitor = expression parentInVisitor = expression
visitorName = "typeOperator" nameInVisitorMethod = "TypeOperator"
parent(expression) parent(expression)
@@ -1238,7 +1238,7 @@ object IrTree : AbstractTreeBuilder() {
} }
val valueAccessExpression: Element by element(Expression) { val valueAccessExpression: Element by element(Expression) {
parentInVisitor = declarationReference parentInVisitor = declarationReference
visitorName = "valueAccess" nameInVisitorMethod = "ValueAccess"
parent(declarationReference) parent(declarationReference)
@@ -122,7 +122,7 @@ class ElementDelegate(
override fun provideDelegate(thisRef: AbstractTreeBuilder, property: KProperty<*>): ElementDelegate { override fun provideDelegate(thisRef: AbstractTreeBuilder, property: KProperty<*>): ElementDelegate {
val path = thisRef.javaClass.name + "." + property.name val path = thisRef.javaClass.name + "." + property.name
element = Element(name ?: property.name, path, category) element = Element(name ?: property.name.replaceFirstChar(Char::uppercaseChar), path, category)
return this return this
} }
} }
@@ -13,10 +13,10 @@ import org.jetbrains.kotlin.generators.tree.ElementOrRef as GenericElementOrRef
import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef
class Element( class Element(
override val name: String, name: String,
override val propertyName: String, override val propertyName: String,
category: Category, category: Category,
) : AbstractElement<Element, Field>() { ) : AbstractElement<Element, Field>(name) {
enum class Category(private val packageDir: String, val defaultVisitorParam: String) { enum class Category(private val packageDir: String, val defaultVisitorParam: String) {
Expression("expressions", "expression"), Expression("expressions", "expression"),
@@ -67,8 +67,7 @@ class Element(
override var kind: ImplementationKind? = null override var kind: ImplementationKind? = null
override val typeName override val typeName = "Ir$name"
get() = "Ir" + name.replaceFirstChar(Char::uppercaseChar)
/** /**
* Whether this element is semantically a leaf element in the hierarchy. * Whether this element is semantically a leaf element in the hierarchy.
@@ -85,11 +84,6 @@ class Element(
override var walkableChildren: List<Field> = emptyList() override var walkableChildren: List<Field> = emptyList()
override val transformableChildren get() = walkableChildren.filter { it.transformable } override val transformableChildren get() = walkableChildren.filter { it.transformable }
var visitorName: String? = null
override val visitFunctionName: String
get() = "visit" + (visitorName ?: name).replaceFirstChar(Char::uppercaseChar)
override var visitorParameterName = category.defaultVisitorParam override var visitorParameterName = category.defaultVisitorParam
override var hasAcceptMethod = false // By default, accept is generated only for leaves. override var hasAcceptMethod = false // By default, accept is generated only for leaves.
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.generators.tree
/** /**
* A class representing a FIR or IR tree element. * A class representing a FIR or IR tree element.
*/ */
abstract class AbstractElement<Element, Field> : ElementOrRef<Element, Field>, FieldContainer, ImplementationKindOwner abstract class AbstractElement<Element, Field>(
val name: String,
) : ElementOrRef<Element, Field>, FieldContainer, ImplementationKindOwner
where Element : AbstractElement<Element, Field>, where Element : AbstractElement<Element, Field>,
Field : AbstractField { Field : AbstractField {
abstract val name: String
/** /**
* The fully-qualified name of the property in the tree generator that is used to configure this element. * The fully-qualified name of the property in the tree generator that is used to configure this element.
*/ */
@@ -38,10 +38,18 @@ abstract class AbstractElement<Element, Field> : ElementOrRef<Element, Field>, F
open val isSealed: Boolean open val isSealed: Boolean
get() = false get() = false
/**
* The value of this property will be used to name a `visit*` method for this element in visitor classes.
*
* In `visit*`, the `*` will be replaced with the value of this property.
*/
var nameInVisitorMethod: String = name
/** /**
* The name of the method in visitors used to visit this element. * The name of the method in visitors used to visit this element.
*/ */
abstract val visitFunctionName: String val visitFunctionName: String
get() = "visit$nameInVisitorMethod"
/** /**
* The name of the parameter representing this element in the visitor method used to visit this element. * The name of the parameter representing this element in the visitor method used to visit this element.