diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt index 5c0f8233dbe..da2a3f54854 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileSerializer.kt @@ -125,7 +125,6 @@ open class IrFileSerializer( private val skipExpects: Boolean = false, // required for JS IC caches private val skipMutableState: Boolean = false, - private val allowNullTypes: Boolean = false, private val allowErrorStatementOrigins: Boolean = false, // TODO: support InlinerExpressionLocationHint private val addDebugInfo: Boolean = true ) { @@ -495,7 +494,7 @@ open class IrFileSerializer( type = (this as? IrTypeProjection)?.type?.toIrTypeKey ) - fun serializeIrType(type: IrType?) = if (type == null) -1 else protoTypeMap.getOrPut(type.toIrTypeKey) { + fun serializeIrType(type: IrType) = protoTypeMap.getOrPut(type.toIrTypeKey) { protoTypeArray.add(serializeIrTypeData(type)) protoTypeArray.size - 1 } @@ -594,9 +593,9 @@ open class IrFileSerializer( } for (index in 0 until call.typeArgumentsCount) { - val typeArgument = call.getTypeArgument(index) - if (typeArgument == null && !allowNullTypes) error("Expected type argument at $index in ${call.render()}") - proto.addTypeArgument(serializeIrType(typeArgument)) + // See `ForbidUsingExtensionPropertyTypeParameterInDelegate` language feature + val typeArgumentIndex = call.getTypeArgument(index)?.let { serializeIrType(it) } ?: -1 + proto.addTypeArgument(typeArgumentIndex) } for (index in 0 until call.valueArgumentsCount) { diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt index ccb8cb826b6..0dffb6c70a8 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcFileDeserializer.kt @@ -24,11 +24,12 @@ import org.jetbrains.kotlin.library.impl.DeclarationIrTableMemoryReader import org.jetbrains.kotlin.library.impl.IrArrayMemoryReader import org.jetbrains.kotlin.library.impl.IrLongArrayMemoryReader import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite +import org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclaration as ProtoIrDeclaration import org.jetbrains.kotlin.backend.common.serialization.proto.IrFile as ProtoIrFile class IcFileDeserializer( val linker: JsIrLinker, - file: IrFile, + private val file: IrFile, originalFileReader: IrLibraryFile, fileProto: org.jetbrains.kotlin.backend.common.serialization.proto.IrFile, deserializeBodies: Boolean, @@ -42,6 +43,7 @@ class IcFileDeserializer( val enqueue: IdSignature.(IcFileDeserializer) -> Unit, ) { + private val deserializedSymbols = mutableMapOf() val originalSymbolDeserializer = IrSymbolDeserializer( linker.symbolTable, @@ -56,7 +58,8 @@ class IcFileDeserializer( }, linker::handleExpectActualMapping, enqueueAllDeclarations = true, - deserializePublicSymbol = ::deserializeOriginalPublicSymbol, + deserializedSymbols = deserializedSymbols, + deserializePublicSymbol = ::deserializeOriginalPublicSymbol ) private val originalDeclarationDeserializer = IrDeclarationDeserializer( @@ -71,7 +74,6 @@ class IcFileDeserializer( originalSymbolDeserializer, linker.fakeOverrideBuilder.platformSpecificClassFilter, linker.fakeOverrideBuilder, - allowRedeclaration = true, compatibilityMode = CompatibilityMode.CURRENT ) @@ -105,7 +107,8 @@ class IcFileDeserializer( } } - val originalFileDeserializer = IrFileDeserializer(file, originalFileReader, fileProto, originalSymbolDeserializer, originalDeclarationDeserializer) + val originalFileDeserializer = + IrFileDeserializer(file, originalFileReader, fileProto, originalSymbolDeserializer, originalDeclarationDeserializer) val originalVisited = HashSet() @@ -149,7 +152,7 @@ class IcFileDeserializer( { idSig -> idSig.enqueue(this) }, { _, s -> s }, enqueueAllDeclarations = true, - deserializedSymbols = originalFileDeserializer.symbolDeserializer.deserializedSymbols, + deserializedSymbols = deserializedSymbols, ::deserializePublicSymbol ) @@ -173,11 +176,17 @@ class IcFileDeserializer( allowErrorLoopIndices = true, ) - private val protoFile: ProtoIrFile by lazy { ProtoIrFile.parseFrom(icFileData.file.fileData.codedInputStream, ExtensionRegistryLite.newInstance()) } + private val protoFile: ProtoIrFile by lazy { + ProtoIrFile.parseFrom(icFileData.file.fileData.codedInputStream, ExtensionRegistryLite.newInstance()) + } - private val carrierDeserializer by lazy { CarrierDeserializer(declarationDeserializer, icFileData.carriers) } + private val carrierDeserializer by lazy { + CarrierDeserializer(declarationDeserializer, icFileData.carriers) + } - val reversedSignatureIndex: Map = protoFile.declarationIdList.map { symbolDeserializer.deserializeIdSignature(it) to it }.toMap() + val reversedSignatureIndex: Map = protoFile.declarationIdList.map { + symbolDeserializer.deserializeIdSignature(it) to it + }.toMap() val visited = HashSet() @@ -211,17 +220,13 @@ class IcFileDeserializer( } - private fun deserializePublicSymbol(idSig: IdSignature, kind: BinarySymbolData.SymbolKind) : IrSymbol { + private fun deserializePublicSymbol(idSig: IdSignature, kind: BinarySymbolData.SymbolKind): IrSymbol { // TODO: reference lowered declarations cross-module - if (kind == BinarySymbolData.SymbolKind.FILE_SYMBOL) return (idSig as IdSignature.FileSignature).fileSymbol + if (kind == BinarySymbolData.SymbolKind.FILE_SYMBOL) return file.symbol val topLevelSig = idSig.topLevelSignature() val actualModuleDeserializer = - moduleDeserializer.findModuleDeserializerForTopLevelId(topLevelSig) ?: - handleNoModuleDeserializerFound( - idSig, - moduleDeserializer.moduleDescriptor, - moduleDeserializer.moduleDependencies - ) + moduleDeserializer.findModuleDeserializerForTopLevelId(topLevelSig) + ?: handleNoModuleDeserializerFound(idSig, moduleDeserializer.moduleDescriptor, moduleDeserializer.moduleDependencies) return actualModuleDeserializer.deserializeIrSymbol(idSig, kind) } @@ -231,13 +236,13 @@ class IcFileDeserializer( val idSigIndex = reversedSignatureIndex[idSig] ?: return null val declarationStream = icFileReader.irDeclaration(idSigIndex).codedInputStream - val declarationProto = org.jetbrains.kotlin.backend.common.serialization.proto.IrDeclaration.parseFrom(declarationStream, ExtensionRegistryLite.newInstance()) + val declarationProto = ProtoIrDeclaration.parseFrom(declarationStream, ExtensionRegistryLite.newInstance()) return declarationDeserializer.deserializeDeclaration(declarationProto) } // Return declaration iff it was already deserialized private fun cachedDeclaration(idSig: IdSignature): IrDeclaration? { - val symbol = symbolDeserializer.deserializedSymbols[idSig] // Same map is used for both symbol deserializers + val symbol = deserializedSymbols[idSig] // Same map is used for both symbol deserializers if (symbol != null && symbol.isBound) return symbol.owner as? IrDeclaration @@ -245,8 +250,6 @@ class IcFileDeserializer( } fun deserializeAnyDeclaration(idSig: IdSignature): IrDeclaration? { - if (idSig is IdSignature.FileSignature) return null // TODO: is it needed - cachedDeclaration(idSig)?.let { return it } // TODO fast path? @@ -266,7 +269,7 @@ class IcFileDeserializer( return null } - fun deserializeIrSymbol(code: Long): IrSymbol { + private fun deserializeIrSymbol(code: Long): IrSymbol { return symbolDeserializer.deserializeIrSymbol(code) } diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt index 76fa2359989..8d909ccf21b 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcModuleDeserializer.kt @@ -95,8 +95,7 @@ class IcModuleDeserializer( override fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol { assert(idSig.isPubliclyVisible) - if (idSig in icModuleReversedFileIndex) { - val icDeserializer = icModuleReversedFileIndex[idSig]!! + icModuleReversedFileIndex[idSig]?.let { icDeserializer -> return icDeserializer.deserializeIrSymbol(idSig, symbolKind) } diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcSerializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcSerializer.kt index 819d7b03a70..76184927ad0 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcSerializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IcSerializer.kt @@ -85,7 +85,6 @@ class IcSerializer( mutableMapOf(), skipExpects = true, icMode = true, - allowNullTypes = true, allowErrorStatementOrigins = true, compatibilityMode = CompatibilityMode.CURRENT ) @@ -104,10 +103,7 @@ class IcSerializer( d is PersistentIrDeclarationBase<*> && (d.createdOn > 0 || /*d.isFakeOverride ||*/ (d is IrValueParameter || d is IrTypeParameter) && (d.parent as IrDeclaration).isFakeOverride) } - val serializedCarriers = fileSerializer.serializeCarriers( - fileDeclarations, - bodies, - ) { declaration -> + val serializedCarriers = fileSerializer.serializeCarriers(fileDeclarations, bodies) { declaration -> icDeclarationTable.signatureByDeclaration(declaration, compatibleMode = false) } diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrFileSerializer.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrFileSerializer.kt index 07cbf934cab..ca8250a0129 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrFileSerializer.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/JsIrFileSerializer.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer -import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.hasAnnotation @@ -24,7 +23,6 @@ class JsIrFileSerializer( skipExpects: Boolean, bodiesOnlyForInlines: Boolean = false, icMode: Boolean = false, - allowNullTypes: Boolean = false, allowErrorStatementOrigins: Boolean = false, ) : IrFileSerializer( messageLogger, @@ -34,7 +32,6 @@ class JsIrFileSerializer( bodiesOnlyForInlines = bodiesOnlyForInlines, skipExpects = skipExpects, skipMutableState = icMode, - allowNullTypes = allowNullTypes, allowErrorStatementOrigins = allowErrorStatementOrigins, ) { companion object {