diff --git a/build-common/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProviderFromCache.kt b/build-common/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProviderFromCache.kt index f28670c9062..e5e297976dd 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProviderFromCache.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProviderFromCache.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.incremental.js import org.jetbrains.kotlin.incremental.IncrementalJsCache +import org.jetbrains.kotlin.utils.JsMetadataVersion import java.io.File class IncrementalDataProviderFromCache(private val cache: IncrementalJsCache) : IncrementalDataProvider { @@ -14,4 +15,7 @@ class IncrementalDataProviderFromCache(private val cache: IncrementalJsCache) : override val compiledPackageParts: Map get() = cache.nonDirtyPackageParts() -} \ No newline at end of file + + override val metadataVersion: IntArray + get() = JsMetadataVersion.INSTANCE.toArray() // TODO: store and load correct metadata version +} diff --git a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt index fb3ee0d1c92..099055aeb62 100644 --- a/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt +++ b/compiler/daemon/daemon-client/src/org/jetbrains/kotlin/daemon/client/CompilerCallbackServicesFacadeServer.kt @@ -135,6 +135,8 @@ open class CompilerCallbackServicesFacadeServer( override fun incrementalDataProvider_getHeaderMetadata(): ByteArray = incrementalDataProvider!!.headerMetadata + override fun incrementalDataProvider_getMetadataVersion(): IntArray = incrementalDataProvider!!.metadataVersion + override fun incrementalDataProvider_getCompiledPackageParts() = incrementalDataProvider!!.compiledPackageParts.entries.map { CompiledPackagePart(it.key.path, it.value.metadata, it.value.binaryAst) diff --git a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt index 81376445a23..b11da77a901 100644 --- a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt +++ b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilerCallbackServicesFacade.kt @@ -119,6 +119,9 @@ interface CompilerCallbackServicesFacade : Remote { @Throws(RemoteException::class) fun incrementalDataProvider_getCompiledPackageParts(): Collection + + @Throws(RemoteException::class) + fun incrementalDataProvider_getMetadataVersion(): IntArray } class CompiledPackagePart( diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalDataProvider.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalDataProvider.kt index 0bef6de0a20..df3992ab228 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalDataProvider.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteIncrementalDataProvider.kt @@ -27,4 +27,9 @@ class RemoteIncrementalDataProvider(val facade: CompilerCallbackServicesFacade, } result } + + override val metadataVersion: IntArray + get() = rpcProfiler.withMeasure(this) { + facade.incrementalDataProvider_getMetadataVersion() + } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt index 4f19bc5e4b7..ee561122316 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache +import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.name.ClassId @@ -88,12 +89,16 @@ class IncrementalPackageFragmentProvider( val jvmBinaryClass = kotlinClassFinder.findKotlinClass(ClassId.topLevel(partName.fqNameForTopLevelClassMaybeWithDollars)) + val metadataVersion = + jvmBinaryClass?.classHeader?.metadataVersion + ?: JvmMetadataVersion.INSTANCE + DeserializedPackageMemberScope( - this, packageProto, nameResolver, - JvmPackagePartSource( + this, packageProto, nameResolver, metadataVersion, + JvmPackagePartSource( partName, facadeName, packageProto, nameResolver, knownJvmBinaryClass = jvmBinaryClass ), - deserializationComponents, classNames = { emptyList() } + deserializationComponents, classNames = { emptyList() } ) } } diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt index 84694d7a997..7dc899afe2f 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.TestCaseWithTmpdir import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator +import org.jetbrains.kotlin.utils.JsMetadataVersion import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import org.jetbrains.kotlin.utils.sure import java.io.File @@ -92,12 +93,12 @@ class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() { private fun deserialize(metaFile: File): ModuleDescriptorImpl { val module = KotlinTestUtils.createEmptyModule("<${KotlinTestUtils.TEST_MODULE_NAME}>", JsPlatform.builtIns) - val metadata = KotlinJavascriptMetadataUtils.loadMetadata(metaFile) - assert(metadata.size == 1) + val metadata = KotlinJavascriptMetadataUtils.loadMetadata(metaFile).single() - val (header, packageFragmentProtos) = readModuleAsProto(metadata.single().body) + val (header, packageFragmentProtos) = readModuleAsProto(metadata.body, metadata.version) val provider = createKotlinJavascriptPackageFragmentProvider( - LockBasedStorageManager(), module, header, packageFragmentProtos, DeserializationConfiguration.Default, LookupTracker.DO_NOTHING + LockBasedStorageManager(), module, header, packageFragmentProtos, metadata.version, + DeserializationConfiguration.Default, LookupTracker.DO_NOTHING ).sure { "No package fragment provider was created" } module.initialize(provider) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsPackageFragmentProvider.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsPackageFragmentProvider.kt index c05e47173e8..c3257361f49 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsPackageFragmentProvider.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/JvmBuiltInsPackageFragmentProvider.kt @@ -51,6 +51,6 @@ class JvmBuiltInsPackageFragmentProvider( override fun findPackage(fqName: FqName): DeserializedPackageFragment? = finder.findBuiltInsData(fqName)?.let { inputStream -> - BuiltInsPackageFragmentImpl(fqName, storageManager, moduleDescriptor, inputStream) + BuiltInsPackageFragmentImpl.create(fqName, storageManager, moduleDescriptor, inputStream) } } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt index 9f0841124ca..a64fd8bcb53 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt @@ -53,7 +53,7 @@ class DeserializedDescriptorResolver { JvmProtoBufUtil.readClassDataFrom(data, strings) } ?: return null val source = KotlinJvmBinarySourceElement(kotlinClass, kotlinClass.incompatibility, kotlinClass.isPreReleaseInvisible) - return ClassData(nameResolver, classProto, source) + return ClassData(nameResolver, classProto, kotlinClass.classHeader.metadataVersion, source) } fun createKotlinPackagePartScope(descriptor: PackageFragmentDescriptor, kotlinClass: KotlinJvmBinaryClass): MemberScope? { @@ -65,7 +65,9 @@ class DeserializedDescriptorResolver { val source = JvmPackagePartSource( kotlinClass, packageProto, nameResolver, kotlinClass.incompatibility, kotlinClass.isPreReleaseInvisible ) - return DeserializedPackageMemberScope(descriptor, packageProto, nameResolver, source, components) { + return DeserializedPackageMemberScope( + descriptor, packageProto, nameResolver, kotlinClass.classHeader.metadataVersion, source, components + ) { // All classes are included into Java scope emptyList() } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassData.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassData.kt index a7136766153..15fbb21d687 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassData.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassData.kt @@ -7,10 +7,12 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.NameResolver data class ClassData( val nameResolver: NameResolver, val classProto: ProtoBuf.Class, + val metadataVersion: BinaryVersion, val sourceElement: SourceElement ) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt index 84984c59897..c003fbe0cac 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt @@ -39,7 +39,7 @@ class ClassDeserializer(private val components: DeserializationComponents) { } if (classId in BLACK_LIST) return null - val (nameResolver, classProto, sourceElement) = key.classData + val (nameResolver, classProto, metadataVersion, sourceElement) = key.classData ?: components.classDataFinder.findClassData(classId) ?: return null @@ -60,11 +60,12 @@ class ClassDeserializer(private val components: DeserializationComponents) { fragment, nameResolver, TypeTable(classProto.typeTable), VersionRequirementTable.create(classProto.versionRequirementTable), + metadataVersion, containerSource = null ) } - return DeserializedClassDescriptor(outerContext, classProto, nameResolver, sourceElement) + return DeserializedClassDescriptor(outerContext, classProto, nameResolver, metadataVersion, sourceElement) } private class ClassKey(val classId: ClassId, val classData: ClassData?) { diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt index c8f0c882dcd..bd7018f7463 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.NameResolverImpl import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -31,11 +32,13 @@ abstract class DeserializedPackageFragmentImpl( storageManager: StorageManager, module: ModuleDescriptor, proto: ProtoBuf.PackageFragment, + private val metadataVersion: BinaryVersion, private val containerSource: DeserializedContainerSource? ) : DeserializedPackageFragment(fqName, storageManager, module) { protected val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames) - override val classDataFinder = ProtoBasedClassDataFinder(proto, nameResolver) { containerSource ?: SourceElement.NO_SOURCE } + override val classDataFinder = + ProtoBasedClassDataFinder(proto, nameResolver, metadataVersion) { containerSource ?: SourceElement.NO_SOURCE } // Temporary storage: until `initialize` is called private var _proto: ProtoBuf.PackageFragment? = proto @@ -45,7 +48,7 @@ abstract class DeserializedPackageFragmentImpl( val proto = _proto ?: error("Repeated call to DeserializedPackageFragmentImpl::initialize") _proto = null _memberScope = DeserializedPackageMemberScope( - this, proto.`package`, nameResolver, containerSource, components, + this, proto.`package`, nameResolver, metadataVersion, containerSource, components, classNames = { classDataFinder.allClassIds.filter { classId -> !classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt index d3d6913bc56..3943093da51 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.types.KotlinType class MemberDeserializer(private val c: DeserializationContext) { private val annotationDeserializer = AnnotationDeserializer(c.components.moduleDescriptor, c.components.notFoundClasses) + fun loadProperty(proto: ProtoBuf.Property): PropertyDescriptor { val flags = if (proto.hasFlags()) proto.flags else loadOldFlags(proto.oldFlags) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index b4bd95c2e25..98749f7df18 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -78,11 +78,11 @@ class MetadataPackageFragment( override val classDataFinder = ClassDataFinder { classId -> val topLevelClassId = generateSequence(classId, ClassId::getOuterClassId).last() val stream = finder.findMetadata(topLevelClassId) ?: return@ClassDataFinder null - val (message, nameResolver) = readProto(stream) + val (message, nameResolver, version) = readProto(stream) message.class_List.firstOrNull { classProto -> nameResolver.getClassId(classProto.fqName) == classId }?.let { classProto -> - ClassData(nameResolver, classProto, SourceElement.NO_SOURCE) + ClassData(nameResolver, classProto, version, SourceElement.NO_SOURCE) } } @@ -101,10 +101,11 @@ class MetadataPackageFragment( val scopes = arrayListOf() for (partName in packageParts) { val stream = finder.findMetadata(ClassId(fqName, Name.identifier(partName))) ?: continue - val (proto, nameResolver) = readProto(stream) + val (proto, nameResolver, version) = readProto(stream) scopes.add(DeserializedPackageMemberScope( - this, proto.`package`, nameResolver, containerSource = null, components = components, classNames = { emptyList() } + this, proto.`package`, nameResolver, version, containerSource = null, components = components, + classNames = { emptyList() } )) } @@ -112,6 +113,7 @@ class MetadataPackageFragment( scopes.add(object : DeserializedPackageMemberScope( this, ProtoBuf.Package.getDefaultInstance(), NameResolverImpl(ProtoBuf.StringTable.getDefaultInstance(), ProtoBuf.QualifiedNameTable.getDefaultInstance()), + BuiltInsBinaryVersion.INSTANCE, // Exact version does not matter here containerSource = null, components = components, classNames = { emptyList() } ) { override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) @@ -129,7 +131,7 @@ class MetadataPackageFragment( return true } - private fun readProto(stream: InputStream): Pair { + private fun readProto(stream: InputStream): Triple { val version = BuiltInsBinaryVersion.readFrom(stream) if (!version.isCompatible()) { @@ -143,7 +145,7 @@ class MetadataPackageFragment( val message = ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) val nameResolver = NameResolverImpl(message.strings, message.qualifiedNames) - return Pair(message, nameResolver) + return Triple(message, nameResolver, version) } companion object { diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt index 436857313b7..9d285b51b09 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt @@ -18,12 +18,14 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.name.ClassId class ProtoBasedClassDataFinder( proto: ProtoBuf.PackageFragment, private val nameResolver: NameResolver, + private val metadataVersion: BinaryVersion, private val classSource: (ClassId) -> SourceElement = { SourceElement.NO_SOURCE } ) : ClassDataFinder { private val classIdToProto = @@ -35,6 +37,6 @@ class ProtoBasedClassDataFinder( override fun findClassData(classId: ClassId): ClassData? { val classProto = classIdToProto[classId] ?: return null - return ClassData(nameResolver, classProto, classSource(classId)) + return ClassData(nameResolver, classProto, metadataVersion, classSource(classId)) } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsLoaderImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsLoaderImpl.kt index 4d14b7d1613..e925aa17ec1 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsLoaderImpl.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsLoaderImpl.kt @@ -53,7 +53,7 @@ class BuiltInsLoaderImpl : BuiltInsLoader { val packageFragments = packageFqNames.map { fqName -> val resourcePath = BuiltInSerializerProtocol.getBuiltInsFilePath(fqName) val inputStream = loadResource(resourcePath) ?: throw IllegalStateException("Resource not found in classpath: $resourcePath") - BuiltInsPackageFragmentImpl(fqName, storageManager, module, inputStream) + BuiltInsPackageFragmentImpl.create(fqName, storageManager, module, inputStream) } val provider = PackageFragmentProviderImpl(packageFragments) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsPackageFragmentImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsPackageFragmentImpl.kt index 84cfcb2dfd4..27df31483b7 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsPackageFragmentImpl.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/builtins/BuiltInsPackageFragmentImpl.kt @@ -14,22 +14,40 @@ import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFra import org.jetbrains.kotlin.storage.StorageManager import java.io.InputStream -class BuiltInsPackageFragmentImpl( +class BuiltInsPackageFragmentImpl private constructor( fqName: FqName, storageManager: StorageManager, module: ModuleDescriptor, - inputStream: InputStream -) : BuiltInsPackageFragment, DeserializedPackageFragmentImpl(fqName, storageManager, module, inputStream.use { stream -> - val version = BuiltInsBinaryVersion.readFrom(stream) + proto: ProtoBuf.PackageFragment, + metadataVersion: BuiltInsBinaryVersion +) : BuiltInsPackageFragment, DeserializedPackageFragmentImpl( + fqName, storageManager, module, proto, metadataVersion, containerSource = null +) { + companion object { + fun create( + fqName: FqName, + storageManager: StorageManager, + module: ModuleDescriptor, + inputStream: InputStream + ): BuiltInsPackageFragmentImpl { + lateinit var version: BuiltInsBinaryVersion - if (!version.isCompatible()) { - // TODO: report a proper diagnostic - throw UnsupportedOperationException( - "Kotlin built-in definition format version is not supported: " + - "expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " + - "Please update Kotlin" - ) + val proto = inputStream.use { stream -> + version = BuiltInsBinaryVersion.readFrom(stream) + + if (!version.isCompatible()) { + // TODO: report a proper diagnostic + throw UnsupportedOperationException( + "Kotlin built-in definition format version is not supported: " + + "expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " + + "Please update Kotlin" + ) + } + + ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) + } + + return BuiltInsPackageFragmentImpl(fqName, storageManager, module, proto, version) + } } - - ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) -}, containerSource = null) +} diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt index 831ee0ecb49..85ad3de990f 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.deserialization.ClassDescriptorFactory import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.TypeTable import org.jetbrains.kotlin.metadata.deserialization.VersionRequirementTable @@ -60,10 +61,11 @@ class DeserializationComponents( nameResolver: NameResolver, typeTable: TypeTable, versionRequirementTable: VersionRequirementTable, + metadataVersion: BinaryVersion, containerSource: DeserializedContainerSource? ): DeserializationContext = DeserializationContext( - this, nameResolver, descriptor, typeTable, versionRequirementTable, containerSource, + this, nameResolver, descriptor, typeTable, versionRequirementTable, metadataVersion, containerSource, parentTypeDeserializer = null, typeParameters = listOf() ) } @@ -75,6 +77,7 @@ class DeserializationContext( val containingDeclaration: DeclarationDescriptor, val typeTable: TypeTable, val versionRequirementTable: VersionRequirementTable, + val metadataVersion: BinaryVersion, val containerSource: DeserializedContainerSource?, parentTypeDeserializer: TypeDeserializer?, typeParameters: List @@ -92,9 +95,10 @@ class DeserializationContext( descriptor: DeclarationDescriptor, typeParameterProtos: List, nameResolver: NameResolver = this.nameResolver, - typeTable: TypeTable = this.typeTable + typeTable: TypeTable = this.typeTable, + metadataVersion: BinaryVersion = this.metadataVersion ): DeserializationContext = DeserializationContext( - components, nameResolver, descriptor, typeTable, versionRequirementTable, this.containerSource, + components, nameResolver, descriptor, typeTable, versionRequirementTable, metadataVersion, this.containerSource, parentTypeDeserializer = this.typeDeserializer, typeParameters = typeParameterProtos ) } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 8aa2789b9d3..6de9b1105ef 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -33,6 +33,7 @@ class DeserializedClassDescriptor( outerContext: DeserializationContext, val classProto: ProtoBuf.Class, nameResolver: NameResolver, + val metadataVersion: BinaryVersion, private val sourceElement: SourceElement ) : AbstractClassDescriptor( outerContext.storageManager, @@ -44,7 +45,7 @@ class DeserializedClassDescriptor( private val visibility = ProtoEnumFlags.visibility(Flags.VISIBILITY.get(classProto.flags)) private val kind = ProtoEnumFlags.classKind(Flags.CLASS_KIND.get(classProto.flags)) - val c = outerContext.childContext(this, classProto.typeParameterList, nameResolver, TypeTable(classProto.typeTable)) + val c = outerContext.childContext(this, classProto.typeParameterList, nameResolver, TypeTable(classProto.typeTable), metadataVersion) private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(c.storageManager, this) else MemberScope.Empty private val typeConstructor = DeserializedClassTypeConstructor() diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt index b09e3b21c1d..5fa0bfb02cc 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.incremental.record import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.metadata.deserialization.TypeTable import org.jetbrains.kotlin.metadata.deserialization.VersionRequirementTable @@ -35,13 +36,14 @@ open class DeserializedPackageMemberScope( private val packageDescriptor: PackageFragmentDescriptor, proto: ProtoBuf.Package, nameResolver: NameResolver, + metadataVersion: BinaryVersion, containerSource: DeserializedContainerSource?, components: DeserializationComponents, classNames: () -> Collection ) : DeserializedMemberScope( components.createContext( packageDescriptor, nameResolver, TypeTable(proto.typeTable), - VersionRequirementTable.create(proto.versionRequirementTable), containerSource + VersionRequirementTable.create(proto.versionRequirementTable), metadataVersion, containerSource ), proto.functionList, proto.propertyList, proto.typeAliasList, classNames ) { diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index 1e900de7b2c..32d5948bd8c 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -209,7 +209,10 @@ internal class KClassImpl(override val jClass: Class) : KDeclaration return (descriptor as? DeserializedClassDescriptor)?.let { descriptor -> descriptor.classProto.getExtensionOrNull(JvmProtoBuf.classLocalVariable, index)?.let { proto -> - deserializeToDescriptor(jClass, proto, descriptor.c.nameResolver, descriptor.c.typeTable, MemberDeserializer::loadProperty) + deserializeToDescriptor( + jClass, proto, descriptor.c.nameResolver, descriptor.c.typeTable, descriptor.metadataVersion, + MemberDeserializer::loadProperty + ) } } } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt index 707a02cd482..50147ff7aab 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPackageImpl.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.deserialization.TypeTable import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf +import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmNameResolver import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.name.Name @@ -63,12 +64,13 @@ internal class KPackageImpl( } } - val metadata: Pair? by ReflectProperties.lazy { + val metadata: Triple? by ReflectProperties.lazy { kotlinClass?.classHeader?.let { header -> val data = header.data val strings = header.strings if (data != null && strings != null) { - JvmProtoBufUtil.readPackageDataFrom(data, strings) + val (nameResolver, proto) = JvmProtoBufUtil.readPackageDataFrom(data, strings) + Triple(nameResolver, proto, header.metadataVersion) } else null } } @@ -101,9 +103,12 @@ internal class KPackageImpl( scope.getContributedFunctions(name, NoLookupLocation.FROM_REFLECTION) override fun getLocalProperty(index: Int): PropertyDescriptor? { - return data().metadata?.let { (nameResolver, packageProto) -> + return data().metadata?.let { (nameResolver, packageProto, metadataVersion) -> packageProto.getExtensionOrNull(JvmProtoBuf.packageLocalVariable, index)?.let { proto -> - deserializeToDescriptor(jClass, proto, nameResolver, TypeTable(packageProto.typeTable), MemberDeserializer::loadProperty) + deserializeToDescriptor( + jClass, proto, nameResolver, TypeTable(packageProto.typeTable), metadataVersion, + MemberDeserializer::loadProperty + ) } } } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt index 95f92dca902..77d9eb3f7dc 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/util.kt @@ -24,10 +24,7 @@ import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.metadata.ProtoBuf -import org.jetbrains.kotlin.metadata.deserialization.NameResolver -import org.jetbrains.kotlin.metadata.deserialization.TypeTable -import org.jetbrains.kotlin.metadata.deserialization.VersionRequirementTable -import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull +import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.name.FqName @@ -158,6 +155,7 @@ internal fun deserializeToDescriptor( proto: M, nameResolver: NameResolver, typeTable: TypeTable, + metadataVersion: BinaryVersion, createDescriptor: MemberDeserializer.(M) -> D ): D? { val moduleData = moduleAnchor.getOrCreateModule() @@ -169,7 +167,7 @@ internal fun deserializeToDescriptor( } val context = DeserializationContext( - moduleData.deserialization, nameResolver, moduleData.module, typeTable, VersionRequirementTable.EMPTY, + moduleData.deserialization, nameResolver, moduleData.module, typeTable, VersionRequirementTable.EMPTY, metadataVersion, containerSource = null, parentTypeDeserializer = null, typeParameters = typeParameters ) return MemberDeserializer(context).createDescriptor(proto) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt index fd93e666a40..e2ffaa742a1 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/reflectLambda.kt @@ -19,6 +19,7 @@ package kotlin.reflect.jvm import org.jetbrains.kotlin.metadata.deserialization.TypeTable +import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.serialization.deserialization.MemberDeserializer import kotlin.reflect.KFunction @@ -35,9 +36,11 @@ fun Function.reflect(): KFunction? { val annotation = javaClass.getAnnotation(Metadata::class.java) ?: return null val data = annotation.d1.takeUnless(Array::isEmpty) ?: return null val (nameResolver, proto) = JvmProtoBufUtil.readFunctionDataFrom(data, annotation.d2) + val metadataVersion = JvmMetadataVersion(*annotation.mv) - val descriptor = deserializeToDescriptor(javaClass, proto, nameResolver, TypeTable(proto.typeTable), MemberDeserializer::loadFunction) - ?: return null + val descriptor = deserializeToDescriptor( + javaClass, proto, nameResolver, TypeTable(proto.typeTable), metadataVersion, MemberDeserializer::loadFunction + ) ?: return null @Suppress("UNCHECKED_CAST") return KFunctionImpl(EmptyContainerForLocal, descriptor) as KFunction diff --git a/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/JsAnalyzerFacade.kt b/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/JsAnalyzerFacade.kt index d6da1f963ea..659daf50b08 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/JsAnalyzerFacade.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/caches/resolve/JsAnalyzerFacade.kt @@ -73,9 +73,10 @@ object JsAnalyzerFacade : ResolverForModuleFactory() { .flatMap { KotlinJavascriptMetadataUtils.loadMetadata(it) } .filter { it.version.isCompatible() } .map { metadata -> - val (header, packageFragmentProtos) = KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body) + val (header, packageFragmentProtos) = + KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body, metadata.version) createKotlinJavascriptPackageFragmentProvider( - moduleContext.storageManager, moduleDescriptor, header, packageFragmentProtos, + moduleContext.storageManager, moduleDescriptor, header, packageFragmentProtos, metadata.version, container.get(), LookupTracker.DO_NOTHING ) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDecompiler.kt index fec9e369363..e834f138f76 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDecompiler.kt @@ -44,9 +44,10 @@ class KotlinBuiltInDecompiler : KotlinMetadataDecompiler( class BuiltInDefinitionFile( proto: ProtoBuf.PackageFragment, + version: BuiltInsBinaryVersion, val packageDirectory: VirtualFile, val isMetadata: Boolean -) : FileWithMetadata.Compatible(proto, BuiltInSerializerProtocol) { +) : FileWithMetadata.Compatible(proto, version, BuiltInSerializerProtocol) { override val classesToDecompile: List get() = super.classesToDecompile.let { classes -> if (isMetadata || !FILTER_OUT_CLASSES_EXISTING_AS_JVM_CLASS_FILES) classes @@ -73,7 +74,8 @@ class BuiltInDefinitionFile( } val proto = ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) - val result = BuiltInDefinitionFile(proto, file.parent, file.extension == MetadataPackageFragment.METADATA_FILE_EXTENSION) + val result = + BuiltInDefinitionFile(proto, version, file.parent, file.extension == MetadataPackageFragment.METADATA_FILE_EXTENSION) val packageProto = result.proto.`package` if (result.classesToDecompile.isEmpty() && packageProto.typeAliasCount == 0 && packageProto.functionCount == 0 && packageProto.propertyCount == 0) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt index d5e66822f7a..86b7d44b855 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt @@ -87,8 +87,9 @@ class DeserializerForClassfileDecompiler( } val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(annotationData, strings) val membersScope = DeserializedPackageMemberScope( - createDummyPackageFragment(header.packageName?.let(::FqName) ?: facadeFqName.parent()), packageProto, nameResolver, - JvmPackagePartSource(binaryClassForPackageClass, packageProto, nameResolver), deserializationComponents + createDummyPackageFragment(header.packageName?.let(::FqName) ?: facadeFqName.parent()), + packageProto, nameResolver, header.metadataVersion, + JvmPackagePartSource(binaryClassForPackageClass, packageProto, nameResolver), deserializationComponents ) { emptyList() } return membersScope.getContributedDescriptors().toList() } @@ -145,6 +146,6 @@ class DirectoryBasedDataFinder( } val (nameResolver, classProto) = JvmProtoBufUtil.readClassDataFrom(data, strings) - return ClassData(nameResolver, classProto, KotlinJvmBinarySourceElement(binaryClass)) + return ClassData(nameResolver, classProto, classHeader.metadataVersion, KotlinJvmBinarySourceElement(binaryClass)) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDecompiler.kt index 5131f568edf..1270adf4db6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDecompiler.kt @@ -101,7 +101,7 @@ abstract class KotlinMetadataDecompiler( is FileWithMetadata.Compatible -> { val packageFqName = file.packageFqName val resolver = KotlinMetadataDeserializerForDecompiler( - packageFqName, file.proto, file.nameResolver, + packageFqName, file.proto, file.nameResolver, file.version, targetPlatform, serializerProtocol, flexibleTypeDeserializer ) val declarations = arrayListOf() @@ -120,8 +120,9 @@ sealed class FileWithMetadata { class Incompatible(val version: BinaryVersion) : FileWithMetadata() open class Compatible( - val proto: ProtoBuf.PackageFragment, - serializerProtocol: SerializerExtensionProtocol + val proto: ProtoBuf.PackageFragment, + val version: BinaryVersion, + serializerProtocol: SerializerExtensionProtocol ) : FileWithMetadata() { val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames) val packageFqName = FqName(nameResolver.getPackageFqName(proto.`package`.getExtension(serializerProtocol.packageFqName))) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDeserializerForDecompiler.kt index 82947aad4bd..c68903174f0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataDeserializerForDecompiler.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter import org.jetbrains.kotlin.idea.decompiler.textBuilder.ResolveEverythingToKotlinAnyLocalClassifierResolver import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.NameResolver import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.TargetPlatform @@ -37,6 +38,7 @@ class KotlinMetadataDeserializerForDecompiler( packageFqName: FqName, private val proto: ProtoBuf.PackageFragment, private val nameResolver: NameResolver, + private val metadataVersion: BinaryVersion, override val targetPlatform: TargetPlatform, serializerProtocol: SerializerExtensionProtocol, flexibleTypeDeserializer: FlexibleTypeDeserializer @@ -49,7 +51,8 @@ class KotlinMetadataDeserializerForDecompiler( val notFoundClasses = NotFoundClasses(storageManager, moduleDescriptor) deserializationComponents = DeserializationComponents( - storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver), + storageManager, moduleDescriptor, DeserializationConfiguration.Default, + ProtoBasedClassDataFinder(proto, nameResolver, metadataVersion), AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, serializerProtocol), packageFragmentProvider, ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG), LookupTracker.DO_NOTHING, flexibleTypeDeserializer, emptyList(), notFoundClasses, @@ -64,8 +67,8 @@ class KotlinMetadataDeserializerForDecompiler( } val membersScope = DeserializedPackageMemberScope( - createDummyPackageFragment(facadeFqName), proto.`package`, nameResolver, containerSource = null, - components = deserializationComponents + createDummyPackageFragment(facadeFqName), proto.`package`, nameResolver, metadataVersion, containerSource = null, + components = deserializationComponents ) { emptyList() } return membersScope.getContributedDescriptors().toList() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataStubBuilder.kt index ec3a2e5fd37..33d739b3a53 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/common/KotlinMetadataStubBuilder.kt @@ -51,7 +51,7 @@ open class KotlinMetadataStubBuilder( val packageFqName = file.packageFqName val nameResolver = file.nameResolver val components = ClsStubBuilderComponents( - ProtoBasedClassDataFinder(file.proto, nameResolver), + ProtoBasedClassDataFinder(file.proto, nameResolver, file.version), AnnotationLoaderForStubBuilderImpl(serializerProtocol), virtualFile ) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptMetaFileDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptMetaFileDecompiler.kt index 3ebb5cd040d..4778a56b539 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptMetaFileDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptMetaFileDecompiler.kt @@ -43,6 +43,6 @@ class KotlinJavaScriptMetaFileDecompiler : KotlinMetadataDecompiler, nestedClassId: ClassId) { - val (nameResolver, classProto, sourceElement) = + val (nameResolver, classProto, _, sourceElement) = c.components.classDataFinder.findClassData(nestedClassId) ?: c.components.virtualFileForDebug.let { rootFile -> LOG.error( diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt index 19f869fd1df..b060acfce2a 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt @@ -40,9 +40,10 @@ import org.jetbrains.kotlin.incremental.testingUtils.TouchPolicy import org.jetbrains.kotlin.incremental.testingUtils.copyTestSources import org.jetbrains.kotlin.incremental.testingUtils.getModificationsToPerform import org.jetbrains.kotlin.incremental.utils.TestMessageCollector -import org.jetbrains.kotlin.jps.incremental.runJSCompiler import org.jetbrains.kotlin.jps.incremental.createTestingCompilerEnvironment +import org.jetbrains.kotlin.jps.incremental.runJSCompiler import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.utils.JsMetadataVersion import java.io.* import java.util.* @@ -119,7 +120,10 @@ abstract class AbstractJsLookupTrackerTest : AbstractLookupTrackerTest() { override fun Services.Builder.registerAdditionalServices() { if (header != null) { - register(IncrementalDataProvider::class.java, IncrementalDataProviderImpl(header!!, packageParts!!)) + register( + IncrementalDataProvider::class.java, + IncrementalDataProviderImpl(header!!, packageParts, JsMetadataVersion.INSTANCE.toArray()) + ) } register(IncrementalResultsConsumer::class.java, IncrementalResultsConsumerImpl()) diff --git a/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProvider.kt b/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProvider.kt index e6096fd21e1..7d94bfdba72 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProvider.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/incremental/js/IncrementalDataProvider.kt @@ -22,11 +22,15 @@ import java.io.File interface IncrementalDataProvider { /** gets header metadata (serialized [JsProtoBuf.Header]) from previous compilation */ val headerMetadata: ByteArray + /** gets non-dirty package parts data from previous compilation */ val compiledPackageParts: Map + + val metadataVersion: IntArray } class IncrementalDataProviderImpl( override val headerMetadata: ByteArray, - override val compiledPackageParts: Map -) : IncrementalDataProvider \ No newline at end of file + override val compiledPackageParts: Map, + override val metadataVersion: IntArray +) : IncrementalDataProvider diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt index 4ace02d8fa6..538eb5d45de 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProvid import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil import org.jetbrains.kotlin.serialization.js.ModuleKind import org.jetbrains.kotlin.serialization.js.PackagesWithHeaderMetadata +import org.jetbrains.kotlin.utils.JsMetadataVersion object TopDownAnalyzerFacadeForJS { @JvmStatic @@ -85,8 +86,12 @@ object TopDownAnalyzerFacadeForJS { val lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER) ?: LookupTracker.DO_NOTHING val expectActualTracker = configuration.get(CommonConfigurationKeys.EXPECT_ACTUAL_TRACKER) ?: ExpectActualTracker.DoNothing val languageVersionSettings = configuration.languageVersionSettings - val packageFragment = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER]?.let { - val metadata = PackagesWithHeaderMetadata(it.headerMetadata, it.compiledPackageParts.values.map { it.metadata }) + val packageFragment = configuration[JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER]?.let { incrementalData -> + val metadata = PackagesWithHeaderMetadata( + incrementalData.headerMetadata, + incrementalData.compiledPackageParts.values.map { it.metadata }, + JsMetadataVersion(*incrementalData.metadataVersion) + ) KotlinJavascriptSerializationUtil.readDescriptors( metadata, moduleContext.storageManager, moduleContext.module, CompilerDeserializationConfiguration(languageVersionSettings), lookupTracker diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java index d41294593a8..ce1571374d3 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JsConfig.java @@ -250,8 +250,9 @@ public class JsConfig { Name.special("<" + cached.getName() + ">"), storageManager, JsPlatform.INSTANCE.getBuiltIns() ); + KotlinJavaScriptLibraryParts parts = cached.getData(); PackageFragmentProvider provider = KotlinJavascriptPackageFragmentProviderKt.createKotlinJavascriptPackageFragmentProvider( - storageManager, moduleDescriptor, cached.getData().getHeader(), cached.getData().getBody(), + storageManager, moduleDescriptor, parts.getHeader(), parts.getBody(), parts.getMetadataVersion(), new CompilerDeserializationConfiguration(languageVersionSettings), LookupTracker.DO_NOTHING.INSTANCE ); @@ -309,9 +310,9 @@ public class JsConfig { ); LookupTracker lookupTracker = configuration.get(CommonConfigurationKeys.LOOKUP_TRACKER, LookupTracker.DO_NOTHING.INSTANCE); - KotlinJavaScriptLibraryParts parts = KotlinJavascriptSerializationUtil.readModuleAsProto(m.getBody()); + KotlinJavaScriptLibraryParts parts = KotlinJavascriptSerializationUtil.readModuleAsProto(m.getBody(), m.getVersion()); PackageFragmentProvider provider = KotlinJavascriptPackageFragmentProviderKt.createKotlinJavascriptPackageFragmentProvider( - storageManager, moduleDescriptor, parts.getHeader(), parts.getBody(), + storageManager, moduleDescriptor, parts.getHeader(), parts.getBody(), m.getVersion(), new CompilerDeserializationConfiguration(languageVersionSettings), lookupTracker ); diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt index a56c03eda3d..eafaa6bc15e 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue +import org.jetbrains.kotlin.utils.JsMetadataVersion class KotlinJavascriptPackageFragment( fqName: FqName, @@ -38,8 +39,11 @@ class KotlinJavascriptPackageFragment( module: ModuleDescriptor, proto: ProtoBuf.PackageFragment, header: JsProtoBuf.Header, + metadataVersion: JsMetadataVersion, configuration: DeserializationConfiguration -) : DeserializedPackageFragmentImpl(fqName, storageManager, module, proto, JsContainerSource(fqName, header, configuration)) { +) : DeserializedPackageFragmentImpl( + fqName, storageManager, module, proto, metadataVersion, JsContainerSource(fqName, header, configuration) +) { val fileMap: Map = proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) -> (if (file.hasId()) file.id else index) to FileHolder(file.annotationList) diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt index 9f7ae0da45a..e6e6e77c88d 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializationUtil.kt @@ -62,7 +62,9 @@ object KotlinJavascriptSerializationUtil { ProtoBuf.PackageFragment.parseFrom(it, JsSerializerProtocol.extensionRegistry) } val headerProto = JsProtoBuf.Header.parseFrom(CodedInputStream.newInstance(metadata.header), JsSerializerProtocol.extensionRegistry) - return createKotlinJavascriptPackageFragmentProvider(storageManager, module, headerProto, scopeProto, configuration, lookupTracker) + return createKotlinJavascriptPackageFragmentProvider( + storageManager, module, headerProto, scopeProto, metadata.metadataVersion, configuration, lookupTracker + ) } fun serializeMetadata( @@ -302,7 +304,7 @@ object KotlinJavascriptSerializationUtil { } @JvmStatic - fun readModuleAsProto(metadata: ByteArray): KotlinJavaScriptLibraryParts { + fun readModuleAsProto(metadata: ByteArray, metadataVersion: JsMetadataVersion): KotlinJavaScriptLibraryParts { val (header, content) = GZIPInputStream(ByteArrayInputStream(metadata)).use { stream -> JsProtoBuf.Header.parseDelimitedFrom(stream, JsSerializerProtocol.extensionRegistry) to JsProtoBuf.Library.parseFrom(stream, JsSerializerProtocol.extensionRegistry) @@ -315,7 +317,7 @@ object KotlinJavascriptSerializationUtil { JsProtoBuf.Library.Kind.UMD -> ModuleKind.UMD } - return KotlinJavaScriptLibraryParts(header, content.packageFragmentList, moduleKind, content.importedModuleList) + return KotlinJavaScriptLibraryParts(header, content.packageFragmentList, moduleKind, content.importedModuleList, metadataVersion) } } @@ -323,7 +325,8 @@ data class KotlinJavaScriptLibraryParts( val header: JsProtoBuf.Header, val body: List, val kind: ModuleKind, - val importedModules: List + val importedModules: List, + val metadataVersion: JsMetadataVersion ) internal fun DeclarationDescriptor.extractFileId(): Int? = when (this) { diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/PackagesWithHeaderMetadata.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/PackagesWithHeaderMetadata.kt index 052a3d040d8..7e7d8d839af 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/PackagesWithHeaderMetadata.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/PackagesWithHeaderMetadata.kt @@ -16,4 +16,10 @@ package org.jetbrains.kotlin.serialization.js -class PackagesWithHeaderMetadata(val header: ByteArray, val packages: List) +import org.jetbrains.kotlin.utils.JsMetadataVersion + +class PackagesWithHeaderMetadata( + val header: ByteArray, + val packages: List, + val metadataVersion: JsMetadataVersion +) diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt index 436553388b8..9ceee7ead02 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt @@ -28,18 +28,20 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.parentOrNull import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.storage.StorageManager +import org.jetbrains.kotlin.utils.JsMetadataVersion fun createKotlinJavascriptPackageFragmentProvider( storageManager: StorageManager, module: ModuleDescriptor, header: JsProtoBuf.Header, packageFragmentProtos: List, + metadataVersion: JsMetadataVersion, configuration: DeserializationConfiguration, lookupTracker: LookupTracker ): PackageFragmentProvider { val packageFragments: MutableList = packageFragmentProtos.mapNotNullTo(mutableListOf()) { proto -> proto.fqName?.let { fqName -> - KotlinJavascriptPackageFragment(fqName, storageManager, module, proto, header, configuration) + KotlinJavascriptPackageFragment(fqName, storageManager, module, proto, header, metadataVersion, configuration) } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt index 9770ca94417..37817a357bb 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/BasicBoxTest.kt @@ -59,6 +59,7 @@ import org.jetbrains.kotlin.test.KotlinTestUtils.TestFileFactory import org.jetbrains.kotlin.test.KotlinTestWithEnvironment import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.utils.DFS +import org.jetbrains.kotlin.utils.JsMetadataVersion import org.jetbrains.kotlin.utils.KotlinJavascriptMetadata import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import java.io.* @@ -409,10 +410,11 @@ abstract class BasicBoxTest( return String(out.toByteArray(), Charset.forName("UTF-8")) } - private fun metadataAsString(metadata: String): String { - val containers = mutableListOf() - KotlinJavascriptMetadataUtils.parseMetadata(metadata, containers) - val metadataParts = KotlinJavascriptSerializationUtil.readModuleAsProto(containers.single().body).body + private fun metadataAsString(metadataText: String): String { + val metadata = mutableListOf().apply { + KotlinJavascriptMetadataUtils.parseMetadata(metadataText, this) + }.single() + val metadataParts = KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body, metadata.version).body return metadataParts.joinToString("-----\n") { val binary = it.toByteArray() DebugProtoBuf.PackageFragment.parseFrom(binary, JsSerializerProtocol.extensionRegistry).toString() @@ -576,8 +578,10 @@ abstract class BasicBoxTest( if (hasFilesToRecompile) { val header = incrementalData?.header if (header != null) { - configuration.put(JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER, - IncrementalDataProviderImpl(header, incrementalData.translatedFiles)) + configuration.put( + JSConfigurationKeys.INCREMENTAL_DATA_PROVIDER, + IncrementalDataProviderImpl(header, incrementalData.translatedFiles, JsMetadataVersion.INSTANCE.toArray()) + ) } configuration.put(JSConfigurationKeys.INCREMENTAL_RESULTS_CONSUMER, IncrementalResultsConsumerImpl()) @@ -743,7 +747,7 @@ abstract class BasicBoxTest( companion object { val METADATA_CACHE = (JsConfig.JS_STDLIB + JsConfig.JS_KOTLIN_TEST).flatMap { path -> KotlinJavascriptMetadataUtils.loadMetadata(path).map { metadata -> - val parts = KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body) + val parts = KotlinJavascriptSerializationUtil.readModuleAsProto(metadata.body, metadata.version) JsModuleDescriptor(metadata.moduleName, parts.kind, parts.importedModules, parts) } }