[Commonizer] Fine-grained use of KotlinBuiltIns

This commit is contained in:
Dmitriy Dolovov
2019-09-25 15:36:44 +07:00
parent 14fa3d30d5
commit 2cde0a800a
9 changed files with 136 additions and 17 deletions
+2 -1
View File
@@ -9,7 +9,8 @@ dependencies {
compile(kotlinStdlib())
compile(project(":kotlin-native:kotlin-native-utils"))
compile(project(":kotlin-native:kotlin-native-utils")) { isTransitive = false }
compile(project(":kotlin-native:kotlin-native-library-reader")) { isTransitive = false }
testCompile(commonDep("junit:junit"))
testCompile(projectTests(":compiler:tests-common"))
@@ -5,7 +5,6 @@
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.Target
@@ -20,7 +19,6 @@ import org.jetbrains.kotlin.utils.addIfNotNull
/** Builds and initializes the new tree of common descriptors */
internal class DeclarationsBuilderVisitor(
private val storageManager: StorageManager,
private val builtIns: KotlinBuiltIns,
private val collector: (Target, Collection<ModuleDescriptor>) -> Unit
) : NodeVisitor<List<DeclarationDescriptor?>, List<DeclarationDescriptor?>> {
override fun visitRootNode(node: RootNode, data: List<DeclarationDescriptor?>): List<DeclarationDescriptor?> {
@@ -54,7 +52,7 @@ internal class DeclarationsBuilderVisitor(
override fun visitModuleNode(node: ModuleNode, data: List<DeclarationDescriptor?>): List<ModuleDescriptorImpl?> {
// build module descriptors:
val moduleDescriptorsGroup = CommonizedGroup<ModuleDescriptorImpl>(node.dimension)
node.buildDescriptors(moduleDescriptorsGroup, storageManager, builtIns)
node.buildDescriptors(moduleDescriptorsGroup, storageManager)
val moduleDescriptors = moduleDescriptorsGroup.toList()
// build package fragments:
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.descriptors.commonizer.builder
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.Module
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.ModuleNode
@@ -15,21 +14,19 @@ import org.jetbrains.kotlin.storage.StorageManager
internal fun ModuleNode.buildDescriptors(
output: CommonizedGroup<ModuleDescriptorImpl>,
storageManager: StorageManager,
builtIns: KotlinBuiltIns
storageManager: StorageManager
) {
target.forEachIndexed { index, module ->
module?.buildDescriptor(output, index, storageManager, builtIns)
module?.buildDescriptor(output, index, storageManager)
}
common()?.buildDescriptor(output, indexOfCommon, storageManager, builtIns)
common()?.buildDescriptor(output, indexOfCommon, storageManager)
}
private fun Module.buildDescriptor(
output: CommonizedGroup<ModuleDescriptorImpl>,
index: Int,
storageManager: StorageManager,
builtIns: KotlinBuiltIns
storageManager: StorageManager
) {
val moduleDescriptor = ModuleDescriptorImpl(
moduleName = name,
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
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.mergedtree.ir.Module
import org.jetbrains.kotlin.name.Name
interface ModuleCommonizer : Commonizer<Module, Module> {
companion object {
fun default(): ModuleCommonizer = DefaultModuleCommonizer()
}
}
private class DefaultModuleCommonizer : ModuleCommonizer, AbstractStandardCommonizer<Module, Module>() {
private lateinit var name: Name
private var konanBuiltIns: KonanBuiltIns? = null
override fun commonizationResult() = Module(
name = name,
builtIns = konanBuiltIns ?: DefaultBuiltIns.Instance
)
override fun initialize(first: Module) {
name = first.name
konanBuiltIns = first.konanBuiltIns
}
override fun doCommonizeWith(next: Module): Boolean {
// keep the first met KonanBuiltIns when all targets are Kotlin/Native
// otherwise use DefaultBuiltIns
if (konanBuiltIns != null) {
konanBuiltIns = konanBuiltIns.takeIf { next.konanBuiltIns != null }
}
return true
}
private inline val Module.konanBuiltIns
get() = builtIns as? KonanBuiltIns
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.descriptors.commonizer
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.commonizer.builder.DeclarationsBuilderVisitor
import org.jetbrains.kotlin.descriptors.commonizer.core.CommonizationVisitor
@@ -74,7 +73,7 @@ fun runCommonization(parameters: CommonizationParameters): CommonizationResult {
val modulesByTargets = LinkedHashMap<Target, Collection<ModuleDescriptor>>() // use linked hash map to preserve order
// build resulting descriptors:
val visitor = DeclarationsBuilderVisitor(storageManager, DefaultBuiltIns.Instance) { target, commonizedModules ->
val visitor = DeclarationsBuilderVisitor(storageManager) { target, commonizedModules ->
check(target !in modulesByTargets)
modulesByTargets[target] = commonizedModules
}
@@ -5,9 +5,10 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.name.Name
data class Module(val name: Name) : Declaration {
constructor(descriptor: ModuleDescriptor) : this(descriptor.name)
data class Module(val name: Name, val builtIns: KotlinBuiltIns) : Declaration {
constructor(descriptor: ModuleDescriptor) : this(descriptor.name, descriptor.builtIns)
}
@@ -34,7 +34,7 @@ internal fun buildModuleNode(
storageManager = storageManager,
descriptors = modules,
targetDeclarationProducer = ::Module,
commonValueProducer = { Module(it.firstNonNull().name) },
commonValueProducer = { commonize(it, ModuleCommonizer.default()) },
recursionMarker = null,
nodeProducer = ::ModuleNode
)
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildModuleNode
import org.jetbrains.kotlin.descriptors.commonizer.toList
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.StorageManager
@@ -0,0 +1,79 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
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.mergedtree.ir.Module
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.junit.Test
class DefaultModuleCommonizerTest : AbstractCommonizerTest<Module, Module>() {
@Test
fun allAreNative() = doTestSuccess(
KONAN_BUILT_INS.toMock(),
KONAN_BUILT_INS.toMock(),
KONAN_BUILT_INS.toMock(),
KONAN_BUILT_INS.toMock()
)
@Test
fun jvmAndNative1() = doTestSuccess(
DEFAULT_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock(),
KONAN_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock()
)
@Test
fun jvmAndNative2() = doTestSuccess(
DEFAULT_BUILT_INS.toMock(),
KONAN_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock(),
KONAN_BUILT_INS.toMock()
)
@Test
fun noNative1() = doTestSuccess(
DEFAULT_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock()
)
@Test
fun noNative2() = doTestSuccess(
DEFAULT_BUILT_INS.toMock(),
DEFAULT_BUILT_INS.toMock(),
DEFAULT_BUILT_INS.toMock(),
DEFAULT_BUILT_INS.toMock()
)
@Test
fun noNative3() = doTestSuccess(
DEFAULT_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock(),
DEFAULT_BUILT_INS.toMock(),
JVM_BUILT_INS.toMock()
)
override fun createCommonizer() = ModuleCommonizer.default()
override fun isEqual(a: Module?, b: Module?) =
(a === b) || (a != null && b != null && a.name == b.name && a.builtIns::class.java.name == b.builtIns::class.java.name)
private companion object {
inline val KONAN_BUILT_INS get() = KonanBuiltIns(LockBasedStorageManager.NO_LOCKS)
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() = Module(Name.identifier("fakeModule"), this)
}
}