Support free-form .knm package part names
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<String>
|
||||
fun packageMetadata(packageFqName: String, partName: String): KonanProtoBuf.LinkDataPackageFragment
|
||||
}
|
||||
|
||||
val KonanLibrary.uniqueName
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -12,6 +12,6 @@ interface MetadataReader {
|
||||
fun loadSerializedPackageFragment(
|
||||
libraryLayout: KonanLibraryLayout,
|
||||
packageFqName: String,
|
||||
partIndex: Int
|
||||
partName: String
|
||||
): KonanProtoBuf.LinkDataPackageFragment
|
||||
}
|
||||
|
||||
+2
-2
@@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
+18
-3
@@ -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<String> =
|
||||
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]"
|
||||
}
|
||||
|
||||
+2
-2
@@ -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) }
|
||||
|
||||
+3
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user