From ca742b1552540da152fe17cbcce30489e8d1bdf9 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 11 Sep 2018 20:19:47 +0300 Subject: [PATCH] Support free-form .knm package part names --- .../ide/konan/KotlinNativePluginUtil.kt | 4 ++-- .../kotlin/konan/library/KonanLibrary.kt | 4 ++-- .../konan/library/KonanLibraryLayout.kt | 4 ++-- .../konan/library/KonanMetadataReader.kt | 2 +- .../library/impl/DefaultMetadataReaderImpl.kt | 4 ++-- .../konan/library/impl/KonanLibraryImpl.kt | 21 ++++++++++++++++--- .../konan/KonanPackageFragment.kt | 4 ++-- ...DeserializedPackageFragmentsFactoryImpl.kt | 6 +++--- 8 files changed, 32 insertions(+), 17 deletions(-) diff --git a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativePluginUtil.kt b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativePluginUtil.kt index cb31252b366..0afd86b20b2 100644 --- a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativePluginUtil.kt +++ b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/KotlinNativePluginUtil.kt @@ -105,9 +105,9 @@ internal object CachingIdeMetadataReaderImpl : MetadataReader { override fun loadSerializedPackageFragment( libraryLayout: KonanLibraryLayout, packageFqName: String, - partIndex: Int + partName: String ): KonanProtoBuf.LinkDataPackageFragment = - cache.getCachedPackageFragment(libraryLayout.getVirtualFile(libraryLayout.packageFragmentFile(packageFqName, partIndex))) + cache.getCachedPackageFragment(libraryLayout.getVirtualFile(libraryLayout.packageFragmentFile(packageFqName, partName))) private fun KonanLibraryLayout.getVirtualFile(file: File): VirtualFile { val source = this.source diff --git a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibrary.kt b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibrary.kt index e26a1725c9c..09bcc6e004d 100644 --- a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibrary.kt +++ b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibrary.kt @@ -44,8 +44,8 @@ interface KonanLibrary { val dataFlowGraph: ByteArray? val moduleHeaderData: KonanProtoBuf.LinkDataLibrary - fun packageMetadataPartCount(fqName: String): Int - fun packageMetadata(packageFqName: String, partIndex: Int): KonanProtoBuf.LinkDataPackageFragment + fun packageMetadataParts(fqName: String): Set + fun packageMetadata(packageFqName: String, partName: String): KonanProtoBuf.LinkDataPackageFragment } val KonanLibrary.uniqueName diff --git a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibraryLayout.kt b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibraryLayout.kt index dc797e9188b..35f9a8b1dff 100644 --- a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibraryLayout.kt +++ b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanLibraryLayout.kt @@ -38,8 +38,8 @@ interface KonanLibraryLayout { fun packageFragmentsDir(packageFqName: String) = File(linkdataDir, if (packageFqName == "") "root_package" else "package_$packageFqName") - fun packageFragmentFile(packageFqName: String, partIndex: Int) = - File(packageFragmentsDir(packageFqName), "$partIndex$KLIB_METADATA_FILE_EXTENSION_WITH_DOT") + fun packageFragmentFile(packageFqName: String, partName: String) = + File(packageFragmentsDir(packageFqName), "$partName$KLIB_METADATA_FILE_EXTENSION_WITH_DOT") } sealed class KonanLibrarySource { diff --git a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanMetadataReader.kt b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanMetadataReader.kt index 3d439d40e5b..bd5e76365b1 100644 --- a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanMetadataReader.kt +++ b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/KonanMetadataReader.kt @@ -12,6 +12,6 @@ interface MetadataReader { fun loadSerializedPackageFragment( libraryLayout: KonanLibraryLayout, packageFqName: String, - partIndex: Int + partName: String ): KonanProtoBuf.LinkDataPackageFragment } diff --git a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/DefaultMetadataReaderImpl.kt b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/DefaultMetadataReaderImpl.kt index 794af60e3f7..c91bfa6009e 100644 --- a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/DefaultMetadataReaderImpl.kt +++ b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/DefaultMetadataReaderImpl.kt @@ -19,9 +19,9 @@ object DefaultMetadataReaderImpl : MetadataReader { override fun loadSerializedPackageFragment( libraryLayout: KonanLibraryLayout, packageFqName: String, - partIndex: Int + partName: String ): KonanProtoBuf.LinkDataPackageFragment = parsePackageFragment( - libraryLayout.packageFragmentFile(packageFqName, partIndex).readBytes() + libraryLayout.packageFragmentFile(packageFqName, partName).readBytes() ) } diff --git a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/KonanLibraryImpl.kt b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/KonanLibraryImpl.kt index d946fb375fc..8c924bd6424 100644 --- a/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/KonanLibraryImpl.kt +++ b/konan/library-reader/src/org/jetbrains/kotlin/konan/library/impl/KonanLibraryImpl.kt @@ -62,10 +62,25 @@ internal class KonanLibraryImpl( override val moduleHeaderData: KonanProtoBuf.LinkDataLibrary by lazy { layout.inPlace { metadataReader.loadSerializedModule(it) } } - override fun packageMetadata(packageFqName: String, partIndex: Int) = layout.inPlace { metadataReader.loadSerializedPackageFragment(it, packageFqName, partIndex) } + override fun packageMetadata(packageFqName: String, partName: String) = + layout.inPlace { metadataReader.loadSerializedPackageFragment(it, packageFqName, partName) } + + override fun packageMetadataParts(fqName: String): Set = + layout.inPlace { inPlaceLayout -> + val fileList = + inPlaceLayout.packageFragmentsDir(fqName) + .listFiles + .mapNotNull { + it.name + .substringBeforeLast(KLIB_METADATA_FILE_EXTENSION_WITH_DOT, missingDelimiterValue = "") + .takeIf { it.isNotEmpty() } + } + + fileList.toSortedSet().also { + require(it.size == fileList.size) { "Duplicated names: ${fileList.groupingBy { it }.eachCount().filter { (_, count) -> count > 1 }}" } + } + } - override fun packageMetadataPartCount(fqName: String): Int = - layout.inPlace { it.packageFragmentsDir(fqName).listFiles.count { file -> file.extension == KLIB_METADATA_FILE_EXTENSION } } override fun toString() = "$libraryName[default=$isDefault]" } diff --git a/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/KonanPackageFragment.kt b/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/KonanPackageFragment.kt index a1544fd8b9e..6e332f5c066 100644 --- a/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/KonanPackageFragment.kt +++ b/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/KonanPackageFragment.kt @@ -25,7 +25,7 @@ class KonanPackageFragment( private val packageAccessedHandler: PackageAccessedHandler?, storageManager: StorageManager, module: ModuleDescriptor, - partIndex: Int + partName: String ) : DeserializedPackageFragment(fqName, storageManager, module) { lateinit var components: DeserializationComponents @@ -36,7 +36,7 @@ class KonanPackageFragment( // The proto field is lazy so that we can load only needed // packages from the library. - private val protoForNames: KonanProtoBuf.LinkDataPackageFragment by lazy { library.packageMetadata(fqName.asString(), partIndex) } + private val protoForNames: KonanProtoBuf.LinkDataPackageFragment by lazy { library.packageMetadata(fqName.asString(), partName) } val proto: KonanProtoBuf.LinkDataPackageFragment get() = protoForNames.also { packageAccessedHandler?.markPackageAccessed(fqName) } diff --git a/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/impl/KonanDeserializedPackageFragmentsFactoryImpl.kt b/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/impl/KonanDeserializedPackageFragmentsFactoryImpl.kt index 486d0d4cab0..424113a98d6 100644 --- a/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/impl/KonanDeserializedPackageFragmentsFactoryImpl.kt +++ b/konan/library-reader/src/org/jetbrains/kotlin/serialization/konan/impl/KonanDeserializedPackageFragmentsFactoryImpl.kt @@ -38,9 +38,9 @@ internal object KonanDeserializedPackageFragmentsFactoryImpl : KonanDeserialized storageManager: StorageManager ) = packageFragmentNames.flatMap { val fqName = FqName(it) - val count = library.packageMetadataPartCount(fqName.asString()) - List(count) { partIndex -> - KonanPackageFragment(fqName, library, packageAccessedHandler, storageManager, moduleDescriptor, partIndex) + val parts = library.packageMetadataParts(it) + parts.map { partName -> + KonanPackageFragment(fqName, library, packageAccessedHandler, storageManager, moduleDescriptor, partName) } }