[FIR/IR generator] Extract visitFunctionName to AbstractElement
This commit is contained in:
committed by
Space Team
parent
8ba42a7ff2
commit
9a11208e67
+1
-4
@@ -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)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-9
@@ -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.
|
||||||
|
|||||||
+12
-4
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user