IR: implemented generic knownBuiltIns property
This commit is contained in:
committed by
TeamCityServer
parent
a7d494480c
commit
808f5148f3
+2
-9
@@ -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<IrDeclaration>
|
||||
get() = packageFragment.declarations
|
||||
val IrBuiltIns.knownBuiltins: List<IrDeclaration>
|
||||
get() = operatorsPackageFragment.declarations
|
||||
|
||||
+9
-27
@@ -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) }
|
||||
|
||||
+1
-2
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user