From baaaf4567e0596b3bb50f7c098b6bf0b16797bab Mon Sep 17 00:00:00 2001 From: Wojciech Litewka Date: Thu, 29 Feb 2024 10:57:25 +0100 Subject: [PATCH] [IR] Convert methods in IrConstantValue classes to extension functions to get rid of custom logic inside generated classes. #KT-65773 In Progress --- .../kotlin/ir/expressions/IrConstantValue.kt | 6 +- .../expressions/impl/IrConstantArrayImpl.kt | 14 ---- .../expressions/impl/IrConstantObjectImpl.kt | 28 +------ .../impl/IrConstantPrimitiveImpl.kt | 17 ----- .../kotlin/ir/util/IrConstantValue.kt | 75 +++++++++++++++++++ .../jetbrains/kotlin/ir/generator/IrTree.kt | 20 +---- 6 files changed, 81 insertions(+), 79 deletions(-) create mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrConstantValue.kt diff --git a/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrConstantValue.kt b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrConstantValue.kt index ec7b4f797dd..8acda526d62 100644 --- a/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrConstantValue.kt +++ b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrConstantValue.kt @@ -11,8 +11,4 @@ package org.jetbrains.kotlin.ir.expressions /** * Generated from: [org.jetbrains.kotlin.ir.generator.IrTree.constantValue] */ -abstract class IrConstantValue : IrExpression() { - abstract fun contentEquals(other: IrConstantValue): Boolean - - abstract fun contentHashCode(): Int -} +sealed class IrConstantValue : IrExpression() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantArrayImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantArrayImpl.kt index 5485c43a3a7..67c0a0558ae 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantArrayImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantArrayImpl.kt @@ -21,18 +21,4 @@ class IrConstantArrayImpl( override var attributeOwnerId: IrAttributeContainer = this override var originalBeforeInline: IrAttributeContainer? = null - - override fun contentEquals(other: IrConstantValue): Boolean = - other is IrConstantArray && - other.type == type && - elements.size == other.elements.size && - elements.indices.all { elements[it].contentEquals(other.elements[it]) } - - override fun contentHashCode(): Int { - var res = type.hashCode() - for (value in elements) { - res = res * 31 + value.contentHashCode() - } - return res - } } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantObjectImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantObjectImpl.kt index 1448e2a186e..e95381adb86 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantObjectImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantObjectImpl.kt @@ -1,18 +1,19 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 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.ir.expressions.impl import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer -import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.IrConstantObject +import org.jetbrains.kotlin.ir.expressions.IrConstantValue import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.constructedClassType import org.jetbrains.kotlin.utils.SmartList -class IrConstantObjectImpl constructor( +class IrConstantObjectImpl( override val startOffset: Int, override val endOffset: Int, override var constructor: IrConstructorSymbol, @@ -25,25 +26,4 @@ class IrConstantObjectImpl constructor( override var attributeOwnerId: IrAttributeContainer = this override var originalBeforeInline: IrAttributeContainer? = null - - override fun contentEquals(other: IrConstantValue): Boolean = - other is IrConstantObject && - other.type == type && - other.constructor == constructor && - valueArguments.size == other.valueArguments.size && - typeArguments.size == other.typeArguments.size && - valueArguments.indices.all { index -> valueArguments[index].contentEquals(other.valueArguments[index]) } && - typeArguments.indices.all { index -> typeArguments[index] == other.typeArguments[index] } - - - override fun contentHashCode(): Int { - var res = type.hashCode() * 31 + constructor.hashCode() - for (value in valueArguments) { - res = res * 31 + value.contentHashCode() - } - for (value in typeArguments) { - res = res * 31 + value.hashCode() - } - return res - } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantPrimitiveImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantPrimitiveImpl.kt index 89cb2d2e207..b07fa30b267 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantPrimitiveImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrConstantPrimitiveImpl.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.ir.expressions.impl import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.ir.expressions.IrConstantPrimitive -import org.jetbrains.kotlin.ir.expressions.IrConstantValue class IrConstantPrimitiveImpl( override val startOffset: Int, @@ -17,21 +16,5 @@ class IrConstantPrimitiveImpl( ) : IrConstantPrimitive() { override var attributeOwnerId: IrAttributeContainer = this override var originalBeforeInline: IrAttributeContainer? = null - - override fun contentEquals(other: IrConstantValue) = - other is IrConstantPrimitive && - type == other.type && - value.type == other.value.type && - value.kind == other.value.kind && - value.value == other.value.value - - override fun contentHashCode(): Int { - var result = type.hashCode() - result = result * 31 + value.type.hashCode() - result = result * 31 + value.kind.hashCode() - result = result * 31 + value.value.hashCode() - return result - } - override var type = value.type } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrConstantValue.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrConstantValue.kt new file mode 100644 index 00000000000..f56b7d53560 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrConstantValue.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2010-2024 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.ir.util + +import org.jetbrains.kotlin.ir.expressions.IrConstantArray +import org.jetbrains.kotlin.ir.expressions.IrConstantObject +import org.jetbrains.kotlin.ir.expressions.IrConstantPrimitive +import org.jetbrains.kotlin.ir.expressions.IrConstantValue + +fun IrConstantValue.contentEquals(other: IrConstantValue): Boolean = when (this) { + is IrConstantPrimitive -> contentEquals(other) + is IrConstantObject -> contentEquals(other) + is IrConstantArray -> contentEquals(other) +} + +fun IrConstantValue.contentHashCode(): Int = when (this) { + is IrConstantPrimitive -> contentHashCode() + is IrConstantObject -> contentHashCode() + is IrConstantArray -> contentHashCode() +} + + +fun IrConstantPrimitive.contentEquals(other: IrConstantValue): Boolean = + other is IrConstantPrimitive && + type == other.type && + value.type == other.value.type && + value.kind == other.value.kind && + value.value == other.value.value + +fun IrConstantPrimitive.contentHashCode(): Int { + var result = type.hashCode() + result = result * 31 + value.type.hashCode() + result = result * 31 + value.kind.hashCode() + result = result * 31 + value.value.hashCode() + return result +} + + +fun IrConstantObject.contentEquals(other: IrConstantValue): Boolean = + other is IrConstantObject && + other.type == type && + other.constructor == constructor && + valueArguments.size == other.valueArguments.size && + typeArguments.size == other.typeArguments.size && + valueArguments.indices.all { index -> valueArguments[index].contentEquals(other.valueArguments[index]) } && + typeArguments.indices.all { index -> typeArguments[index] == other.typeArguments[index] } + +fun IrConstantObject.contentHashCode(): Int { + var res = type.hashCode() * 31 + constructor.hashCode() + for (value in valueArguments) { + res = res * 31 + value.contentHashCode() + } + for (value in typeArguments) { + res = res * 31 + value.hashCode() + } + return res +} + + +fun IrConstantArray.contentEquals(other: IrConstantValue): Boolean = + other is IrConstantArray && + other.type == type && + elements.size == other.elements.size && + elements.indices.all { elements[it].contentEquals(other.elements[it]) } + +fun IrConstantArray.contentHashCode(): Int { + var res = type.hashCode() + for (value in elements) { + res = res * 31 + value.contentHashCode() + } + return res +} 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 ae56f28d723..e1e83db21c4 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 @@ -951,27 +951,9 @@ object IrTree : AbstractTreeBuilder() { } val constantValue: Element by element(Expression) { transformByChildren = true + kind = ImplementationKind.SealedClass parent(expression) - - generationCallback = { - println() - printFunctionDeclaration( - name = "contentEquals", - parameters = listOf(FunctionParameter("other", constantValue)), - returnType = StandardTypes.boolean, - modality = Modality.ABSTRACT, - ) - println() - println() - printFunctionDeclaration( - name = "contentHashCode", - parameters = emptyList(), - returnType = StandardTypes.int, - modality = Modality.ABSTRACT, - ) - println() - } } val constantPrimitive: Element by element(Expression) { parent(constantValue)