[kotlinx-metadata-klib] Fix library reading

* To be able to deserialize metadata we need to include ":core:deserialization".
* Use per-fragment string tables.
* Read file names from strings instead of file names list.
This commit is contained in:
Sergey Bogolepov
2019-11-21 19:04:41 +07:00
parent c341a3e709
commit 18bb615dd9
3 changed files with 6 additions and 4 deletions
@@ -31,6 +31,7 @@ dependencies {
// TODO: Get rid of this heavyweight dependency.
shadows(project(":core:descriptors"))
shadows(project(":core:metadata"))
shadows(project(":core:deserialization"))
shadows(project(":compiler:serialization"))
shadows(project(":kotlin-util-klib-metadata"))
shadows(project(":kotlin-util-klib"))
@@ -83,12 +83,13 @@ class KlibModuleMetadata(
readStrategy: KlibModuleFragmentReadStrategy = KlibModuleFragmentReadStrategy.DEFAULT
): KlibModuleMetadata {
val moduleHeaderProto = parseModuleHeader(library.moduleHeaderData)
val nameResolver = NameResolverImpl(moduleHeaderProto.strings, moduleHeaderProto.qualifiedNames)
val moduleHeader = moduleHeaderProto.readHeader(nameResolver)
val headerNameResolver = NameResolverImpl(moduleHeaderProto.strings, moduleHeaderProto.qualifiedNames)
val moduleHeader = moduleHeaderProto.readHeader(headerNameResolver)
val fileIndex = SourceFileIndexReadExtension(moduleHeader.file)
val moduleFragments = moduleHeader.packageFragmentName.flatMap { packageFqName ->
library.packageMetadataParts(packageFqName).map { part ->
val packageFragment = parsePackageFragment(library.packageMetadata(packageFqName, part))
val nameResolver = NameResolverImpl(packageFragment.strings, packageFragment.qualifiedNames)
KmModuleFragment().apply { packageFragment.accept(this, nameResolver, listOf(fileIndex)) }
}.let(readStrategy::processModuleParts)
}
@@ -20,10 +20,10 @@ import org.jetbrains.kotlin.serialization.StringTableImpl
internal class KlibMetadataExtensions : MetadataExtensions {
private fun ReadContext.getSourceFile(index: Int) =
contextExtensions.filterIsInstance<SourceFileIndexReadExtension>().first().getSourceFile(index)
strings.getString(index).let(::KlibSourceFile)
private fun WriteContext.getIndexOf(file: KlibSourceFile) =
contextExtensions.filterIsInstance<ReverseSourceFileIndexWriteExtension>().first().getIndexOf(file)
strings.getStringIndex(file.name)
override fun readClassExtensions(v: KmClassVisitor, proto: ProtoBuf.Class, c: ReadContext) {
val extension = v.visitExtensions(KlibClassExtensionVisitor.TYPE) as? KlibClassExtensionVisitor ?: return