From 9831a4b9ec2ec4fe6106d86acb63c1c0863bc6fc Mon Sep 17 00:00:00 2001 From: mcpiroman Date: Mon, 27 Mar 2023 16:07:42 +0200 Subject: [PATCH] [IR] Autogenerate IrMemberAccessExpression --- .../expressions/IrMemberAccessExpression.kt | 13 ++-- .../jetbrains/kotlin/ir/generator/IrTree.kt | 67 +++++++++++++++++-- 2 files changed, 69 insertions(+), 11 deletions(-) rename compiler/ir/ir.tree/{src => gen}/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt (84%) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt similarity index 84% rename from compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt rename to compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt index 96c4addf489..8f5443afce6 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt +++ b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt @@ -1,18 +1,23 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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 compiler/ir/ir.tree/tree-generator/ReadMe.md. +// DO NOT MODIFY IT MANUALLY. + package org.jetbrains.kotlin.ir.expressions import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.util.transformInPlace import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor -// todo: autogenerate /** * A non-leaf IR tree element. + * + * Generated from: [org.jetbrains.kotlin.ir.generator.IrTree.memberAccessExpression] */ abstract class IrMemberAccessExpression : IrDeclarationReference() { var dispatchReceiver: IrExpression? = null @@ -42,9 +47,7 @@ abstract class IrMemberAccessExpression : IrDeclarationReference() override fun transformChildren(transformer: IrElementTransformer, data: D) { dispatchReceiver = dispatchReceiver?.transform(transformer, data) extensionReceiver = extensionReceiver?.transform(transformer, data) - valueArguments.forEachIndexed { i, irExpression -> - valueArguments[i] = irExpression?.transform(transformer, data) - } + valueArguments.transformInPlace(transformer, data) } fun getValueArgument(index: Int): IrExpression? { diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt index b9956544875..300cb233b2d 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.generator import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.MemberName import org.jetbrains.kotlin.descriptors.ClassKind @@ -15,6 +16,7 @@ import org.jetbrains.kotlin.descriptors.ValueClassRepresentation import org.jetbrains.kotlin.ir.generator.config.AbstractTreeBuilder import org.jetbrains.kotlin.ir.generator.config.ElementConfig import org.jetbrains.kotlin.ir.generator.config.ElementConfig.Category.* +import org.jetbrains.kotlin.ir.generator.config.ListFieldConfig.Mutability.Array import org.jetbrains.kotlin.ir.generator.config.ListFieldConfig.Mutability.List import org.jetbrains.kotlin.ir.generator.config.ListFieldConfig.Mutability.Var import org.jetbrains.kotlin.ir.generator.config.SimpleFieldConfig @@ -592,7 +594,6 @@ object IrTree : AbstractTreeBuilder() { //diff: no accept } val memberAccessExpression: ElementConfig by element(Expression) { - suppressPrint = true //todo: generate this element too visitorParent = declarationReference visitorName = "memberAccess" transformerReturnType = rootElement @@ -601,15 +602,69 @@ object IrTree : AbstractTreeBuilder() { parent(declarationReference) +field("dispatchReceiver", expression, nullable = true, isChild = true) { - baseDefaultValue = code("this") + baseDefaultValue = code("null") } +field("extensionReceiver", expression, nullable = true, isChild = true) { - baseDefaultValue = code("this") + baseDefaultValue = code("null") } +symbol(s) - +field("origin", statementOriginType, nullable = true) - +field("typeArgumentsCount", int) - +field("typeArgumentsByIndex", type>(irTypeType.copy(nullable = true))) + +field("origin", statementOriginType, nullable = true, mutable = false) + +listField("valueArguments", expression.copy(nullable = true), mutability = Array, isChild = true) { + generationCallback = { + addModifiers(KModifier.PROTECTED) + } + } + +listField("typeArguments", irTypeType.copy(nullable = true), mutability = Array) { + generationCallback = { + addModifiers(KModifier.PROTECTED) + } + } + + val checkArgumentSlotAccess = MemberName("org.jetbrains.kotlin.ir.expressions", "checkArgumentSlotAccess", true) + generationCallback = { + addFunction( + FunSpec.builder("getValueArgument") + .addParameter("index", int.toPoet()) + .returns(expression.toPoet().copy(nullable = true)) + .addCode("%M(\"value\", index, valueArguments.size)\n", checkArgumentSlotAccess) + .addCode("return valueArguments[index]") + .build() + ) + addFunction( + FunSpec.builder("getTypeArgument") + .addParameter("index", int.toPoet()) + .returns(irTypeType.toPoet().copy(nullable = true)) + .addCode("%M(\"type\", index, typeArguments.size)\n", checkArgumentSlotAccess) + .addCode("return typeArguments[index]") + .build() + ) + addFunction( + FunSpec.builder("putValueArgument") + .addParameter("index", int.toPoet()) + .addParameter("valueArgument", expression.toPoet().copy(nullable = true)) + .addCode("%M(\"value\", index, valueArguments.size)\n", checkArgumentSlotAccess) + .addCode("valueArguments[index] = valueArgument") + .build() + ) + addFunction( + FunSpec.builder("putTypeArgument") + .addParameter("index", int.toPoet()) + .addParameter("type", irTypeType.toPoet().copy(nullable = true)) + .addCode("%M(\"type\", index, typeArguments.size)\n", checkArgumentSlotAccess) + .addCode("typeArguments[index] = type") + .build() + ) + addProperty( + PropertySpec.builder("valueArgumentsCount", int.toPoet()) + .getter(FunSpec.getterBuilder().addCode("return valueArguments.size").build()) + .build() + ) + addProperty( + PropertySpec.builder("typeArgumentsCount", int.toPoet()) + .getter(FunSpec.getterBuilder().addCode("return typeArguments.size").build()) + .build() + ) + } } val functionAccessExpression: ElementConfig by element(Expression) { visitorParent = memberAccessExpression