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
@@ -65,10 +65,14 @@ class CommonResolverForModuleFactory(
override val name: Name,
override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>,
private val dependencies: Iterable<ModuleInfo>,
override val expectedBy: List<ModuleInfo>,
private val modulesWhoseInternalsAreVisible: Collection<ModuleInfo>,
private val dependOnOldBuiltIns: Boolean
) : ModuleInfo {
override fun dependencies() = listOf(this, *dependencies.toList().toTypedArray() )
override fun modulesWhoseInternalsAreVisible(): Collection<ModuleInfo> = modulesWhoseInternalsAreVisible
override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns =
if (dependOnOldBuiltIns) ModuleInfo.DependencyOnBuiltIns.LAST else ModuleInfo.DependencyOnBuiltIns.NONE
@@ -123,6 +127,8 @@ class CommonResolverForModuleFactory(
moduleName,
capabilities,
dependenciesContainer?.moduleInfos?.toList().orEmpty(),
dependenciesContainer?.refinesModuleInfos.orEmpty(),
dependenciesContainer?.friendModuleInfos.orEmpty(),
dependOnBuiltIns
)
val project = files.firstOrNull()?.project ?: throw AssertionError("No files to analyze")
@@ -150,7 +156,8 @@ class CommonResolverForModuleFactory(
GlobalSearchScope.allScope(project),
languageVersionSettings = multiplatformLanguageSettings,
syntheticFiles = files,
dependencyModules = dependenciesContainer?.moduleInfos ?: emptyList()
knownDependencyModuleDescriptors = dependenciesContainer?.moduleInfos
?.associateWith(dependenciesContainer::moduleDescriptorForModuleInfo).orEmpty()
)
val moduleDescriptor = resolver.descriptorForModule(moduleInfo)
@@ -167,7 +174,11 @@ class CommonResolverForModuleFactory(
interface CommonDependenciesContainer {
val moduleInfos: List<ModuleInfo>
fun moduleDescriptorForModuleInfo(moduleInfo: ModuleInfo): ModuleDescriptor
fun packageFragmentProviderForModuleInfo(moduleInfo: ModuleInfo): PackageFragmentProvider?
val friendModuleInfos: List<ModuleInfo>
val refinesModuleInfos: List<ModuleInfo>
}
private fun createContainerToResolveCommonCode(
@@ -40,4 +40,18 @@ class K2MetadataCompilerArguments : CommonCompilerArguments() {
description = "Enable in JPS"
)
var enabledInJps: Boolean by FreezableVar(false)
@Argument(
value = "-Xfriend-paths",
valueDescription = "<path>",
description = "Paths to output directories for friend modules (whose internals should be visible)"
)
var friendPaths: Array<String>? by FreezableVar(null)
@Argument(
value = "-Xrefines-paths",
valueDescription = "<path>",
description = "Paths to output directories for refined modules (whose expects this module can actualize)"
)
var refinesPaths: Array<String>? by FreezableVar(null)
}