IR: implemented generic knownBuiltIns property

This commit is contained in:
Ilya Chernikov
2021-07-12 15:16:35 +02:00
committed by TeamCityServer
parent a7d494480c
commit 808f5148f3
6 changed files with 24 additions and 46 deletions
@@ -59,7 +59,7 @@ class IrBuiltInsOverFir(
private val kotlinCollectionsPackage = StandardNames.COLLECTIONS_PACKAGE_FQ_NAME 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) private val kotlinIrPackage = createPackage(kotlinPackage)
override val booleanNotSymbol: IrSimpleFunctionSymbol by lazy { override val booleanNotSymbol: IrSimpleFunctionSymbol by lazy {
@@ -360,7 +360,7 @@ class IrBuiltInsOverFir(
override lateinit var greaterFunByOperandType: Map<IrClassifierSymbol, IrSimpleFunctionSymbol> private set override lateinit var greaterFunByOperandType: Map<IrClassifierSymbol, IrSimpleFunctionSymbol> private set
init { init {
with(internalIrPackage) { with(this.operatorsPackageFragment) {
fun addBuiltinOperatorSymbol( fun addBuiltinOperatorSymbol(
name: String, name: String,
@@ -690,7 +690,7 @@ class IrBuiltInsOverFir(
?: referenceClassByFqname(lhsClassFqName)?.owner ?: referenceClassByFqname(lhsClassFqName)?.owner
} }
private fun createPackage(fqName: FqName): IrPackageFragment = private fun createPackage(fqName: FqName): IrExternalPackageFragment =
IrExternalPackageFragmentImpl.createEmptyExternalPackageFragment(moduleDescriptor, fqName) IrExternalPackageFragmentImpl.createEmptyExternalPackageFragment(moduleDescriptor, fqName)
private fun IrDeclarationParent.createClass( private fun IrDeclarationParent.createClass(
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.builtins.UnsignedType
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl 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.declarations.IrFactory
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
@@ -170,6 +171,8 @@ abstract class IrBuiltIns {
abstract val getProgressionLastElementByReturnType: Map<IrClassifierSymbol?, IrSimpleFunctionSymbol> abstract val getProgressionLastElementByReturnType: Map<IrClassifierSymbol?, IrSimpleFunctionSymbol>
abstract val operatorsPackageFragment: IrExternalPackageFragment
companion object { companion object {
val KOTLIN_INTERNAL_IR_FQN = FqName("kotlin.internal.ir") val KOTLIN_INTERNAL_IR_FQN = FqName("kotlin.internal.ir")
val BUILTIN_OPERATOR = object : IrDeclarationOriginImpl("OPERATOR") {} val BUILTIN_OPERATOR = object : IrDeclarationOriginImpl("OPERATOR") {}
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrClass 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.IrFactory
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
@@ -74,7 +75,7 @@ class IrBuiltInsOverDescriptors(
private val builtInsModule = builtIns.builtInsModule private val builtInsModule = builtIns.builtInsModule
private val packageFragmentDescriptor = IrBuiltinsPackageFragmentDescriptorImpl(builtInsModule, KOTLIN_INTERNAL_IR_FQN) private val packageFragmentDescriptor = IrBuiltinsPackageFragmentDescriptorImpl(builtInsModule, KOTLIN_INTERNAL_IR_FQN)
val packageFragment = override val operatorsPackageFragment: IrExternalPackageFragment =
IrExternalPackageFragmentImpl(symbolTable.referenceExternalPackageFragment(packageFragmentDescriptor), KOTLIN_INTERNAL_IR_FQN) IrExternalPackageFragmentImpl(symbolTable.referenceExternalPackageFragment(packageFragmentDescriptor), KOTLIN_INTERNAL_IR_FQN)
private fun ClassDescriptor.toIrSymbol() = symbolTable.referenceClass(this) private fun ClassDescriptor.toIrSymbol() = symbolTable.referenceClass(this)
@@ -98,8 +99,8 @@ class IrBuiltInsOverDescriptors(
returnType, isInline = false, isExternal = false, isTailrec = false, isSuspend = false, returnType, isInline = false, isExternal = false, isTailrec = false, isSuspend = false,
isOperator = false, isInfix = false, isExpect = false, isFakeOverride = false isOperator = false, isInfix = false, isExpect = false, isFakeOverride = false
) )
operator.parent = packageFragment operator.parent = operatorsPackageFragment
packageFragment.declarations += operator operatorsPackageFragment.declarations += operator
operator.valueParameters = valueParameterTypes.withIndex().map { (i, valueParameterType) -> operator.valueParameters = valueParameterTypes.withIndex().map { (i, valueParameterType) ->
val valueParameterDescriptor = operatorDescriptor.valueParameters[i] val valueParameterDescriptor = operatorDescriptor.valueParameters[i]
@@ -185,8 +186,8 @@ class IrBuiltInsOverDescriptors(
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isInfix = false, isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false, isInfix = false,
isExpect = false, isFakeOverride = false isExpect = false, isFakeOverride = false
) )
operator.parent = packageFragment operator.parent = operatorsPackageFragment
packageFragment.declarations += operator operatorsPackageFragment.declarations += operator
val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor) val valueParameterSymbol = IrValueParameterSymbolImpl(valueParameterDescriptor)
val valueParameter = irFactory.createValueParameter( val valueParameter = irFactory.createValueParameter(
@@ -6,20 +6,13 @@
package org.jetbrains.kotlin.backend.common.serialization package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer 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.backend.common.serialization.signature.PublicIdSignatureComputer
import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner import org.jetbrains.kotlin.ir.declarations.IrSymbolOwner
import org.jetbrains.kotlin.ir.descriptors.IrBuiltInsOverDescriptors 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.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
interface IdSignatureClashTracker { interface IdSignatureClashTracker {
@@ -105,5 +98,5 @@ open class DeclarationTable(globalTable: GlobalDeclarationTable) {
} }
// This is what we pre-populate tables with // This is what we pre-populate tables with
val IrBuiltInsOverDescriptors.knownBuiltins: List<IrDeclaration> val IrBuiltIns.knownBuiltins: List<IrDeclaration>
get() = packageFragment.declarations get() = operatorsPackageFragment.declarations
@@ -6,12 +6,10 @@
package org.jetbrains.kotlin.backend.common.serialization package org.jetbrains.kotlin.backend.common.serialization
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData 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.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.library.IrLibrary 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` // Used to resolve built in symbols like `kotlin.ir.internal.*` or `kotlin.FunctionN`
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
class IrModuleDeserializerWithBuiltIns( class IrModuleDeserializerWithBuiltIns(
private val builtIns: IrBuiltInsOverDescriptors, private val builtIns: IrBuiltIns,
private val delegate: IrModuleDeserializer private val delegate: IrModuleDeserializer
) : IrModuleDeserializer(delegate.moduleDescriptor, delegate.libraryAbiVersion) { ) : IrModuleDeserializer(delegate.moduleDescriptor, delegate.libraryAbiVersion) {
@@ -136,16 +134,16 @@ class IrModuleDeserializerWithBuiltIns(
delegate.deserializeReachableDeclarations() delegate.deserializeReachableDeclarations()
} }
private fun computeFunctionDescriptor(className: String): FunctionClassDescriptor { private fun computeFunctionClass(className: String): IrClass {
val isK = className[0] == 'K' val isK = className[0] == 'K'
val isSuspend = (if (isK) className[1] else className[0]) == 'S' val isSuspend = (if (isK) className[1] else className[0]) == 'S'
val arity = className.run { substring(indexOfFirst { it.isDigit() }).toInt(10) } val arity = className.run { substring(indexOfFirst { it.isDigit() }).toInt(10) }
return builtIns.builtIns.run { return builtIns.run {
when { when {
isK && isSuspend -> kSuspendFunctionClassDescriptor(arity) isK && isSuspend -> kSuspendFunctionN(arity)
isK -> kFunctionClassDescriptor(arity) isK -> kFunctionN(arity)
isSuspend -> suspendFunctionClassDescriptor(arity) isSuspend -> suspendFunctionN(arity)
else -> functionClassDescriptor(arity) else -> functionN(arity)
} }
} }
} }
@@ -156,23 +154,7 @@ class IrModuleDeserializerWithBuiltIns(
val fqnParts = publicSig.nameSegments val fqnParts = publicSig.nameSegments
val className = fqnParts.firstOrNull() ?: error("Expected class name for $idSig") val className = fqnParts.firstOrNull() ?: error("Expected class name for $idSig")
val functionDescriptor = computeFunctionDescriptor(className) val functionClass = computeFunctionClass(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) }
}
}
return when (fqnParts.size) { return when (fqnParts.size) {
1 -> functionClass.symbol.also { assert(symbolKind == BinarySymbolData.SymbolKind.CLASS_SYMBOL) } 1 -> functionClass.symbol.also { assert(symbolKind == BinarySymbolData.SymbolKind.CLASS_SYMBOL) }
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.builders.TranslationPluginContext
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment 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.IrDeserializer
import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException import org.jetbrains.kotlin.ir.linkage.KotlinIrLinkerInternalException
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
@@ -314,7 +313,7 @@ abstract class KotlinIrLinker(
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
moduleDeserializer: IrModuleDeserializer moduleDeserializer: IrModuleDeserializer
): IrModuleDeserializer = ): IrModuleDeserializer =
if (isBuiltInModule(moduleDescriptor)) IrModuleDeserializerWithBuiltIns(builtIns as IrBuiltInsOverDescriptors, moduleDeserializer) if (isBuiltInModule(moduleDescriptor)) IrModuleDeserializerWithBuiltIns(builtIns, moduleDeserializer)
else moduleDeserializer else moduleDeserializer
fun deserializeIrModuleHeader(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?, moduleName: String): IrModuleFragment { fun deserializeIrModuleHeader(moduleDescriptor: ModuleDescriptor, kotlinLibrary: KotlinLibrary?, moduleName: String): IrModuleFragment {