Fixed native PackageAccessTracker

This commit is contained in:
Alexander Gorshenev
2019-10-01 17:27:31 +03:00
committed by alexander-gorshenev
parent df6dcd646f
commit 147681f335
3 changed files with 13 additions and 12 deletions
@@ -15,15 +15,16 @@ fun parseModuleHeader(libraryMetadata: ByteArray): KlibMetadataProtoBuf.Header =
KlibMetadataProtoBuf.Header.parseFrom(libraryMetadata, KlibMetadataSerializerProtocol.extensionRegistry) KlibMetadataProtoBuf.Header.parseFrom(libraryMetadata, KlibMetadataSerializerProtocol.extensionRegistry)
interface PackageAccessHandler { interface PackageAccessHandler {
fun loadModuleHeader( fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header
library: KotlinLibrary = parseModuleHeader(library.moduleHeaderData)
): KlibMetadataProtoBuf.Header = parseModuleHeader(library.moduleHeaderData)
fun loadPackageFragment( fun loadPackageFragment(
library: KotlinLibrary, library: KotlinLibrary,
packageFqName: String, packageFqName: String,
partName: String partName: String
): ProtoBuf.PackageFragment = parsePackageFragment(library.packageMetadata(packageFqName, partName)) ): ProtoBuf.PackageFragment = parsePackageFragment(library.packageMetadata(packageFqName, partName))
fun markNeededForLink(library: KotlinLibrary, fqName: String) {}
} }
object SimplePackageAccessHandler : PackageAccessHandler object SimplePackageAccessHandler : PackageAccessHandler
@@ -40,16 +40,18 @@ class KlibMetadataPackageFragment(
(packageAccessHandler ?: SimplePackageAccessHandler).loadPackageFragment(library, fqName.asString(), partName) (packageAccessHandler ?: SimplePackageAccessHandler).loadPackageFragment(library, fqName.asString(), partName)
} }
// TODO: Do we really need both 'protoForNames' and 'proto' today?
val proto: ProtoBuf.PackageFragment val proto: ProtoBuf.PackageFragment
get() = protoForNames get() {
packageAccessHandler?.markNeededForLink(library, fqName.asString())
return protoForNames
}
private val nameResolver by lazy { private val nameResolver by lazy {
NameResolverImpl(protoForNames.strings, protoForNames.qualifiedNames) NameResolverImpl(protoForNames.strings, protoForNames.qualifiedNames)
} }
override val classDataFinder by lazy { override val classDataFinder by lazy {
KlibMetadataClassDataFinder(proto, nameResolver) KlibMetadataClassDataFinder(protoForNames, nameResolver)
} }
private val _memberScope by lazy { private val _memberScope by lazy {
@@ -22,16 +22,14 @@ class KotlinResolvedLibraryImpl(override val library: KotlinLibrary): KotlinReso
override val isDefault: Boolean override val isDefault: Boolean
get() = library.isDefault get() = library.isDefault
override fun loadPackageFragment( override fun markNeededForLink(
library: KotlinLibrary, library: KotlinLibrary,
packageFqName: String, fqName: String
partName: String ) {
): ProtoBuf.PackageFragment {
if (!isNeededForLink // fast path if (!isNeededForLink // fast path
&& !_emptyPackages.contains(packageFqName)) { && !_emptyPackages.contains(fqName)) {
isNeededForLink = true isNeededForLink = true
} }
return parsePackageFragment(library.packageMetadata(packageFqName, partName))
} }
override fun toString() = "library=$library, dependsOn=${_resolvedDependencies.joinToString { it.library.toString() }}" override fun toString() = "library=$library, dependsOn=${_resolvedDependencies.joinToString { it.library.toString() }}"