[FIR/IR generator] Share visitor-related properties between FIR & IR
This commit is contained in:
committed by
Space Team
parent
bdfb3c3ac9
commit
75b509c185
+13
-4
@@ -54,13 +54,22 @@ class Element(
|
||||
|
||||
var isLeaf = config.isForcedLeaf
|
||||
val childrenOrderOverride: List<String>? = config.childrenOrderOverride
|
||||
var walkableChildren: List<Field> = emptyList()
|
||||
val transformableChildren get() = walkableChildren.filter { it.transformable }
|
||||
override var walkableChildren: List<Field> = emptyList()
|
||||
override val transformableChildren get() = walkableChildren.filter { it.transformable }
|
||||
|
||||
val visitFunName = "visit" + (config.visitorName ?: name).replaceFirstChar(Char::uppercaseChar)
|
||||
val visitorParam = config.visitorParam ?: config.category.defaultVisitorParam
|
||||
var accept = config.accept
|
||||
val transform = config.transform
|
||||
|
||||
override var hasAcceptMethod = config.accept
|
||||
|
||||
override val hasTransformMethod = config.transform
|
||||
|
||||
override val hasAcceptChildrenMethod: Boolean
|
||||
get() = ownsChildren && (isRootElement || walkableChildren.isNotEmpty())
|
||||
|
||||
override val hasTransformChildrenMethod: Boolean
|
||||
get() = ownsChildren && (isRootElement || transformableChildren.isNotEmpty())
|
||||
|
||||
val transformByChildren = config.transformByChildren
|
||||
val ownsChildren = config.ownsChildren
|
||||
val generateIrFactoryMethod = config.generateIrFactoryMethod
|
||||
|
||||
+1
-1
@@ -153,7 +153,7 @@ private fun markLeaves(elements: List<Element>) {
|
||||
for (el in leaves) {
|
||||
el.isLeaf = true
|
||||
if (el.visitorParent != null) {
|
||||
el.accept = true
|
||||
el.hasAcceptMethod = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -81,7 +81,7 @@ fun printElements(generationPath: File, model: Model) = sequence {
|
||||
val isRootElement = element.isRootElement
|
||||
val acceptMethodName = "accept"
|
||||
val transformMethodName = "transform"
|
||||
if (element.accept) {
|
||||
if (element.hasAcceptMethod) {
|
||||
addFunction(FunSpec.builder(acceptMethodName).apply {
|
||||
addModifiers(if (isRootElement) KModifier.ABSTRACT else KModifier.OVERRIDE)
|
||||
val r = TypeVariableName("R")
|
||||
@@ -114,7 +114,7 @@ fun printElements(generationPath: File, model: Model) = sequence {
|
||||
}.build())
|
||||
}
|
||||
|
||||
if (element.transform) {
|
||||
if (element.hasTransformMethod) {
|
||||
addFunction(FunSpec.builder(transformMethodName).apply {
|
||||
addModifiers(if (isRootElement) KModifier.ABSTRACT else KModifier.OVERRIDE)
|
||||
val d = TypeVariableName("D")
|
||||
@@ -145,7 +145,7 @@ fun printElements(generationPath: File, model: Model) = sequence {
|
||||
}.build())
|
||||
}
|
||||
|
||||
if (element.ownsChildren && (isRootElement || element.walkableChildren.isNotEmpty())) {
|
||||
if (element.hasAcceptChildrenMethod) {
|
||||
addFunction(FunSpec.builder("acceptChildren").apply {
|
||||
addModifiers(if (isRootElement) KModifier.ABSTRACT else KModifier.OVERRIDE)
|
||||
val d = TypeVariableName("D")
|
||||
@@ -193,7 +193,7 @@ fun printElements(generationPath: File, model: Model) = sequence {
|
||||
}.build())
|
||||
}
|
||||
|
||||
if (element.ownsChildren && (isRootElement || element.transformableChildren.isNotEmpty())) {
|
||||
if (element.hasTransformChildrenMethod) {
|
||||
addFunction(FunSpec.builder("transformChildren").apply {
|
||||
addModifiers(if (isRootElement) KModifier.ABSTRACT else KModifier.OVERRIDE)
|
||||
val d = TypeVariableName("D")
|
||||
@@ -233,7 +233,7 @@ fun printElements(generationPath: File, model: Model) = sequence {
|
||||
if (child is SingleField) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val elRef = child.typeRef as GenericElementRef<Element, Field>
|
||||
if (!elRef.element.transform) {
|
||||
if (!elRef.element.hasTransformMethod) {
|
||||
append(" as %T")
|
||||
if (child.nullable) append("?")
|
||||
args.add(elRef.toPoet())
|
||||
|
||||
Reference in New Issue
Block a user