Support -Xexport-library in reverse C interop. (#2740)

This commit is contained in:
Nikolay Igotti
2019-03-01 17:52:50 +03:00
committed by GitHub
parent 9b9fa9d92d
commit d74384db18
3 changed files with 29 additions and 15 deletions
@@ -283,8 +283,10 @@ private fun selectExportedLibraries(
): List<String> {
val exportedLibraries = arguments.exportedLibraries?.toList().orEmpty()
return if (exportedLibraries.isNotEmpty() && outputKind != CompilerOutputKind.FRAMEWORK) {
configuration.report(STRONG_WARNING, "-Xexport-library is only supported when producing frameworks, " +
return if (exportedLibraries.isNotEmpty() && outputKind != CompilerOutputKind.FRAMEWORK &&
outputKind != CompilerOutputKind.STATIC && outputKind != CompilerOutputKind.DYNAMIC) {
configuration.report(STRONG_WARNING,
"-Xexport-library is only supported when producing frameworks or native libraries, " +
"but the compiler is producing ${outputKind.name.toLowerCase()}")
emptyList()
@@ -579,8 +579,9 @@ internal class CAdapterGenerator(
}
override fun visitPackageViewDescriptor(descriptor: PackageViewDescriptor, ignored: Void?): Boolean {
if (descriptor.module != context.moduleDescriptor) return true
val fragments = descriptor.module.getPackage(FqName.ROOT).fragments.filter { it.module == context.moduleDescriptor }
if (descriptor.module !in moduleDescriptors) return true
val fragments = descriptor.module.getPackage(FqName.ROOT).fragments.filter {
it.module in moduleDescriptors }
visitChildren(fragments)
return true
}
@@ -605,15 +606,10 @@ internal class CAdapterGenerator(
private val seenPackageFragments = mutableSetOf<PackageFragmentDescriptor>()
private var currentPackageFragments: List<PackageFragmentDescriptor> = emptyList()
private val packageScopes = mutableMapOf<String, ExportedElementScope>()
override fun visitModuleDeclaration(descriptor: ModuleDescriptor, ignored: Void?): Boolean {
currentPackageFragments = descriptor.getPackageFragments().sortedWith(
Comparator { o1, o2 ->
o1.fqName.toString().compareTo(o2.fqName.toString())
})
seenPackageFragments.clear()
descriptor.getPackage(FqName.ROOT).accept(this, null)
return true
TODO("Shall not be called directly")
}
override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, ignored: Void?): Boolean {
@@ -624,8 +620,11 @@ internal class CAdapterGenerator(
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, ignored: Void?): Boolean {
val fqName = descriptor.fqName
val name = if (fqName.isRoot) "root" else translateName(fqName.shortName().asString())
val packageScope = ExportedElementScope(ScopeKind.PACKAGE, name)
scopes.last().scopes += packageScope
val packageScope = packageScopes.getOrPut(name) {
val scope = ExportedElementScope(ScopeKind.PACKAGE, name)
scopes.last().scopes += scope
scope
}
scopes.push(packageScope)
visitChildren(DescriptorUtils.getAllDescriptors(descriptor.getMemberScope()))
for (currentPackageFragment in currentPackageFragments) {
@@ -639,9 +638,21 @@ internal class CAdapterGenerator(
return true
}
private val moduleDescriptors = mutableSetOf<ModuleDescriptor>()
fun generateBindings() {
scopes.push(ExportedElementScope(ScopeKind.TOP, "kotlin"))
context.moduleDescriptor.accept(this, null)
moduleDescriptors += context.moduleDescriptor
moduleDescriptors += context.getExportedDependencies()
currentPackageFragments = moduleDescriptors.flatMap { it.getPackageFragments() }.toSet().sortedWith(
Comparator { o1, o2 ->
o1.fqName.toString().compareTo(o2.fqName.toString())
})
context.moduleDescriptor.getPackage(FqName.ROOT).accept(this, null)
// TODO: add few predefined types.
listOf<KotlinType>(
// context.builtIns.anyType,
@@ -80,7 +80,8 @@ internal val psiToIrPhase = konanUnitPhase(
konanLibrary.irHeader?.let { header ->
// TODO: consider skip deserializing explicitly exported declarations for libraries.
// Now it's not valid because of all dependencies that must be computed.
val deserializationStrategy = DeserializationStrategy.EXPLICITLY_EXPORTED
val deserializationStrategy = if (getExportedDependencies().contains(dependency))
DeserializationStrategy.ALL else DeserializationStrategy.EXPLICITLY_EXPORTED
modules[konanLibrary.libraryName] = deserializer.deserializeIrModuleHeader(dependency, header, deserializationStrategy)
}
}