[IR] Drastically simplify the hierarchy of IR origins

IrStatementOriginImpl and IrDeclarationOriginImpl were made final
classes to simplify the creation of them (a delegate provider was
added) and to optimize performance when comparing the origins by type
and name
This commit is contained in:
Iaroslav Postovalov
2023-08-22 11:50:33 +02:00
committed by Space Team
parent f2ddae533e
commit a3b55cf758
67 changed files with 438 additions and 380 deletions
@@ -100,7 +100,7 @@ internal class PartialLinkageSupportForLoweringsImpl(
startOffset
}
else -> if (origin is PartiallyLinkedDeclarationOrigin) {
else -> if (origin in PartiallyLinkedDeclarationOrigin.entries) {
// There is no sense to take coordinates from the declaration that does not exist in the code.
// Let's take the coordinates of the parent.
parent.startOffsetOfFirstDenotableIrElement()
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.PARTIAL_LINKAGE_RUNTIME_ERROR
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin.Companion.PARTIAL_LINKAGE_RUNTIME_ERROR
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
import org.jetbrains.kotlin.ir.linkage.partial.*
import org.jetbrains.kotlin.ir.linkage.partial.PartialLinkageCase.*
@@ -457,7 +457,7 @@ internal class PartiallyLinkedIrTreePatcher(
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
// Optimization: Don't patch expressions under generated synthetic declarations.
return if (declaration.origin is PartiallyLinkedDeclarationOrigin)
return if (declaration.origin in PartiallyLinkedDeclarationOrigin.entries)
declaration // There are neither expressions nor annotations to patch.
else {
declaration.filterUnusableAnnotations()
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.impl.*
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.utils.memoryOptimizedMap
import kotlin.reflect.full.declaredMemberProperties
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBlock as ProtoBlock
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBlockBody as ProtoBlockBody
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBranch as ProtoBranch
@@ -857,11 +858,10 @@ class IrBodyDeserializer(
code: () -> Long
): S? = if (condition) deserializeTypedSymbol(code(), fallbackSymbolKind, remap = true) else null
companion object {
private val allKnownStatementOrigins = IrStatementOrigin::class.nestedClasses.toList()
private val statementOriginIndex =
allKnownStatementOrigins.mapNotNull { it.objectInstance as? IrStatementOriginImpl }.associateBy { it.debugName }
private companion object {
private val statementOriginIndex = IrStatementOrigin.Companion::class
.declaredMemberProperties
.mapNotNull { it.get(IrStatementOrigin.Companion) as? IrStatementOrigin }
.associateBy { it.debugName }
}
}
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.*
import kotlin.collections.set
import kotlin.reflect.full.declaredMemberProperties
import org.jetbrains.kotlin.backend.common.serialization.proto.IrAnonymousInit as ProtoAnonymousInit
import org.jetbrains.kotlin.backend.common.serialization.proto.IrClass as ProtoClass
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructor as ProtoConstructor
@@ -252,7 +253,7 @@ class IrDeclarationDeserializer(
private inline fun <T> withDeserializedIrDeclarationBase(
proto: ProtoDeclarationBase,
setParent: Boolean = true,
block: (IrSymbol, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T
block: (IrSymbol, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T,
): T where T : IrDeclaration, T : IrSymbolOwner {
val (s, uid) = symbolDeserializer.deserializeIrSymbolToDeclare(proto.symbol)
val coordinates = BinaryCoordinates.decode(proto.coordinates)
@@ -556,7 +557,7 @@ class IrDeclarationDeserializer(
proto: ProtoFunctionBase,
setParent: Boolean = true,
fallbackSymbolKind: SymbolKind,
block: (S, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T
block: (S, IdSignature, Int, Int, IrDeclarationOrigin, Long) -> T,
): T = withDeserializedIrDeclarationBase(proto.base, setParent) { symbol, idSig, startOffset, endOffset, origin, fcode ->
val functionSymbol: S = symbol.checkSymbolType(fallbackSymbolKind)
symbolTable.withScope(functionSymbol) {
@@ -621,7 +622,8 @@ class IrDeclarationDeserializer(
isFakeOverride = flags.isFakeOverride,
)
}.apply {
overriddenSymbols = proto.overriddenList.memoryOptimizedMap { deserializeIrSymbolAndRemap(it).checkSymbolType(FUNCTION_SYMBOL) }
overriddenSymbols =
proto.overriddenList.memoryOptimizedMap { deserializeIrSymbolAndRemap(it).checkSymbolType(FUNCTION_SYMBOL) }
}
}
@@ -726,7 +728,7 @@ class IrDeclarationDeserializer(
private fun deserializeIrLocalDelegatedProperty(
proto: ProtoLocalDelegatedProperty,
setParent: Boolean = true
setParent: Boolean = true,
): IrLocalDelegatedProperty =
withDeserializedIrDeclarationBase(proto.base, setParent) { symbol, _, startOffset, endOffset, origin, fcode ->
val flags = LocalVariableFlags.decode(fcode)
@@ -794,17 +796,20 @@ class IrDeclarationDeserializer(
}
}
companion object {
private val allKnownDeclarationOrigins = IrDeclarationOrigin::class.nestedClasses.toList()
private val declarationOriginIndex =
allKnownDeclarationOrigins.mapNotNull { it.objectInstance as? IrDeclarationOriginImpl }.associateBy { it.name }
private companion object {
private val declarationOriginIndex by lazy {
IrDeclarationOrigin.Companion::class
.declaredMemberProperties
.mapNotNull { it.get(IrDeclarationOrigin.Companion) as? IrDeclarationOriginImpl }
.associateBy { it.name }
}
}
private fun deserializeIrDeclarationOrigin(protoName: Int): IrDeclarationOrigin {
val originName = libraryFile.string(protoName)
return IrDeclarationOrigin.GeneratedByPlugin.fromSerializedString(originName)
?: declarationOriginIndex[originName]
?: object : IrDeclarationOriginImpl(originName) {}
?: IrDeclarationOriginImpl(originName)
}
fun deserializeDeclaration(proto: ProtoDeclaration, setParent: Boolean = true): IrDeclaration {
@@ -92,7 +92,7 @@ class FileDeserializationState(
linker.fakeOverrideBuilder,
compatibilityMode = moduleDeserializer.compatibilityMode,
linker.partialLinkageSupport.isEnabled,
internationService = linker.internationService
internationService = linker.internationService,
)
val fileDeserializer = IrFileDeserializer(file, fileReader, fileProto, symbolDeserializer, declarationDeserializer)
@@ -183,7 +183,7 @@ open class IrFileSerializer(
private fun serializeIrDeclarationOrigin(origin: IrDeclarationOrigin): Int = serializeString(origin.name)
private fun serializeIrStatementOrigin(origin: IrStatementOrigin): Int =
serializeString((origin as? IrStatementOriginImpl)?.debugName ?: error("Unable to serialize origin ${origin.javaClass.name}"))
serializeString(origin.debugName)
private fun serializeCoordinates(start: Int, end: Int): Long = if (skipPrivateApi) {
0L