[Commonizer] Don't commonize built-ins

This commit is contained in:
Dmitriy Dolovov
2021-01-29 15:51:57 +03:00
parent 585cd64b9a
commit 3b91d1c5e5
13 changed files with 86 additions and 196 deletions
@@ -5,29 +5,15 @@
package org.jetbrains.kotlin.descriptors.commonizer package org.jetbrains.kotlin.descriptors.commonizer
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import java.io.File import java.io.File
class TargetProvider( class TargetProvider(
val target: LeafTarget, val target: LeafTarget,
val builtInsClass: Class<out KotlinBuiltIns>,
val builtInsProvider: BuiltInsProvider,
val modulesProvider: ModulesProvider, val modulesProvider: ModulesProvider,
val dependeeModulesProvider: ModulesProvider? val dependeeModulesProvider: ModulesProvider?
) )
interface BuiltInsProvider {
fun loadBuiltIns(): KotlinBuiltIns
companion object {
val defaultBuiltInsProvider = object : BuiltInsProvider {
override fun loadBuiltIns() = DefaultBuiltIns.Instance
}
}
}
interface ModulesProvider { interface ModulesProvider {
class ModuleInfo( class ModuleInfo(
val name: String, val name: String,
@@ -5,11 +5,8 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir package org.jetbrains.kotlin.descriptors.commonizer.cir
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
interface CirRoot : CirDeclaration { interface CirRoot : CirDeclaration {
val target: CommonizerTarget val target: CommonizerTarget
val builtInsClass: String
val builtInsProvider: BuiltInsProvider
} }
@@ -5,27 +5,10 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir.factory package org.jetbrains.kotlin.descriptors.commonizer.cir.factory
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirRootImpl import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirRootImpl
object CirRootFactory { object CirRootFactory {
fun create( fun create(target: CommonizerTarget): CirRoot = CirRootImpl(target = target)
target: CommonizerTarget,
builtInsClass: String,
builtInsProvider: BuiltInsProvider
): CirRoot {
if (target is LeafTarget) {
check((target.konanTarget != null) == (builtInsClass == KonanBuiltIns::class.java.name))
}
return CirRootImpl(
target = target,
builtInsClass = builtInsClass,
builtInsProvider = builtInsProvider
)
}
} }
@@ -5,12 +5,9 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir.impl package org.jetbrains.kotlin.descriptors.commonizer.cir.impl
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
data class CirRootImpl( data class CirRootImpl(
override val target: CommonizerTarget, override val target: CommonizerTarget
override val builtInsClass: String,
override val builtInsProvider: BuiltInsProvider
) : CirRoot ) : CirRoot
@@ -5,9 +5,6 @@
package org.jetbrains.kotlin.descriptors.commonizer.core package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget
import org.jetbrains.kotlin.descriptors.commonizer.SharedTarget import org.jetbrains.kotlin.descriptors.commonizer.SharedTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
@@ -15,31 +12,17 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirRootFactory
class RootCommonizer : AbstractStandardCommonizer<CirRoot, CirRoot>() { class RootCommonizer : AbstractStandardCommonizer<CirRoot, CirRoot>() {
private val leafTargets = mutableSetOf<LeafTarget>() private val leafTargets = mutableSetOf<LeafTarget>()
private var konanBuiltInsProvider: BuiltInsProvider? = null
override fun commonizationResult() = CirRootFactory.create( override fun commonizationResult() = CirRootFactory.create(
target = SharedTarget(leafTargets), target = SharedTarget(leafTargets)
builtInsClass = if (konanBuiltInsProvider != null) KonanBuiltIns::class.java.name else DefaultBuiltIns::class.java.name,
builtInsProvider = konanBuiltInsProvider ?: BuiltInsProvider.defaultBuiltInsProvider
) )
override fun initialize(first: CirRoot) { override fun initialize(first: CirRoot) {
leafTargets += first.target as LeafTarget leafTargets += first.target as LeafTarget
konanBuiltInsProvider = first.konanBuiltInsProvider
} }
override fun doCommonizeWith(next: CirRoot): Boolean { override fun doCommonizeWith(next: CirRoot): Boolean {
leafTargets += next.target as LeafTarget leafTargets += next.target as LeafTarget
// keep the first met KonanBuiltIns when all targets are Kotlin/Native
// otherwise use DefaultBuiltIns
if (konanBuiltInsProvider != null && next.konanBuiltInsProvider == null) {
konanBuiltInsProvider = null
}
return true return true
} }
private inline val CirRoot.konanBuiltInsProvider
get() = if (builtInsClass == KonanBuiltIns::class.java.name) builtInsProvider else null
} }
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.konan
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion
import org.jetbrains.kotlin.backend.common.serialization.metadata.metadataVersion import org.jetbrains.kotlin.backend.common.serialization.metadata.metadataVersion
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.* import org.jetbrains.kotlin.descriptors.commonizer.*
import org.jetbrains.kotlin.descriptors.commonizer.konan.NativeDistributionCommonizer.StatsType.* import org.jetbrains.kotlin.descriptors.commonizer.konan.NativeDistributionCommonizer.StatsType.*
import org.jetbrains.kotlin.descriptors.commonizer.stats.* import org.jetbrains.kotlin.descriptors.commonizer.stats.*
@@ -138,8 +137,7 @@ class NativeDistributionCommonizer(
val parameters = CommonizerParameters(statsCollector, ::logProgress).apply { val parameters = CommonizerParameters(statsCollector, ::logProgress).apply {
val storageManager = LockBasedStorageManager("Commonized modules") val storageManager = LockBasedStorageManager("Commonized modules")
val stdlibProvider = NativeDistributionStdlibProvider(storageManager, allLibraries.stdlib) dependeeModulesProvider = NativeDistributionStdlibProvider(storageManager, allLibraries.stdlib)
dependeeModulesProvider = stdlibProvider
allLibraries.librariesByTargets.forEach { (target, librariesToCommonize) -> allLibraries.librariesByTargets.forEach { (target, librariesToCommonize) ->
if (librariesToCommonize.libraries.isEmpty()) return@forEach if (librariesToCommonize.libraries.isEmpty()) return@forEach
@@ -149,8 +147,6 @@ class NativeDistributionCommonizer(
addTarget( addTarget(
TargetProvider( TargetProvider(
target = target, target = target,
builtInsClass = KonanBuiltIns::class.java,
builtInsProvider = stdlibProvider,
modulesProvider = modulesProvider, modulesProvider = modulesProvider,
dependeeModulesProvider = null // stdlib is already set as common dependency dependeeModulesProvider = null // stdlib is already set as common dependency
) )
@@ -5,10 +5,8 @@
package org.jetbrains.kotlin.descriptors.commonizer.konan package org.jetbrains.kotlin.descriptors.commonizer.konan
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo
import org.jetbrains.kotlin.descriptors.commonizer.utils.NativeFactories import org.jetbrains.kotlin.descriptors.commonizer.utils.NativeFactories
@@ -19,14 +17,13 @@ import java.io.File
internal class NativeDistributionStdlibProvider( internal class NativeDistributionStdlibProvider(
private val storageManager: StorageManager, private val storageManager: StorageManager,
private val stdlib: NativeLibrary private val stdlib: NativeLibrary
) : BuiltInsProvider, ModulesProvider { ) : ModulesProvider {
private val moduleInfo = ModuleInfo( private val moduleInfo = ModuleInfo(
name = KONAN_STDLIB_NAME, name = KONAN_STDLIB_NAME,
originalLocation = File(stdlib.library.libraryFile.absolutePath), originalLocation = File(stdlib.library.libraryFile.absolutePath),
cInteropAttributes = null cInteropAttributes = null
) )
override fun loadBuiltIns(): KotlinBuiltIns = loadStdlibModule().builtIns
override fun loadModuleInfos(): Map<String, ModuleInfo> = mapOf(KONAN_STDLIB_NAME to moduleInfo) override fun loadModuleInfos(): Map<String, ModuleInfo> = mapOf(KONAN_STDLIB_NAME to moduleInfo)
override fun loadModules(dependencies: Collection<ModuleDescriptor>): Map<String, ModuleDescriptor> { override fun loadModules(dependencies: Collection<ModuleDescriptor>): Map<String, ModuleDescriptor> {
@@ -102,11 +102,7 @@ class CirTreeMerger(
commonModuleInfos: Map<String, ModuleInfo>, commonModuleInfos: Map<String, ModuleInfo>,
dependeeModules: Collection<ModuleDescriptor> dependeeModules: Collection<ModuleDescriptor>
) { ) {
rootNode.targetDeclarations[targetIndex] = CirRootFactory.create( rootNode.targetDeclarations[targetIndex] = CirRootFactory.create(targetProvider.target)
targetProvider.target,
targetProvider.builtInsClass.name,
targetProvider.builtInsProvider
)
val targetDependeeModules = targetProvider.dependeeModulesProvider?.loadModules(dependeeModules)?.values.orEmpty() val targetDependeeModules = targetProvider.dependeeModulesProvider?.loadModules(dependeeModules)?.values.orEmpty()
val allDependeeModules = targetDependeeModules + dependeeModules val allDependeeModules = targetDependeeModules + dependeeModules
@@ -212,8 +212,6 @@ private class AnalyzedModules(
parameters.addTarget( parameters.addTarget(
TargetProvider( TargetProvider(
target = leafTarget, target = leafTarget,
builtInsClass = originalModule.builtIns::class.java,
builtInsProvider = MockBuiltInsProvider(originalModule.builtIns),
modulesProvider = MockModulesProvider.create(originalModule), modulesProvider = MockModulesProvider.create(originalModule),
dependeeModulesProvider = dependeeModules[leafTarget]?.let(MockModulesProvider::create) dependeeModulesProvider = dependeeModules[leafTarget]?.let(MockModulesProvider::create)
) )
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.descriptors.commonizer package org.jetbrains.kotlin.descriptors.commonizer
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.utils.MockModulesProvider import org.jetbrains.kotlin.descriptors.commonizer.utils.MockModulesProvider
import org.jetbrains.kotlin.descriptors.commonizer.utils.assertCommonizationPerformed import org.jetbrains.kotlin.descriptors.commonizer.utils.assertCommonizationPerformed
import org.junit.Test import org.junit.Test
@@ -65,8 +64,6 @@ class CommonizerFacadeTest {
it.addTarget( it.addTarget(
TargetProvider( TargetProvider(
target = LeafTarget(targetName), target = LeafTarget(targetName),
builtInsClass = DefaultBuiltIns::class.java,
builtInsProvider = BuiltInsProvider.defaultBuiltInsProvider,
modulesProvider = MockModulesProvider.create(moduleNames), modulesProvider = MockModulesProvider.create(moduleNames),
dependeeModulesProvider = null dependeeModulesProvider = null
) )
@@ -12,6 +12,8 @@ import kotlin.test.fail
abstract class AbstractCommonizerTest<T, R> { abstract class AbstractCommonizerTest<T, R> {
class ObjectsNotEqual(message: String) : Throwable(message)
@Test(expected = IllegalCommonizerStateException::class) @Test(expected = IllegalCommonizerStateException::class)
fun failOnNoVariantsSubmitted() { fun failOnNoVariantsSubmitted() {
createCommonizer().result createCommonizer().result
@@ -32,7 +34,7 @@ abstract class AbstractCommonizerTest<T, R> {
} }
val actual = commonized.result val actual = commonized.result
if (!isEqual(expected, actual)) fail("Expected: $expected\nActual: $actual") if (!isEqual(expected, actual)) throw ObjectsNotEqual("Expected: $expected\nActual: $actual")
} }
protected fun doTestFailure( protected fun doTestFailure(
@@ -5,169 +5,133 @@
package org.jetbrains.kotlin.descriptors.commonizer.core package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns
import org.jetbrains.kotlin.builtins.konan.KonanBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget
import org.jetbrains.kotlin.descriptors.commonizer.SharedTarget import org.jetbrains.kotlin.descriptors.commonizer.SharedTarget
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirRootFactory import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirRootFactory
import org.jetbrains.kotlin.descriptors.commonizer.utils.MockBuiltInsProvider
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.junit.Test import org.junit.Test
class RootCommonizerTest : AbstractCommonizerTest<CirRoot, CirRoot>() { class RootCommonizerTest : AbstractCommonizerTest<CirRoot, CirRoot>() {
@Test @Test
fun allAreNative() = doTestSuccess( fun allAreNative() = doTestSuccess(
expected = KONAN_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_x64", KonanTarget.IOS_X64), LeafTarget("ios_arm64", KonanTarget.IOS_ARM64),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64), LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
)
) )
), ).toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64", KonanTarget.IOS_X64)), LeafTarget("ios_x64", KonanTarget.IOS_X64).toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)), LeafTarget("ios_arm64", KonanTarget.IOS_ARM64).toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)) LeafTarget("ios_arm32", KonanTarget.IOS_ARM32).toMock()
) )
@Test @Test
fun jvmAndNative1() = doTestSuccess( fun jvmAndNative1() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("jvm1"),
LeafTarget("jvm1"), LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_x64", KonanTarget.IOS_X64), LeafTarget("jvm2")
LeafTarget("jvm2")
)
) )
), ).toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm1")), LeafTarget("jvm1").toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64", KonanTarget.IOS_X64)), LeafTarget("ios_x64", KonanTarget.IOS_X64).toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm2")) LeafTarget("jvm2").toMock()
) )
@Test @Test
fun jvmAndNative2() = doTestSuccess( fun jvmAndNative2() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_x64", KonanTarget.IOS_X64), LeafTarget("jvm"),
LeafTarget("jvm"), LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)
)
) )
), ).toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64", KonanTarget.IOS_X64)), LeafTarget("ios_x64", KonanTarget.IOS_X64).toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm")), LeafTarget("jvm").toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)) LeafTarget("ios_arm64", KonanTarget.IOS_ARM64).toMock()
) )
@Test @Test
fun noNative1() = doTestSuccess( fun noNative1() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("default1"),
LeafTarget("default1"), LeafTarget("default2"),
LeafTarget("default2"), LeafTarget("default3")
LeafTarget("default3")
)
) )
), ).toMock(),
DEFAULT_BUILT_INS.toMock(LeafTarget("default1")), LeafTarget("default1").toMock(),
DEFAULT_BUILT_INS.toMock(LeafTarget("default2")), LeafTarget("default2").toMock(),
DEFAULT_BUILT_INS.toMock(LeafTarget("default3")) LeafTarget("default3").toMock()
) )
@Test @Test
fun noNative2() = doTestSuccess( fun noNative2() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("jvm1"),
LeafTarget("jvm1"), LeafTarget("default"),
LeafTarget("default"), LeafTarget("jvm2")
LeafTarget("jvm2")
)
) )
), ).toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm1")), LeafTarget("jvm1").toMock(),
DEFAULT_BUILT_INS.toMock(LeafTarget("default")), LeafTarget("default").toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm2")) LeafTarget("jvm2").toMock()
) )
@Test @Test
fun noNative3() = doTestSuccess( fun noNative3() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("jvm1"),
LeafTarget("jvm1"), LeafTarget("jvm2"),
LeafTarget("jvm2"), LeafTarget("jvm3")
LeafTarget("jvm3")
)
) )
), ).toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm1")), LeafTarget("jvm1").toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm2")), LeafTarget("jvm2").toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm3")) LeafTarget("jvm3").toMock()
) )
@Test(expected = IllegalStateException::class) @Test(expected = ObjectsNotEqual::class)
fun misconfiguration1() = doTestSuccess( fun misconfiguration1() = doTestSuccess(
expected = KONAN_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("ios_x64", KonanTarget.IOS_X64),
LeafTarget("ios_x64", KonanTarget.IOS_X64), LeafTarget("ios_arm64", KonanTarget.IOS_ARM64),
LeafTarget("ios_arm64", KonanTarget.IOS_ARM64), LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)
)
) )
), ).toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_x64")), LeafTarget("ios_x64").toMock(), // KonanTarget is missing here!
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm64", KonanTarget.IOS_ARM64)), LeafTarget("ios_arm64", KonanTarget.IOS_ARM64).toMock(),
KONAN_BUILT_INS.toMock(LeafTarget("ios_arm32", KonanTarget.IOS_ARM32)) LeafTarget("ios_arm32", KonanTarget.IOS_ARM32).toMock()
) )
@Test(expected = IllegalStateException::class) @Test(expected = ObjectsNotEqual::class)
fun misconfiguration2() = doTestSuccess( fun misconfiguration2() = doTestSuccess(
expected = DEFAULT_BUILT_INS.toMock( expected = SharedTarget(
SharedTarget( setOf(
setOf( LeafTarget("jvm1"),
LeafTarget("jvm1"), LeafTarget("jvm2"),
LeafTarget("jvm2"), LeafTarget("jvm3")
LeafTarget("jvm3")
)
) )
), ).toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm1", KonanTarget.IOS_X64)), LeafTarget("jvm1", KonanTarget.IOS_X64).toMock(), // mistakenly specified KonanTarget!
JVM_BUILT_INS.toMock(LeafTarget("jvm2")), LeafTarget("jvm2").toMock(),
JVM_BUILT_INS.toMock(LeafTarget("jvm3")) LeafTarget("jvm3").toMock()
) )
override fun createCommonizer() = RootCommonizer() override fun createCommonizer() = RootCommonizer()
override fun isEqual(a: CirRoot?, b: CirRoot?) = override fun isEqual(a: CirRoot?, b: CirRoot?) = (a === b) || (a != null && b != null && a.target == b.target)
(a === b)
|| (a != null && b != null
&& a.target == b.target
&& a.builtInsClass == b.builtInsClass
&& a.builtInsClass == a.builtInsProvider.loadBuiltIns()::class.java.name
&& a.builtInsProvider.loadBuiltIns()::class.java == b.builtInsProvider.loadBuiltIns()::class.java)
private companion object { private companion object {
inline val KONAN_BUILT_INS get() = KonanBuiltIns(LockBasedStorageManager.NO_LOCKS) fun CommonizerTarget.toMock() = CirRootFactory.create(target = this)
inline val JVM_BUILT_INS get() = JvmBuiltIns(LockBasedStorageManager.NO_LOCKS, JvmBuiltIns.Kind.FROM_CLASS_LOADER)
inline val DEFAULT_BUILT_INS get() = DefaultBuiltIns.Instance
fun KotlinBuiltIns.toMock(target: CommonizerTarget) = CirRootFactory.create(
target = target,
builtInsClass = this::class.java.name,
builtInsProvider = MockBuiltInsProvider(this)
)
} }
} }
@@ -5,10 +5,8 @@
package org.jetbrains.kotlin.descriptors.commonizer.utils package org.jetbrains.kotlin.descriptors.commonizer.utils
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.commonizer.BuiltInsProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirClassFactory import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirClassFactory
@@ -150,10 +148,6 @@ internal val MOCK_CLASSIFIERS = CirKnownClassifiers(
dependeeLibraries = emptyMap() dependeeLibraries = emptyMap()
) )
internal class MockBuiltInsProvider(private val builtIns: KotlinBuiltIns) : BuiltInsProvider {
override fun loadBuiltIns() = builtIns
}
internal class MockModulesProvider private constructor( internal class MockModulesProvider private constructor(
private val modules: Map<String, ModuleDescriptor>, private val modules: Map<String, ModuleDescriptor>,
) : ModulesProvider { ) : ModulesProvider {