From 808f5148f3d89a00f28bbd15bda3e66ed613e6f3 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 12 Jul 2021 15:16:35 +0200 Subject: [PATCH] IR: implemented generic knownBuiltIns property --- .../kotlin/fir/backend/IrBuiltInsOverFir.kt | 6 ++-- .../src/org/jetbrains/kotlin/ir/IrBuiltIns.kt | 3 ++ .../descriptors/IrBuiltInsOverDescriptors.kt | 11 +++--- .../common/serialization/DeclarationTable.kt | 11 ++---- .../serialization/IrModuleDeserializer.kt | 36 +++++-------------- .../common/serialization/KotlinIrLinker.kt | 3 +- 6 files changed, 24 insertions(+), 46 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt index bf7c457f962..fcf23d3757a 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt @@ -59,7 +59,7 @@ class IrBuiltInsOverFir( private val kotlinCollectionsPackage = StandardNames.COLLECTIONS_PACKAGE_FQ_NAME - private val internalIrPackage = createPackage(KOTLIN_INTERNAL_IR_FQN) + override val operatorsPackageFragment = createPackage(KOTLIN_INTERNAL_IR_FQN) private val kotlinIrPackage = createPackage(kotlinPackage) override val booleanNotSymbol: IrSimpleFunctionSymbol by lazy { @@ -360,7 +360,7 @@ class IrBuiltInsOverFir( override lateinit var greaterFunByOperandType: Map private set init { - with(internalIrPackage) { + with(this.operatorsPackageFragment) { fun addBuiltinOperatorSymbol( name: String, @@ -690,7 +690,7 @@ class IrBuiltInsOverFir( ?: referenceClassByFqname(lhsClassFqName)?.owner } - private fun createPackage(fqName: FqName): IrPackageFragment = + private fun createPackage(fqName: FqName): IrExternalPackageFragment = IrExternalPackageFragmentImpl.createEmptyExternalPackageFragment(moduleDescriptor, fqName) private fun IrDeclarationParent.createClass( diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt index 76772f72c74..bfaacf4e2dd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.builtins.UnsignedType import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl +import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol @@ -170,6 +171,8 @@ abstract class IrBuiltIns { abstract val getProgressionLastElementByReturnType: Map + abstract val operatorsPackageFragment: IrExternalPackageFragment + companion object { val KOTLIN_INTERNAL_IR_FQN = FqName("kotlin.internal.ir") val BUILTIN_OPERATOR = object : IrDeclarationOriginImpl("OPERATOR") {} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt index 161b0046b83..71e56e4aed6 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltInsOverDescriptors.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrExternalPackageFragment import org.jetbrains.kotlin.ir.declarations.IrFactory import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol @@ -74,7 +75,7 @@ class IrBuiltInsOverDescriptors( private val builtInsModule = builtIns.builtInsModule private val packageFragmentDescriptor = IrBuiltinsPackageFragmentDescriptorImpl(builtInsModule, KOTLIN_INTERNAL_IR_FQN) - val packageFragment = + override val operatorsPackageFragment: IrExternalPackageFragment = IrExternalPackageFragmentImpl(symbolTable.referenceExternalPackageFragment(packageFragmentDescriptor), KOTLIN_INTERNAL_IR_FQN) private fun ClassDescriptor.toIrSymbol() = symbolTable.referenceClass(this) @@ -98,8 +99,8 @@ class IrBuiltInsOverDescriptors( returnType, isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isInfix = false, isExpect = false, isFakeOverride = false ) - operator.parent = packageFragment - packageFragment.declarations += operator + operator.parent = operatorsPackageFragment + operatorsPackageFragment.declarations += operator operator.valueParameters = valueParameterTypes.withIndex().map { (i, valueParameterType) -> val valueParameterDescriptor = operatorDescriptor.valueParameters[i] @@ -185,8 +186,8 @@ class IrBuiltInsOverDescriptors( isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isInfix = false, isExpect = false, isFakeOverride = false ) - operator.parent = packageFragment - packageFragment.declarations += operator + operator.parent = operatorsPackageFragment + operatorsPackageFragment.declarations += operator val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor) val valueParameter = irFactory.createValueParameter( diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt index 35083d9476d..9e1a80177cb 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt @@ -6,20 +6,13 @@ package org.jetbrains.kotlin.backend.common.serialization import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.DescriptorVisibilities -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.backend.common.serialization.signature.PublicIdSignatureComputer import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors -import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid -import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid interface IdSignatureClashTracker { @@ -105,5 +98,5 @@ open class DeclarationTable(globalTable: GlobalDeclarationTable) { } // This is what we pre-populate tables with -val IrBuiltInsOverDescriptors.knownBuiltins: List - get() = packageFragment.declarations +val IrBuiltIns.knownBuiltins: List + get() = operatorsPackageFragment.declarations diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt index 7117125daef..013c14a832d 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt @@ -6,12 +6,10 @@ package org.jetbrains.kotlin.backend.common.serialization import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData -import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor -import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.library.IrLibrary @@ -98,7 +96,7 @@ abstract class IrModuleDeserializer(val moduleDescriptor: ModuleDescriptor, val // Used to resolve built in symbols like `kotlin.ir.internal.*` or `kotlin.FunctionN` @OptIn(ObsoleteDescriptorBasedAPI::class) class IrModuleDeserializerWithBuiltIns( - private val builtIns: IrBuiltInsOverDescriptors, + private val builtIns: IrBuiltIns, private val delegate: IrModuleDeserializer ) : IrModuleDeserializer(delegate.moduleDescriptor, delegate.libraryAbiVersion) { @@ -136,16 +134,16 @@ class IrModuleDeserializerWithBuiltIns( delegate.deserializeReachableDeclarations() } - private fun computeFunctionDescriptor(className: String): FunctionClassDescriptor { + private fun computeFunctionClass(className: String): IrClass { val isK = className[0] == 'K' val isSuspend = (if (isK) className[1] else className[0]) == 'S' val arity = className.run { substring(indexOfFirst { it.isDigit() }).toInt(10) } - return builtIns.builtIns.run { + return builtIns.run { when { - isK && isSuspend -> kSuspendFunctionClassDescriptor(arity) - isK -> kFunctionClassDescriptor(arity) - isSuspend -> suspendFunctionClassDescriptor(arity) - else -> functionClassDescriptor(arity) + isK && isSuspend -> kSuspendFunctionN(arity) + isK -> kFunctionN(arity) + isSuspend -> suspendFunctionN(arity) + else -> functionN(arity) } } } @@ -156,23 +154,7 @@ class IrModuleDeserializerWithBuiltIns( val fqnParts = publicSig.nameSegments val className = fqnParts.firstOrNull() ?: error("Expected class name for $idSig") - val functionDescriptor = computeFunctionDescriptor(className) - val topLevelSignature = IdSignature.CommonSignature(publicSig.packageFqName, className, null, publicSig.mask) - - val functionClass = when (functionDescriptor.functionKind) { - FunctionClassKind.KSuspendFunction -> builtIns.kSuspendFunctionN(functionDescriptor.arity) { callback -> - declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } - } - FunctionClassKind.KFunction -> builtIns.kFunctionN(functionDescriptor.arity) { callback -> - declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } - } - FunctionClassKind.SuspendFunction -> builtIns.suspendFunctionN(functionDescriptor.arity) { callback -> - declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } - } - FunctionClassKind.Function -> builtIns.functionN(functionDescriptor.arity) { callback -> - declareClassFromLinker(functionDescriptor, topLevelSignature) { callback(it) } - } - } + val functionClass = computeFunctionClass(className) return when (fqnParts.size) { 1 -> functionClass.symbol.also { assert(symbolKind == BinarySymbolData.SymbolKind.CLASS_SYMBOL) } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index fef9fbd4805..985d9b0af8a 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrModuleFragment -import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors import org.jetbrains.kotlin.ir.linkage.IrDeserializer import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException import org.jetbrains.kotlin.ir.symbols.* @@ -314,7 +313,7 @@ abstract class KotlinIrLinker( moduleDescriptor: ModuleDescriptor, moduleDeserializer: IrModuleDeserializer ): IrModuleDeserializer = - if (isBuiltInModule(moduleDescriptor)) IrModuleDeserializerWithBuiltIns(builtIns as IrBuiltInsOverDescriptors, moduleDeserializer) + if (isBuiltInModule(moduleDescriptor)) IrModuleDeserializerWithBuiltIns(builtIns, moduleDeserializer) else moduleDeserializer fun deserializeIrModuleHeader(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?, moduleName: String): IrModuleFragment {