IR: implemented generic knownBuiltIns property
This commit is contained in:
committed by
TeamCityServer
parent
a7d494480c
commit
808f5148f3
@@ -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") {}
|
||||||
|
|||||||
+6
-5
@@ -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(
|
||||||
|
|||||||
+2
-9
@@ -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
|
||||||
|
|||||||
+9
-27
@@ -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) }
|
||||||
|
|||||||
+1
-2
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user