Source libraries: Export source libs and support tests for them

This commit is contained in:
Ilya Matveev
2019-07-29 15:58:56 +07:00
committed by Ilya Matveev
parent 6f4bcfee02
commit 00d780b650
3 changed files with 28 additions and 20 deletions
@@ -19,22 +19,17 @@ import org.jetbrains.kotlin.konan.library.isInterop
import org.jetbrains.kotlin.konan.library.resolver.KonanLibraryResolveResult
import org.jetbrains.kotlin.library.toUnresolvedLibraries
internal fun Context.getExportedDependencies(): List<ModuleDescriptor> {
val exportedLibraries = this.config.exportedLibraries.toSet()
internal fun Context.getExportedDependencies(): List<ModuleDescriptor> = getDescriptorsFromFeaturedLibraries((config.exportedLibraries + config.sourceLibraries).toSet())
internal fun Context.getSourceLibraryDescriptors(): List<ModuleDescriptor> = getDescriptorsFromFeaturedLibraries(config.sourceLibraries.toSet())
val result = this.moduleDescriptor.allDependencyModules.filter {
val origin = it.konanModuleOrigin
when (origin) {
private fun Context.getDescriptorsFromFeaturedLibraries(featuredLibraries: Set<KonanLibrary>) =
moduleDescriptor.allDependencyModules.filter {
when (val origin = it.konanModuleOrigin) {
CurrentKonanModuleOrigin, SyntheticModulesOrigin -> false
is DeserializedKonanModuleOrigin -> {
origin.library in exportedLibraries
}
is DeserializedKonanModuleOrigin -> origin.library in featuredLibraries
}
}
return result
}
internal fun getExportedLibraries(
configuration: CompilerConfiguration,
resolvedLibraries: KonanLibraryResolveResult,
@@ -17,10 +17,15 @@ import org.jetbrains.kotlin.backend.common.reportWarning
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
import org.jetbrains.kotlin.backend.konan.getSourceLibraryDescriptors
import org.jetbrains.kotlin.backend.konan.ir.typeWithStarProjections
import org.jetbrains.kotlin.backend.konan.ir.typeWithoutArguments
import org.jetbrains.kotlin.backend.konan.reportCompilationError
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.konan.CurrentKonanModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.DeserializedKonanModuleOrigin
import org.jetbrains.kotlin.descriptors.konan.SyntheticModulesOrigin
import org.jetbrains.kotlin.descriptors.konan.konanModuleOrigin
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
@@ -600,10 +605,17 @@ internal class TestProcessor (val context: Context) {
}
// endregion
private fun shouldProcessFile(irFile: IrFile): Boolean = irFile.packageFragmentDescriptor.module.let {
// Process test annotations in source libraries too.
it == context.moduleDescriptor || it in context.getSourceLibraryDescriptors()
}
fun process(irFile: IrFile) {
// TODO: uses descriptors.
if (irFile.packageFragmentDescriptor.module != context.moduleDescriptor)
if (!shouldProcessFile(irFile)) {
return
}
val annotationCollector = AnnotationCollector(irFile)
irFile.acceptChildrenVoid(annotationCollector)
createTestSuites(irFile, annotationCollector)
@@ -5,12 +5,11 @@
package org.jetbrains.kotlin.backend.konan.objcexport
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.KonanConfigKeys
import org.jetbrains.kotlin.backend.konan.descriptors.getPackageFragments
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
import org.jetbrains.kotlin.backend.konan.getExportedDependencies
import org.jetbrains.kotlin.backend.konan.isNativeBinary
import org.jetbrains.kotlin.backend.konan.llvm.CodeGenerator
import org.jetbrains.kotlin.backend.konan.llvm.objcexport.ObjCExportCodeGenerator
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
@@ -146,7 +145,7 @@ internal class ObjCExport(val context: Context, symbolTable: SymbolTable) {
}
val file = directory.child("Info.plist")
val pkg = context.moduleDescriptor.guessMainPackage() // TODO: consider showing warning if it is root.
val pkg = guessMainPackage() // TODO: consider showing warning if it is root.
val bundleId = pkg.child(Name.identifier(name)).asString()
val platform = when (target) {
@@ -274,17 +273,19 @@ internal class ObjCExport(val context: Context, symbolTable: SymbolTable) {
// In this case resulting framework will likely be unusable due to compile errors when importing it.
}
}
}
internal fun ModuleDescriptor.guessMainPackage(): FqName {
val allPackages = this.getPackageFragments() // Includes also all parent packages, e.g. the root one.
private fun guessMainPackage(): FqName {
val allPackages = (context.getSourceLibraryDescriptors() + context.moduleDescriptor).flatMap {
it.getPackageFragments() // Includes also all parent packages, e.g. the root one.
}
val nonEmptyPackages = allPackages
val nonEmptyPackages = allPackages
.filter { it.getMemberScope().getContributedDescriptors().isNotEmpty() }
.map { it.fqName }.distinct()
return allPackages.map { it.fqName }.distinct()
return allPackages.map { it.fqName }.distinct()
.filter { candidate -> nonEmptyPackages.all { it.isSubpackageOf(candidate) } }
// Now there are all common ancestors of non-empty packages. Longest of them is the least common accessor:
.maxBy { it.asString().length }!!
}
}