diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt index cef61b79c44..2d994519398 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataIncrementalSerializer.kt @@ -23,8 +23,9 @@ import org.jetbrains.kotlin.serialization.DescriptorSerializer class KlibMetadataIncrementalSerializer( languageVersionSettings: LanguageVersionSettings, metadataVersion: BinaryVersion, - skipExpects: Boolean -) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, skipExpects) { + skipExpects: Boolean, + allowErrorTypes: Boolean = false +) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, skipExpects, allowErrorTypes = allowErrorTypes) { fun serializePackageFragment( module: ModuleDescriptor, diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt index c59863f4d84..969327b6a97 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataMonolithicSerializer.kt @@ -23,8 +23,9 @@ class KlibMetadataMonolithicSerializer( languageVersionSettings: LanguageVersionSettings, metadataVersion: BinaryVersion, skipExpects: Boolean, - includeOnlyModuleContent: Boolean = false -) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, skipExpects, includeOnlyModuleContent) { + includeOnlyModuleContent: Boolean = false, + allowErrorTypes: Boolean = false +) : KlibMetadataSerializer(languageVersionSettings, metadataVersion, skipExpects, includeOnlyModuleContent, allowErrorTypes) { private fun serializePackageFragment(fqName: FqName, module: ModuleDescriptor): List { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt index b67c21f1b7a..2b6845c7ab1 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializer.kt @@ -32,7 +32,8 @@ abstract class KlibMetadataSerializer( val languageVersionSettings: LanguageVersionSettings, val metadataVersion: BinaryVersion, val skipExpects: Boolean = false, - val includeOnlyModuleContent: Boolean = false + val includeOnlyModuleContent: Boolean = false, + private val allowErrorTypes: Boolean ) { lateinit var serializerContext: SerializerContext @@ -48,7 +49,8 @@ abstract class KlibMetadataSerializer( val extension = KlibMetadataSerializerExtension( languageVersionSettings, metadataVersion, - KlibMetadataStringTable() + KlibMetadataStringTable(), + allowErrorTypes ) return SerializerContext( extension, diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt index 2d0bc9534ff..80e6dc60c12 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/metadata/KlibMetadataSerializerExtension.kt @@ -17,11 +17,13 @@ import org.jetbrains.kotlin.serialization.DescriptorSerializer import org.jetbrains.kotlin.serialization.KotlinSerializerExtensionBase import org.jetbrains.kotlin.serialization.StringTableImpl import org.jetbrains.kotlin.types.FlexibleType +import org.jetbrains.kotlin.types.KotlinType class KlibMetadataSerializerExtension( private val languageVersionSettings: LanguageVersionSettings, override val metadataVersion: BinaryVersion, - override val stringTable: StringTableImpl + override val stringTable: StringTableImpl, + private val allowErrorTypes: Boolean ) : KotlinSerializerExtensionBase(KlibMetadataSerializerProtocol) { override fun shouldUseTypeTable(): Boolean = true @@ -34,6 +36,10 @@ class KlibMetadataSerializerExtension( lowerProto.flexibleTypeCapabilitiesId = stringTable.getStringIndex(DynamicTypeDeserializer.id) } + override fun serializeErrorType(type: KotlinType, builder: ProtoBuf.Type.Builder) { + if (!allowErrorTypes) super.serializeErrorType(type, builder) + } + override fun serializeClass( descriptor: ClassDescriptor, proto: ProtoBuf.Class.Builder, diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index b405154c8f6..391ca0ea887 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -418,7 +418,7 @@ private class ModulesStructure( val analysisResult = analyzer.analysisResult if (IncrementalCompilation.isEnabledForJs()) { /** can throw [IncrementalNextRoundException] */ - compareMetadataAndGoToNextICRoundIfNeeded(analysisResult, compilerConfiguration, files) + compareMetadataAndGoToNextICRoundIfNeeded(analysisResult, compilerConfiguration, files, errorPolicy.allowErrors) } var hasErrors = false @@ -497,7 +497,7 @@ fun serializeModuleIntoKlib( ).serializedIrModule(moduleFragment) val moduleDescriptor = moduleFragment.descriptor - val metadataSerializer = KlibMetadataIncrementalSerializer(configuration) + val metadataSerializer = KlibMetadataIncrementalSerializer(configuration, containsErrorCode) val incrementalResultsConsumer = configuration.get(JSConfigurationKeys.INCREMENTAL_RESULTS_CONSUMER) val empty = ByteArray(0) @@ -587,11 +587,12 @@ private fun KlibMetadataIncrementalSerializer.serializeScope( private fun compareMetadataAndGoToNextICRoundIfNeeded( analysisResult: AnalysisResult, config: CompilerConfiguration, - files: List + files: List, + allowErrors: Boolean ) { val nextRoundChecker = config.get(JSConfigurationKeys.INCREMENTAL_NEXT_ROUND_CHECKER) ?: return val bindingContext = analysisResult.bindingContext - val serializer = KlibMetadataIncrementalSerializer(config) + val serializer = KlibMetadataIncrementalSerializer(config, allowErrors) for (ktFile in files) { val packageFragment = serializer.serializeScope(ktFile, bindingContext, analysisResult.moduleDescriptor) // to minimize a number of IC rounds, we should inspect all proto for changes first, @@ -602,8 +603,9 @@ private fun compareMetadataAndGoToNextICRoundIfNeeded( if (nextRoundChecker.shouldGoToNextRound()) throw IncrementalNextRoundException() } -private fun KlibMetadataIncrementalSerializer(configuration: CompilerConfiguration) = KlibMetadataIncrementalSerializer( +private fun KlibMetadataIncrementalSerializer(configuration: CompilerConfiguration, allowErrors: Boolean) = KlibMetadataIncrementalSerializer( languageVersionSettings = configuration.languageVersionSettings, metadataVersion = configuration.metadataVersion, - skipExpects = !configuration.expectActualLinker + skipExpects = !configuration.expectActualLinker, + allowErrorTypes = allowErrors )