From 00d780b650bf4328a3029572bf48ff50f8db6ce4 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Mon, 29 Jul 2019 15:58:56 +0700 Subject: [PATCH] Source libraries: Export source libs and support tests for them --- .../kotlin/backend/konan/FeaturedLibraries.kt | 17 ++++++----------- .../kotlin/backend/konan/lower/TestProcessor.kt | 14 +++++++++++++- .../backend/konan/objcexport/ObjCExport.kt | 17 +++++++++-------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FeaturedLibraries.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FeaturedLibraries.kt index 818daec4aaf..de5c9196e72 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FeaturedLibraries.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/FeaturedLibraries.kt @@ -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 { - val exportedLibraries = this.config.exportedLibraries.toSet() +internal fun Context.getExportedDependencies(): List = getDescriptorsFromFeaturedLibraries((config.exportedLibraries + config.sourceLibraries).toSet()) +internal fun Context.getSourceLibraryDescriptors(): List = getDescriptorsFromFeaturedLibraries(config.sourceLibraries.toSet()) - val result = this.moduleDescriptor.allDependencyModules.filter { - val origin = it.konanModuleOrigin - when (origin) { +private fun Context.getDescriptorsFromFeaturedLibraries(featuredLibraries: Set) = + 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, diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt index 2a0c349d2ba..0e5c719371f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/TestProcessor.kt @@ -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) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt index a7cb9ab1167..c5ff015adb6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt @@ -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 }!! + } }