Support friend internal visibility in K2Metadata compiler (KT-37264)

Add and handle the friend paths and refines paths compiler arguments;
Reuse klib dependency module descriptors in the resolver for project;

Issue #KT-37264
This commit is contained in:
Sergey Igushkin
2020-03-05 23:11:49 +03:00
parent 04c924a119
commit 3858c8e1f8
7 changed files with 86 additions and 8 deletions
@@ -19,12 +19,12 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
private val debugName: String,
protected val projectContext: ProjectContext,
modules: Collection<M>,
private val fallbackModificationTracker: ModificationTracker? = null,
protected val fallbackModificationTracker: ModificationTracker? = null,
private val delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
private val packageOracleFactory: PackageOracleFactory = PackageOracleFactory.OptimisticFactory
) : ResolverForProject<M>() {
private class ModuleData(
protected class ModuleData(
val moduleDescriptor: ModuleDescriptorImpl,
val modificationTracker: ModificationTracker?
) {
@@ -37,7 +37,7 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
}
// Protected by ("projectContext.storageManager.lock")
private val descriptorByModule = mutableMapOf<M, ModuleData>()
protected val descriptorByModule = mutableMapOf<M, ModuleData>()
// Protected by ("projectContext.storageManager.lock")
private val moduleInfoByDescriptor = mutableMapOf<ModuleDescriptorImpl, M>()
@@ -26,17 +26,26 @@ class ResolverForSingleModuleProject<M : ModuleInfo>(
private val languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
private val syntheticFiles: Collection<KtFile> = emptyList(),
private val sdkDependency: M? = null,
dependencyModules: Iterable<M> = emptyList()
knownDependencyModuleDescriptors: Map<M, ModuleDescriptor> = emptyMap()
) : AbstractResolverForProject<M>(
debugName,
projectContext,
listOf(module) + dependencyModules,
listOf(module) + knownDependencyModuleDescriptors.keys,
null,
EmptyResolverForProject(),
PackageOracleFactory.OptimisticFactory
) {
override fun sdkDependency(module: M): M? = sdkDependency
init {
knownDependencyModuleDescriptors.forEach { (module, descriptor) ->
descriptorByModule[module] = ModuleData(
descriptor as ModuleDescriptorImpl,
(module as? TrackableModuleInfo)?.createModificationTracker() ?: fallbackModificationTracker
)
}
}
override fun modulesContent(module: M): ModuleContent<M> = when (module) {
this.module -> ModuleContent(module, syntheticFiles, searchScope)
else -> ModuleContent(module, emptyList(), searchScope)