[Commonizer] Clean-up in facade API
This commit is contained in:
@@ -9,6 +9,8 @@ dependencies {
|
||||
|
||||
compile(kotlinStdlib())
|
||||
|
||||
compile(project(":kotlin-native:kotlin-native-utils"))
|
||||
|
||||
testCompile(commonDep("junit:junit"))
|
||||
testCompile(projectTests(":compiler:tests-common"))
|
||||
|
||||
|
||||
+5
-3
@@ -5,13 +5,15 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.commonizer
|
||||
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||
|
||||
// N.B. TargetPlatform/SimplePlatform are non exhaustive enough to address both target platforms such as
|
||||
// JVM, JS and concrete Kotlin/Native targets, e.g. macos_x64, ios_x64, linux_x64.
|
||||
sealed class TargetId
|
||||
sealed class Target
|
||||
|
||||
data class ConcreteTargetId(val name: String) : TargetId()
|
||||
data class InputTarget(val name: String, val konanTarget: KonanTarget? = null) : Target()
|
||||
|
||||
data class CommonTargetId(val targets: Set<TargetId>) : TargetId() {
|
||||
data class OutputTarget(val targets: Set<Target>) : Target() {
|
||||
init {
|
||||
require(targets.isNotEmpty())
|
||||
}
|
||||
+5
-5
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.TargetId
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.Target
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedMemberScope.Companion.plusAssign
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedPackageFragmentProvider.Companion.plusAssign
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.*
|
||||
@@ -21,12 +21,12 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
internal class DeclarationsBuilderVisitor(
|
||||
private val storageManager: StorageManager,
|
||||
private val builtIns: KotlinBuiltIns,
|
||||
private val collector: (TargetId, Collection<ModuleDescriptor>) -> Unit
|
||||
private val collector: (Target, Collection<ModuleDescriptor>) -> Unit
|
||||
) : NodeVisitor<List<DeclarationDescriptor?>, List<DeclarationDescriptor?>> {
|
||||
override fun visitRootNode(node: RootNode, data: List<DeclarationDescriptor?>): List<DeclarationDescriptor?> {
|
||||
val allTargets = (node.target + node.common()!!).map { it.targetId }
|
||||
val allTargets = (node.target + node.common()!!).map { it.target }
|
||||
|
||||
val modulesByTargets = HashMap<TargetId, MutableList<ModuleDescriptorImpl>>()
|
||||
val modulesByTargets = HashMap<Target, MutableList<ModuleDescriptorImpl>>()
|
||||
|
||||
// collect module descriptors:
|
||||
for (moduleNode in node.modules) {
|
||||
@@ -45,7 +45,7 @@ internal class DeclarationsBuilderVisitor(
|
||||
|
||||
// return result (preserve platforms order):
|
||||
for (target in allTargets) {
|
||||
collector(target, modulesByTargets[target]!!)
|
||||
collector(target, modulesByTargets.getValue(target))
|
||||
}
|
||||
|
||||
return noReturningDeclarations()
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@ private fun Module.buildDescriptor(
|
||||
moduleName = name,
|
||||
storageManager = storageManager,
|
||||
builtIns = builtIns,
|
||||
capabilities = emptyMap() // TODO: specify capabilities
|
||||
capabilities = emptyMap() // TODO: preserve capabilities from the original module descriptors, KT-33998
|
||||
)
|
||||
|
||||
output[index] = moduleDescriptor
|
||||
|
||||
-3
@@ -27,9 +27,6 @@ internal fun PropertyNode.buildDescriptors(
|
||||
val markAsExpectAndActual = commonProperty != null && commonProperty.kind != CallableMemberDescriptor.Kind.SYNTHESIZED
|
||||
|
||||
target.forEachIndexed { index, property ->
|
||||
// target property is DELEGATION
|
||||
// AND
|
||||
// the property it overrides is actual
|
||||
property?.buildDescriptor(output, index, containingDeclarations, storageManager, isActual = markAsExpectAndActual)
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -31,7 +31,8 @@ private class DefaultModalityCommonizer : ModalityCommonizer {
|
||||
return !error
|
||||
}
|
||||
|
||||
private fun getNext(current: Modality, next: Modality): Modality? = when {
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
private inline fun getNext(current: Modality, next: Modality): Modality? = when {
|
||||
current == Modality.FINAL && next == Modality.OPEN -> Modality.FINAL
|
||||
current == Modality.OPEN && next == Modality.FINAL -> Modality.FINAL
|
||||
current == next -> current
|
||||
|
||||
+1
-1
@@ -106,7 +106,7 @@ private fun areAbbreviatedTypesEqual(
|
||||
return false
|
||||
|
||||
// N.B. both lists of arguments are already known to be of the same size
|
||||
for (i in 0 until a.arguments.size) {
|
||||
for (i in a.arguments.indices) {
|
||||
val aArg = a.arguments[i]
|
||||
val bArg = b.arguments[i]
|
||||
|
||||
|
||||
@@ -13,26 +13,24 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.mergeRoots
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
|
||||
class CommonizationParameters {
|
||||
private val modulesByTargets = LinkedHashMap<ConcreteTargetId, Collection<ModuleDescriptor>>()
|
||||
// use linked hash map to preserve order
|
||||
private val modulesByTargets = LinkedHashMap<InputTarget, Collection<ModuleDescriptor>>()
|
||||
|
||||
fun addTarget(targetName: String, modules: Collection<ModuleDescriptor>): CommonizationParameters {
|
||||
val targetId = ConcreteTargetId(targetName)
|
||||
require(targetId !in modulesByTargets) {
|
||||
"Target $targetId is already added"
|
||||
}
|
||||
fun addTarget(target: InputTarget, modules: Collection<ModuleDescriptor>): CommonizationParameters {
|
||||
require(target !in modulesByTargets) { "Target $target is already added" }
|
||||
|
||||
val modulesWithUniqueNames = modules.groupingBy { it.name }.eachCount()
|
||||
require(modulesWithUniqueNames.size == modules.size) {
|
||||
"Modules with duplicated names found: ${modulesWithUniqueNames.filter { it.value > 1 }}"
|
||||
}
|
||||
|
||||
modulesByTargets[targetId] = modules
|
||||
modulesByTargets[target] = modules
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
// get them as ordered immutable collection (List) for further processing
|
||||
fun getModulesByTargets(): List<Pair<ConcreteTargetId, Collection<ModuleDescriptor>>> =
|
||||
fun getModulesByTargets(): List<Pair<InputTarget, Collection<ModuleDescriptor>>> =
|
||||
modulesByTargets.map { it.key to it.value }
|
||||
|
||||
fun hasIntersection(): Boolean {
|
||||
@@ -51,9 +49,16 @@ sealed class CommonizationResult
|
||||
object NothingToCommonize : CommonizationResult()
|
||||
|
||||
class CommonizationPerformed(
|
||||
val commonModules: Collection<ModuleDescriptor>,
|
||||
val modulesByTargets: Map<String, Collection<ModuleDescriptor>>
|
||||
) : CommonizationResult()
|
||||
val modulesByTargets: Map<Target, Collection<ModuleDescriptor>>
|
||||
) : CommonizationResult() {
|
||||
val commonTarget: OutputTarget by lazy {
|
||||
modulesByTargets.keys.filterIsInstance<OutputTarget>().single()
|
||||
}
|
||||
|
||||
val concreteTargets: Set<InputTarget> by lazy {
|
||||
modulesByTargets.keys.filterIsInstance<InputTarget>().toSet()
|
||||
}
|
||||
}
|
||||
|
||||
fun runCommonization(parameters: CommonizationParameters): CommonizationResult {
|
||||
if (!parameters.hasIntersection())
|
||||
@@ -66,24 +71,14 @@ fun runCommonization(parameters: CommonizationParameters): CommonizationResult {
|
||||
// commonize:
|
||||
mergedTree.accept(CommonizationVisitor(mergedTree), Unit)
|
||||
|
||||
var commonModules: Collection<ModuleDescriptor>? = null
|
||||
val otherModulesByTargets = LinkedHashMap<String, Collection<ModuleDescriptor>>()
|
||||
val modulesByTargets = LinkedHashMap<Target, Collection<ModuleDescriptor>>() // use linked hash map to preserve order
|
||||
|
||||
// build resulting descriptors:
|
||||
val visitor = DeclarationsBuilderVisitor(storageManager, DefaultBuiltIns.Instance) { targetId, commonizedModules ->
|
||||
when (targetId) {
|
||||
is CommonTargetId -> {
|
||||
check(commonModules == null)
|
||||
commonModules = commonizedModules
|
||||
}
|
||||
is ConcreteTargetId -> {
|
||||
val targetName = targetId.name
|
||||
check(targetName !in otherModulesByTargets)
|
||||
otherModulesByTargets[targetName] = commonizedModules
|
||||
}
|
||||
}
|
||||
val visitor = DeclarationsBuilderVisitor(storageManager, DefaultBuiltIns.Instance) { target, commonizedModules ->
|
||||
check(target !in modulesByTargets)
|
||||
modulesByTargets[target] = commonizedModules
|
||||
}
|
||||
mergedTree.accept(visitor, DeclarationsBuilderVisitor.noContainingDeclarations())
|
||||
|
||||
return CommonizationPerformed(commonModules!!, otherModulesByTargets)
|
||||
return CommonizationPerformed(modulesByTargets)
|
||||
}
|
||||
|
||||
+4
-3
@@ -5,8 +5,9 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
data class Module(
|
||||
val name: Name
|
||||
) : Declaration
|
||||
data class Module(val name: Name) : Declaration {
|
||||
constructor(descriptor: ModuleDescriptor) : this(descriptor.name)
|
||||
}
|
||||
|
||||
+1
-3
@@ -7,6 +7,4 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
|
||||
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
data class Package(
|
||||
val fqName: FqName
|
||||
) : Declaration
|
||||
data class Package(val fqName: FqName) : Declaration
|
||||
|
||||
+2
-2
@@ -5,6 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.TargetId
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.Target
|
||||
|
||||
data class Root(val targetId: TargetId) : Declaration
|
||||
data class Root(val target: Target) : Declaration
|
||||
|
||||
+10
-10
@@ -12,39 +12,39 @@ import org.jetbrains.kotlin.descriptors.commonizer.core.*
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.firstNonNull
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.RootNode.ClassifiersCacheImpl
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.storage.NullableLazyValue
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
|
||||
internal fun buildRootNode(
|
||||
targets: List<ConcreteTargetId>
|
||||
storageManager: StorageManager,
|
||||
targets: List<InputTarget>
|
||||
): RootNode = RootNode(
|
||||
target = targets.map { Root(it) },
|
||||
common = LockBasedStorageManager.NO_LOCKS.createNullableLazyValue {
|
||||
Root(CommonTargetId(targets.toSet()))
|
||||
common = storageManager.createNullableLazyValue {
|
||||
Root(OutputTarget(targets.toSet()))
|
||||
}
|
||||
)
|
||||
|
||||
internal fun buildModuleNode(
|
||||
moduleName: Name,
|
||||
storageManager: StorageManager,
|
||||
modules: List<ModuleDescriptor?>
|
||||
): ModuleNode = buildNode(
|
||||
storageManager = LockBasedStorageManager.NO_LOCKS,
|
||||
storageManager = storageManager,
|
||||
descriptors = modules,
|
||||
targetDeclarationProducer = { Module(moduleName) },
|
||||
commonValueProducer = { Module(moduleName) },
|
||||
targetDeclarationProducer = ::Module,
|
||||
commonValueProducer = { Module(it.firstNonNull().name) },
|
||||
recursionMarker = null,
|
||||
nodeProducer = ::ModuleNode
|
||||
)
|
||||
|
||||
internal fun buildPackageNode(
|
||||
storageManager: StorageManager,
|
||||
packageFqName: FqName,
|
||||
packageMemberScopes: List<MemberScope?>
|
||||
): PackageNode = buildNode(
|
||||
storageManager = LockBasedStorageManager.NO_LOCKS,
|
||||
storageManager = storageManager,
|
||||
descriptors = packageMemberScopes,
|
||||
targetDeclarationProducer = { Package(packageFqName) },
|
||||
commonValueProducer = { Package(packageFqName) },
|
||||
|
||||
+1
-2
@@ -22,10 +22,9 @@ import org.jetbrains.kotlin.utils.alwaysTrue
|
||||
internal fun mergeModules(
|
||||
storageManager: StorageManager,
|
||||
cacheRW: RootNode.ClassifiersCacheImpl,
|
||||
moduleName: Name,
|
||||
modules: List<ModuleDescriptor?>
|
||||
): ModuleNode {
|
||||
val node = buildModuleNode(moduleName, modules)
|
||||
val node = buildModuleNode(storageManager, modules)
|
||||
|
||||
val packageMemberScopesMap = CommonizedGroupMap<FqName, MemberScope>(modules.size)
|
||||
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ internal fun mergePackages(
|
||||
packageFqName: FqName,
|
||||
packageMemberScopes: List<MemberScope?>
|
||||
): PackageNode {
|
||||
val node = buildPackageNode(packageFqName, packageMemberScopes)
|
||||
val node = buildPackageNode(storageManager, packageFqName, packageMemberScopes)
|
||||
|
||||
val propertiesMap = CommonizedGroupMap<PropertyApproximationKey, PropertyDescriptor>(packageMemberScopes.size)
|
||||
val functionsMap = CommonizedGroupMap<FunctionApproximationKey, SimpleFunctionDescriptor>(packageMemberScopes.size)
|
||||
|
||||
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.ConcreteTargetId
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.InputTarget
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.RootNode
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildRootNode
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -15,9 +15,9 @@ import org.jetbrains.kotlin.storage.StorageManager
|
||||
|
||||
internal fun mergeRoots(
|
||||
storageManager: StorageManager,
|
||||
modulesByTargets: List<Pair<ConcreteTargetId, Collection<ModuleDescriptor>>>
|
||||
modulesByTargets: List<Pair<InputTarget, Collection<ModuleDescriptor>>>
|
||||
): RootNode {
|
||||
val node = buildRootNode(modulesByTargets.map { it.first })
|
||||
val node = buildRootNode(storageManager, modulesByTargets.map { it.first })
|
||||
|
||||
val modulesMap = CommonizedGroupMap<Name, ModuleDescriptor>(modulesByTargets.size)
|
||||
|
||||
@@ -27,8 +27,8 @@ internal fun mergeRoots(
|
||||
}
|
||||
}
|
||||
|
||||
for ((moduleName, modulesGroup) in modulesMap) {
|
||||
node.modules += mergeModules(storageManager, node.cache, moduleName, modulesGroup.toList())
|
||||
for ((_, modulesGroup) in modulesMap) {
|
||||
node.modules += mergeModules(storageManager, node.cache, modulesGroup.toList())
|
||||
}
|
||||
|
||||
return node
|
||||
|
||||
+36
-23
@@ -32,12 +32,12 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() {
|
||||
}
|
||||
|
||||
fun Collection<ModuleDescriptor>.eachModuleAsTarget() = mapIndexed { index, moduleDescriptor ->
|
||||
"target_$index" to moduleDescriptor
|
||||
InputTarget("target_$index") to moduleDescriptor
|
||||
}.toMap().toCommonizationParameters()
|
||||
|
||||
fun Map<String, ModuleDescriptor>.toCommonizationParameters() = CommonizationParameters().also {
|
||||
forEach { (targetName, moduleDescriptor) ->
|
||||
it.addTarget(targetName, listOf(moduleDescriptor))
|
||||
fun Map<InputTarget, ModuleDescriptor>.toCommonizationParameters() = CommonizationParameters().also {
|
||||
forEach { (target, moduleDescriptor) ->
|
||||
it.addTarget(target, listOf(moduleDescriptor))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -71,7 +71,7 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() {
|
||||
.also(::assertIsDirectory)
|
||||
}
|
||||
|
||||
protected val sourceModuleRoots: Pair<Set<File>, Set<File>>
|
||||
protected val sourceModuleRoots: Triple<Set<File>, Set<File>, File>
|
||||
get() {
|
||||
val testDataDir = testDataDir
|
||||
|
||||
@@ -89,19 +89,21 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() {
|
||||
?.toSet()
|
||||
?.also { it.forEach(::assertIsDirectory) }
|
||||
|
||||
val commonRoot = commonizedRoots?.singleOrNull { it.name == "common" }
|
||||
|
||||
check(
|
||||
!originalRoots.isNullOrEmpty() && !commonizedRoots.isNullOrEmpty()
|
||||
&& (originalRoots.map { it.name } + "common").toSet() == commonizedRoots.map { it.name }.toSet()
|
||||
!originalRoots.isNullOrEmpty() && !commonizedRoots.isNullOrEmpty() && commonRoot != null
|
||||
&& (originalRoots + commonRoot).map { it.name }.toSet() == commonizedRoots.map { it.name }.toSet()
|
||||
) {
|
||||
"Source module misconfiguration in $testDataDir"
|
||||
}
|
||||
|
||||
return originalRoots to commonizedRoots
|
||||
return Triple(originalRoots, commonizedRoots - commonRoot, commonRoot)
|
||||
}
|
||||
|
||||
protected val sourceModuleDescriptors: Pair<Map<String, ModuleDescriptor>, Map<String, ModuleDescriptor>>
|
||||
protected val sourceModuleDescriptors: Pair<Map<InputTarget, ModuleDescriptor>, Map<Target, ModuleDescriptor>>
|
||||
get() {
|
||||
fun analyzeTarget(targetRoot: File): Pair<String, ModuleDescriptor> {
|
||||
fun analyzeTarget(targetRoot: File): ModuleDescriptor {
|
||||
val environment = createEnvironment(targetRoot.parentFile.parentFile.name)
|
||||
val psiFactory = KtPsiFactory(environment.project)
|
||||
|
||||
@@ -110,7 +112,7 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() {
|
||||
.map { psiFactory.createFile(it.name, doLoadFile(it)) }
|
||||
.toList()
|
||||
|
||||
val moduleDescriptor = CommonResolverForModuleFactory.analyzeFiles(
|
||||
return CommonResolverForModuleFactory.analyzeFiles(
|
||||
files = psiFiles,
|
||||
moduleName = environment.moduleName,
|
||||
dependOnBuiltIns = true,
|
||||
@@ -118,11 +120,19 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() {
|
||||
) { content ->
|
||||
environment.createPackagePartProvider(content.moduleContentScope)
|
||||
}.moduleDescriptor
|
||||
|
||||
return targetRoot.name to moduleDescriptor
|
||||
}
|
||||
|
||||
return sourceModuleRoots.first.map(::analyzeTarget).toMap() to sourceModuleRoots.second.map(::analyzeTarget).toMap()
|
||||
val originalModules = sourceModuleRoots.first
|
||||
.map { InputTarget(it.name) to analyzeTarget(it) }
|
||||
.toMap()
|
||||
|
||||
val commonizedModules = sourceModuleRoots.second
|
||||
.map { InputTarget(it.name) to analyzeTarget(it) }
|
||||
.toMap()
|
||||
|
||||
val commonModule = OutputTarget(commonizedModules.keys) to analyzeTarget(sourceModuleRoots.third)
|
||||
|
||||
return originalModules to commonizedModules + commonModule
|
||||
}
|
||||
|
||||
protected fun doTestSuccessfulCommonization() {
|
||||
@@ -131,23 +141,26 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() {
|
||||
val result = runCommonization(originalModules.toCommonizationParameters())
|
||||
assertCommonizationPerformed(result)
|
||||
|
||||
val commonModuleAsExpected = commonizedModules.getValue("common")
|
||||
val commonModuleByCommonizer = result.commonModules.single()
|
||||
val commonTarget = commonizedModules.keys.filterIsInstance<OutputTarget>().single()
|
||||
assertEquals(commonTarget, result.commonTarget)
|
||||
|
||||
val commonModuleAsExpected = commonizedModules.getValue(commonTarget)
|
||||
val commonModuleByCommonizer = result.modulesByTargets.getValue(commonTarget).single()
|
||||
|
||||
assertValidModule(commonModuleAsExpected)
|
||||
assertValidModule(commonModuleByCommonizer)
|
||||
assertModulesAreEqual(commonModuleAsExpected, commonModuleByCommonizer, "\"common\" target")
|
||||
assertModulesAreEqual(commonModuleAsExpected, commonModuleByCommonizer, "\"$commonTarget\" target")
|
||||
|
||||
val concreteTargetNames = commonizedModules.keys - "common"
|
||||
assertEquals(concreteTargetNames, result.modulesByTargets.keys)
|
||||
val concreteTargets = commonizedModules.keys - commonTarget
|
||||
assertEquals(concreteTargets, result.concreteTargets)
|
||||
|
||||
for (targetName in concreteTargetNames) {
|
||||
val targetModuleAsExpected = commonizedModules.getValue(targetName)
|
||||
val targetModuleByCommonizer = result.modulesByTargets.getValue(targetName).single()
|
||||
for (target in concreteTargets) {
|
||||
val targetModuleAsExpected = commonizedModules.getValue(target)
|
||||
val targetModuleByCommonizer = result.modulesByTargets.getValue(target).single()
|
||||
|
||||
assertValidModule(targetModuleAsExpected)
|
||||
assertValidModule(targetModuleByCommonizer)
|
||||
assertModulesAreEqual(targetModuleAsExpected, targetModuleByCommonizer, "\"$targetName\" target")
|
||||
assertModulesAreEqual(targetModuleAsExpected, targetModuleByCommonizer, "\"$target\" target")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -37,7 +37,7 @@ class CommonizerFacadeTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun nothingToCommonize2() {
|
||||
fun commonized() {
|
||||
val modules = listOf(
|
||||
mockEmptyModule("<foo>"),
|
||||
mockEmptyModule("<foo>")
|
||||
@@ -47,11 +47,11 @@ class CommonizerFacadeTest {
|
||||
|
||||
assertCommonizationPerformed(result)
|
||||
|
||||
assertSingleModuleForTarget("<foo>", result.commonModules)
|
||||
assertSingleModuleForTarget("<foo>", result.modulesByTargets.getValue(result.commonTarget))
|
||||
|
||||
assertEquals(2, result.modulesByTargets.size)
|
||||
for (modulesSamePlatform in result.modulesByTargets.values) {
|
||||
assertSingleModuleForTarget("<foo>", modulesSamePlatform)
|
||||
assertEquals(2, result.concreteTargets.size)
|
||||
for (target in result.concreteTargets) {
|
||||
assertSingleModuleForTarget("<foo>", result.modulesByTargets.getValue(target))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-3
@@ -10,10 +10,8 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.EMPTY_CLASSIFIERS_CACHE
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.ExtensionReceiver
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType
|
||||
import org.jetbrains.kotlin.types.UnwrappedType
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import org.junit.Test
|
||||
|
||||
@TypeRefinement
|
||||
class DefaultExtensionReceiverCommonizerTest : AbstractCommonizerTest<ExtensionReceiver?, UnwrappedType?>() {
|
||||
|
||||
@Test
|
||||
@@ -56,7 +54,6 @@ class DefaultExtensionReceiverCommonizerTest : AbstractCommonizerTest<ExtensionR
|
||||
override fun createCommonizer() = ExtensionReceiverCommonizer.default(EMPTY_CLASSIFIERS_CACHE)
|
||||
}
|
||||
|
||||
@TypeRefinement
|
||||
private fun mockExtensionReceiver(typeFqName: String) = ExtensionReceiver(
|
||||
annotations = Annotations.EMPTY,
|
||||
type = mockClassType(typeFqName).unwrap()
|
||||
|
||||
-2
@@ -19,11 +19,9 @@ import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.UnwrappedType
|
||||
import org.jetbrains.kotlin.types.getAbbreviation
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
@TypeRefinement
|
||||
class DefaultTypeCommonizerTest : AbstractCommonizerTest<KotlinType, UnwrappedType>() {
|
||||
|
||||
private lateinit var cache: ClassifiersCacheImpl
|
||||
|
||||
-2
@@ -11,10 +11,8 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.TypeParameter
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import org.junit.Test
|
||||
|
||||
@TypeRefinement
|
||||
class DefaultTypeParameterCommonizerTest : AbstractCommonizerTest<TypeParameter, TypeParameter>() {
|
||||
override fun createCommonizer() = TypeParameterCommonizer.default(EMPTY_CLASSIFIERS_CACHE)
|
||||
|
||||
|
||||
-2
@@ -7,10 +7,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.core
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.EMPTY_CLASSIFIERS_CACHE
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.TypeParameter
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import org.junit.Test
|
||||
|
||||
@TypeRefinement
|
||||
class DefaultTypeParameterListCommonizerTest : AbstractCommonizerTest<List<TypeParameter>, List<TypeParameter>>() {
|
||||
|
||||
@Test
|
||||
|
||||
-2
@@ -13,10 +13,8 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.ValueParameter
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.UnwrappedType
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import org.junit.Test
|
||||
|
||||
@TypeRefinement
|
||||
class DefaultValueParameterCommonizerTest : AbstractCommonizerTest<ValueParameter, ValueParameter>() {
|
||||
|
||||
@Test
|
||||
|
||||
+1
-3
@@ -8,10 +8,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.core
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.EMPTY_CLASSIFIERS_CACHE
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.core.TestValueParameter.Companion.areEqual
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.ValueParameter
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import org.junit.Test
|
||||
|
||||
@TypeRefinement
|
||||
class DefaultValueParameterListCommonizerTest : AbstractCommonizerTest<List<ValueParameter>, List<ValueParameter>>() {
|
||||
|
||||
@Test
|
||||
@@ -174,7 +172,7 @@ class DefaultValueParameterListCommonizerTest : AbstractCommonizerTest<List<Valu
|
||||
else if (a == null || b == null || a.size != b.size)
|
||||
return false
|
||||
|
||||
for (i in 0 until a.size) {
|
||||
for (i in a.indices) {
|
||||
if (!areEqual(EMPTY_CLASSIFIERS_CACHE, a[i], b[i]))
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -7,18 +7,15 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedTypeAliasDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.*
|
||||
import org.jetbrains.kotlin.descriptors.impl.AbstractTypeAliasDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorBase
|
||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.parentOrNull
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
||||
import org.jetbrains.kotlin.types.refinement.TypeRefinement
|
||||
import kotlin.random.Random
|
||||
|
||||
// expected special name for module
|
||||
@@ -28,57 +25,41 @@ internal fun mockEmptyModule(moduleName: String): ModuleDescriptor {
|
||||
return module
|
||||
}
|
||||
|
||||
@TypeRefinement
|
||||
internal fun mockClassType(
|
||||
fqName: String,
|
||||
nullable: Boolean = false
|
||||
): KotlinType = LazyWrappedType(LockBasedStorageManager.NO_LOCKS) {
|
||||
val classFqName = FqName(fqName)
|
||||
|
||||
val classTypeConstructor = object : AbstractClassTypeConstructor(LockBasedStorageManager.NO_LOCKS) {
|
||||
lateinit var classDescriptor: ClassDescriptor
|
||||
override fun getParameters(): List<TypeParameterDescriptor> = emptyList()
|
||||
override fun computeSupertypes(): List<KotlinType> = emptyList()
|
||||
override fun isDenotable() = true
|
||||
override fun getDeclarationDescriptor() = classDescriptor
|
||||
override val supertypeLoopChecker = SupertypeLoopChecker.EMPTY
|
||||
override fun toString() = "class type constructor ${declarationDescriptor.name}"
|
||||
}
|
||||
val classDescriptor = CommonizedClassDescriptor(
|
||||
storageManager = LockBasedStorageManager.NO_LOCKS,
|
||||
containingDeclaration = createPackageFragmentForClassifier(classFqName),
|
||||
annotations = Annotations.EMPTY,
|
||||
name = classFqName.shortName(),
|
||||
kind = ClassKind.CLASS,
|
||||
modality = Modality.FINAL,
|
||||
visibility = Visibilities.PUBLIC,
|
||||
isCompanion = false,
|
||||
isData = false,
|
||||
isInline = false,
|
||||
isInner = false,
|
||||
isExternal = false,
|
||||
isExpect = false,
|
||||
isActual = false,
|
||||
companionObjectName = null,
|
||||
supertypes = emptyList()
|
||||
)
|
||||
|
||||
val classDescriptor = object : ClassDescriptorBase(
|
||||
/*storageManager =*/ LockBasedStorageManager.NO_LOCKS,
|
||||
/*containingDeclaration =*/ createPackageFragmentForClassifier(classFqName),
|
||||
/*name =*/ classFqName.shortName(),
|
||||
/*source =*/ SourceElement.NO_SOURCE,
|
||||
/*isExternal =*/ false
|
||||
) {
|
||||
override fun getStaticScope() = MemberScope.Empty
|
||||
override fun getConstructors(): List<ClassConstructorDescriptor> = emptyList()
|
||||
override fun getCompanionObjectDescriptor(): ClassDescriptor? = null
|
||||
override fun getKind() = ClassKind.CLASS
|
||||
override fun getModality() = Modality.FINAL
|
||||
override fun getVisibility() = Visibilities.PUBLIC
|
||||
override fun isCompanionObject() = false
|
||||
override fun isData() = false
|
||||
override fun isInline() = false
|
||||
override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? = null
|
||||
override fun isExpect() = false
|
||||
override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner) = MemberScope.Empty
|
||||
override fun isActual() = false
|
||||
override fun getSealedSubclasses(): List<ClassDescriptor> = emptyList()
|
||||
override fun getTypeConstructor() = classTypeConstructor
|
||||
override fun isInner() = false
|
||||
override fun getDeclaredTypeParameters(): List<TypeParameterDescriptor> = emptyList()
|
||||
override val annotations = Annotations.EMPTY
|
||||
override fun toString() = "class descriptor $name"
|
||||
}
|
||||
classDescriptor.declaredTypeParameters = emptyList()
|
||||
|
||||
classTypeConstructor.classDescriptor = classDescriptor
|
||||
classDescriptor.initialize(
|
||||
unsubstitutedMemberScope = MemberScope.Empty,
|
||||
constructors = emptyList()
|
||||
)
|
||||
|
||||
createSimpleType(classTypeConstructor, nullable)
|
||||
classDescriptor.defaultType.makeNullableAsSpecified(nullable)
|
||||
}
|
||||
|
||||
@TypeRefinement
|
||||
internal fun mockTAType(
|
||||
fqName: String,
|
||||
nullable: Boolean = false,
|
||||
@@ -88,27 +69,24 @@ internal fun mockTAType(
|
||||
|
||||
val rightHandSideType = rightHandSideTypeProvider().lowerIfFlexible()
|
||||
|
||||
val typeAliasDescriptor = object : AbstractTypeAliasDescriptor(
|
||||
val typeAliasDescriptor = CommonizedTypeAliasDescriptor(
|
||||
storageManager = LockBasedStorageManager.NO_LOCKS,
|
||||
containingDeclaration = createPackageFragmentForClassifier(typeAliasFqName),
|
||||
annotations = Annotations.EMPTY,
|
||||
name = typeAliasFqName.shortName(),
|
||||
sourceElement = SourceElement.NO_SOURCE,
|
||||
visibilityImpl = Visibilities.PUBLIC
|
||||
) {
|
||||
private val myDefaultType by lazy { createSimpleType(typeConstructor, nullable) }
|
||||
override val storageManager = LockBasedStorageManager.NO_LOCKS
|
||||
override fun getTypeConstructorTypeParameters(): List<TypeParameterDescriptor> = emptyList()
|
||||
override val underlyingType by lazy { rightHandSideType.getAbbreviation() ?: rightHandSideType }
|
||||
override fun getDefaultType() = myDefaultType
|
||||
override val classDescriptor get() = expandedType.constructor.declarationDescriptor as ClassDescriptor?
|
||||
override val constructors: Collection<TypeAliasConstructorDescriptor> = emptyList()
|
||||
override fun substitute(substitutor: TypeSubstitutor) = this
|
||||
override val expandedType by lazy { rightHandSideType }
|
||||
}.apply {
|
||||
initialize(emptyList())
|
||||
}
|
||||
visibility = Visibilities.PUBLIC,
|
||||
isActual = false
|
||||
)
|
||||
|
||||
(rightHandSideType.getAbbreviatedType()?.expandedType ?: rightHandSideType).withAbbreviation(typeAliasDescriptor.defaultType)
|
||||
typeAliasDescriptor.initialize(
|
||||
declaredTypeParameters = emptyList(),
|
||||
underlyingType = rightHandSideType.getAbbreviation() ?: rightHandSideType,
|
||||
expandedType = rightHandSideType
|
||||
)
|
||||
|
||||
(rightHandSideType.getAbbreviatedType()?.expandedType ?: rightHandSideType)
|
||||
.withAbbreviation(typeAliasDescriptor.defaultType)
|
||||
.makeNullableAsSpecified(nullable)
|
||||
}
|
||||
|
||||
private fun createPackageFragmentForClassifier(classifierFqName: FqName): PackageFragmentDescriptor =
|
||||
@@ -126,16 +104,6 @@ private fun createPackageFragmentForClassifier(classifierFqName: FqName): Packag
|
||||
override fun toString() = "package $name"
|
||||
}
|
||||
|
||||
private fun createSimpleType(typeConstructor: TypeConstructor, nullable: Boolean): SimpleType =
|
||||
KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(
|
||||
annotations = Annotations.EMPTY,
|
||||
constructor = typeConstructor,
|
||||
arguments = emptyList(),
|
||||
nullable = nullable,
|
||||
memberScope = MemberScope.Empty,
|
||||
refinedTypeFactory = { null }
|
||||
)
|
||||
|
||||
internal val EMPTY_CLASSIFIERS_CACHE = object : ClassifiersCache {
|
||||
override val classes: Map<FqName, ClassNode> get() = emptyMap()
|
||||
override val typeAliases: Map<FqName, TypeAliasNode> get() = emptyMap()
|
||||
|
||||
Reference in New Issue
Block a user