From 1a371350ea17e35a543d780d51ff4af0d3dec2e4 Mon Sep 17 00:00:00 2001 From: Sergej Jaskiewicz Date: Fri, 5 May 2023 12:59:18 +0200 Subject: [PATCH] [IR] Make IrClassifierSymbol a sealed interface --- .../fir/backend/Fir2IrDeclarationStorage.kt | 2 +- .../kotlin/ir/backend/js/utils/IrTypeUtils.kt | 16 ++++++---------- .../kotlin/backend/jvm/ir/JvmIrTypeUtils.kt | 6 ++++-- .../kotlin/ir/descriptors/IrBasedDescriptors.kt | 1 - .../org/jetbrains/kotlin/ir/symbols/IrSymbol.kt | 2 +- .../org/jetbrains/kotlin/ir/types/IrTypeUtils.kt | 3 +-- .../src/org/jetbrains/kotlin/ir/types/irTypes.kt | 2 +- .../kotlin/ir/util/DeepCopySymbolRemapper.kt | 1 - .../src/org/jetbrains/kotlin/ir/util/IrUtils.kt | 4 ++++ .../serialization/mangle/ir/IrMangleComputer.kt | 2 ++ .../kotlin/backend/konan/InlineClasses.kt | 13 ++++++------- .../konan/lower/ExpectDeclarationsRemoving.kt | 2 +- .../backend/konan/lower/ReflectionSupport.kt | 4 +++- .../backend/konan/lower/TypeOperatorLowering.kt | 4 +++- .../src/org/jetbrains/kotlin/ir/util/IrUtils2.kt | 10 +++------- .../compiler/backend/ir/IrPredicates.kt | 4 ++-- 16 files changed, 38 insertions(+), 38 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index f31767c6771..19e9095d705 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -158,7 +158,7 @@ class Fir2IrDeclarationStorage( val irClass = irClassifierSymbol.owner firType is ConeClassLikeType && irClass.name == firType.lookupTag.name } - else -> { + is IrScriptSymbol -> { false } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt index 344ee46fc67..3f28cd5172a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrTypeUtils.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable import org.jetbrains.kotlin.ir.util.isEffectivelyExternal +import org.jetbrains.kotlin.ir.util.unexpectedSymbolKind import org.jetbrains.kotlin.js.backend.ast.JsNameRef import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty @@ -44,18 +45,13 @@ private fun IrTypeArgument.asString(): String = when (this) { private fun IrClassifierSymbol.asString() = when (this) { is IrTypeParameterSymbol -> this.owner.name.asString() is IrClassSymbol -> this.owner.fqNameWhenAvailable!!.asString() - else -> error("Unexpected kind of IrClassifierSymbol: " + javaClass.typeName) + is IrScriptSymbol -> unexpectedSymbolKind() } -tailrec fun erase(type: IrType): IrClass? { - val classifier = type.classifierOrFail - - return when (classifier) { - is IrClassSymbol -> classifier.owner - is IrTypeParameterSymbol -> erase(classifier.owner.superTypes.first()) - is IrScriptSymbol -> null - else -> error(classifier) - } +tailrec fun erase(type: IrType): IrClass? = when (val classifier = type.classifierOrFail) { + is IrClassSymbol -> classifier.owner + is IrTypeParameterSymbol -> erase(classifier.owner.superTypes.first()) + is IrScriptSymbol -> null } fun IrType.getClassRef(context: JsGenerationContext): JsNameRef = diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt index c5dfebf4f1a..a2a6b8cb03b 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrTypeUtils.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* @@ -21,6 +22,7 @@ import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection import org.jetbrains.kotlin.ir.util.isLocal import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.util.unexpectedSymbolKind /** * Perform as much type erasure as is significant for JVM signature generation. @@ -87,7 +89,7 @@ val IrType.erasedUpperBound: IrClass is IrClassSymbol -> classifier.owner is IrTypeParameterSymbol -> classifier.owner.erasedUpperBound is IrScriptSymbol -> classifier.owner.targetClass!!.owner - else -> if (this is IrErrorType) symbol.owner else error(render()) + null -> if (this is IrErrorType) symbol.owner else error(render()) } /** @@ -139,7 +141,7 @@ fun IrType.eraseToScope(visibleTypeParameters: Set): IrType { this else upperBound.mergeNullability(this) - else -> error("unknown IrType classifier kind: ${classifier.owner.render()}") + is IrScriptSymbol -> classifier.unexpectedSymbolKind() } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt index 6ecd7d91a67..2cef17e1755 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt @@ -1211,7 +1211,6 @@ private fun makeKotlinType( KotlinTypeFactory.EMPTY_REFINED_TYPE_FACTORY ).makeNullableAsSpecified(hasQuestionMark) } - else -> error("unknown classifier kind $classifier") } /* When IR-based descriptors are used from Psi2Ir, symbols may be unbound, thus we may need to resort to real descriptors. */ diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt index cb66ab2f931..2a21374dd08 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/symbols/IrSymbol.kt @@ -69,7 +69,7 @@ interface IrEnumEntrySymbol : IrBindableSymbol interface IrFieldSymbol : IrBindableSymbol -interface IrClassifierSymbol : IrSymbol, TypeConstructorMarker { +sealed interface IrClassifierSymbol : IrSymbol, TypeConstructorMarker { @ObsoleteDescriptorBasedAPI override val descriptor: ClassifierDescriptor } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt index 09b52d5a33d..6e7d27028bd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeUtils.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.types.AbstractTypeChecker fun IrClassifierSymbol.superTypes(): List = when (this) { is IrClassSymbol -> owner.superTypes is IrTypeParameterSymbol -> owner.superTypes - else -> emptyList() + is IrScriptSymbol -> emptyList() } fun IrClassifierSymbol.isSubtypeOfClass(superClass: IrClassSymbol): Boolean = @@ -44,7 +44,6 @@ fun IrType.isNullable(): Boolean = SimpleTypeNullability.DEFINITELY_NOT_NULL -> false } is IrScriptSymbol -> nullability == SimpleTypeNullability.MARKED_NULLABLE - else -> error("Unsupported classifier: $classifier") } is IrDynamicType -> true is IrErrorType -> this.isMarkedNullable diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt index 0c0907a1c71..14d02004862 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/irTypes.kt @@ -163,7 +163,7 @@ val IrClassifierSymbol.defaultType: IrType get() = when (this) { is IrClassSymbol -> owner.defaultType is IrTypeParameterSymbol -> owner.defaultType - else -> error("Unexpected classifier symbol type $this") + is IrScriptSymbol -> unexpectedSymbolKind() } val IrTypeParameter.defaultType: IrType diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt index 9dd3860aa16..dfaf9adefa9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolRemapper.kt @@ -231,7 +231,6 @@ open class DeepCopySymbolRemapper( is IrClassSymbol -> classes.getReferenced(symbol) is IrScriptSymbol -> scripts.getReferenced(symbol) is IrTypeParameterSymbol -> typeParameters.getReferenced(symbol) - else -> throw IllegalArgumentException("Unexpected symbol $symbol") } override fun getReferencedTypeAlias(symbol: IrTypeAliasSymbol): IrTypeAliasSymbol = typeAliases.getReferenced(symbol) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 82837cbeba9..3f3d8956910 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -1421,4 +1421,8 @@ fun IrAttributeContainer.extractRelatedDeclaration(): IrDeclaration? { is IrFunctionReference -> symbol.owner else -> null } +} + +inline fun IrSymbol.unexpectedSymbolKind(): Nothing { + throw IllegalArgumentException("Unexpected kind of ${Symbol::class.java.typeName}: $this") } \ No newline at end of file diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt index e586f0369d6..084b97a1065 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/mangle/ir/IrMangleComputer.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* @@ -133,6 +134,7 @@ open class IrMangleComputer( when (val classifier = type.classifier) { is IrClassSymbol -> with(copy(MangleMode.FQNAME)) { classifier.owner.visit() } is IrTypeParameterSymbol -> tBuilder.mangleTypeParameterReference(classifier) + is IrScriptSymbol -> {} } mangleTypeArguments(tBuilder, type, null) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt index a4894b03a89..55815b01569 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/InlineClasses.kt @@ -16,6 +16,8 @@ import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.inlineClassRepresentation import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol +import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classifierOrFail @@ -284,13 +286,10 @@ internal object IrTypeInlineClassesSupport : InlineClassesSupport { - val classifier = type.classifierOrFail - return when (classifier) { - is IrClassSymbol -> sequenceOf(classifier.owner) - is IrTypeParameterSymbol -> classifier.owner.superTypes.asSequence().flatMap { computeFullErasure(it) } - else -> error(classifier) - } + override fun computeFullErasure(type: IrType): Sequence = when (val classifier = type.classifierOrFail) { + is IrClassSymbol -> sequenceOf(classifier.owner) + is IrTypeParameterSymbol -> classifier.owner.superTypes.asSequence().flatMap { computeFullErasure(it) } + is IrScriptSymbol -> classifier.unexpectedSymbolKind() } override fun hasInlineModifier(clazz: IrClass): Boolean = clazz.isSingleFieldValueClass diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt index 621bdd3d3d4..67c5e397b42 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt @@ -119,7 +119,7 @@ internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFr override fun getReferencedClassifier(symbol: IrClassifierSymbol): IrClassifierSymbol = when (symbol) { is IrClassSymbol -> getReferencedClass(symbol) is IrTypeParameterSymbol -> remapExpectTypeParameter(symbol).symbol - else -> error("Unexpected symbol $symbol ${symbol.descriptor}") + is IrScriptSymbol -> symbol.unexpectedSymbolKind() } override fun getReferencedConstructor(symbol: IrConstructorSymbol) = diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt index eb062398fb7..dea71374ca4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ReflectionSupport.kt @@ -15,6 +15,8 @@ import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol +import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* @@ -65,7 +67,7 @@ internal class KTypeGenerator( // Leave upper bounds of non-reified type parameters as is, even if they are reified themselves. irKTypeParameter(classifier.owner, leaveReifiedForLater = false, seenTypeParameters = seenTypeParameters) } - else -> TODO("Unexpected classifier: $classifier") + is IrScriptSymbol -> classifier.unexpectedSymbolKind() } return irKTypeImpl( diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TypeOperatorLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TypeOperatorLowering.kt index 7ac8ccfbeb4..b4c3d1c4c7e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TypeOperatorLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TypeOperatorLowering.kt @@ -14,6 +14,8 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrTypeOperator import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol +import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* @@ -36,7 +38,7 @@ internal fun IrType.erasure(): IrType { // In the second case, there is only a single supertype. classifier.owner.superTypes.first().erasure() } - else -> TODO(classifier.toString()) + is IrScriptSymbol -> classifier.unexpectedSymbolKind() } return upperBound.mergeNullability(this) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt index 7fcb57aa6b6..e6987ce33ce 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt @@ -27,10 +27,7 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.IrClassSymbol -import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol -import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol +import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl @@ -172,8 +169,7 @@ fun IrFunctionAccessExpression.addArguments(args: Map): IrType { if (this !is IrSimpleType) return this - val classifier = this.classifier - return when (classifier) { + return when (val classifier = this.classifier) { is IrTypeParameterSymbol -> map[classifier]?.mergeNullability(this) ?: this is IrClassSymbol -> if (this.arguments.isEmpty()) { @@ -187,7 +183,7 @@ fun IrType.substitute(map: Map): IrType { } IrSimpleTypeImpl(classifier, nullability, newArguments, annotations) } - else -> error(classifier) + is IrScriptSymbol -> classifier.unexpectedSymbolKind() } } diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt index a4b9f97fe60..143c46cfa3c 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrPredicates.kt @@ -248,11 +248,11 @@ fun findSerializerConstructorForTypeArgumentsSerializers(serializer: IrClass): I }?.symbol } -fun IrType.classOrUpperBound(): IrClassSymbol? = when(val cls = classifierOrNull) { +fun IrType.classOrUpperBound(): IrClassSymbol? = when (val cls = classifierOrNull) { is IrClassSymbol -> cls is IrScriptSymbol -> cls.owner.targetClass is IrTypeParameterSymbol -> cls.owner.representativeUpperBound.classOrUpperBound() - else -> null + null -> null } /**