From 9fb41b6334214c280bd404e35787d9b38a3c267d Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Thu, 12 Aug 2021 15:43:48 +0200 Subject: [PATCH] [Commonizer] CirKnownClassifiers: Store indices and target dependencies as 'TargetDependent' ^KT-47430 --- .../jetbrains/kotlin/commonizer/TargetDependent.kt | 14 +++++++++++++- .../src/org/jetbrains/kotlin/commonizer/facade.kt | 3 ++- .../commonizer/mergedtree/CirKnownClassifiers.kt | 4 +++- .../transformer/CirAliasTypeSubstitutor.kt | 3 ++- .../kotlin/commonizer/core/TypeCommonizerTest.kt | 4 +++- .../InlineTypeAliasCirNodeTransformerTest.kt | 4 +++- .../tree/merge/AbstractMergeCirTreeTest.kt | 3 ++- .../org/jetbrains/kotlin/commonizer/utils/mocks.kt | 3 ++- 8 files changed, 30 insertions(+), 8 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt index 40b0a833efe..6d07919357e 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt @@ -33,6 +33,16 @@ sealed interface TargetDependent : Iterable { fun getOrNull(index: Int): T? { return getOrNull(targets.getOrNull(index) ?: return null) } + + companion object { + @Suppress("UNCHECKED_CAST") + fun empty(): TargetDependent = Empty as TargetDependent + } + + object Empty : TargetDependent { + override val targets: List = emptyList() + override fun get(target: CommonizerTarget) = throwMissingTarget(target) + } } internal fun TargetDependent.filterNonNull(): TargetDependent { @@ -96,7 +106,7 @@ private class FactoryBasedTargetDependent( @Suppress("UNCHECKED_CAST") override fun get(target: CommonizerTarget): T { val indexOfTarget = indexOf(target) - if (indexOfTarget < 0) throw NoSuchElementException("Missing target $target") + if (indexOfTarget < 0) throwMissingTarget(target) val storedValue = values[indexOfTarget] if (storedValue == Uninitialized) { val producedValue = factory?.invoke(target) @@ -112,3 +122,5 @@ private class FactoryBasedTargetDependent( return storedValue as T } } + +private fun throwMissingTarget(target: CommonizerTarget): Nothing = throw NoSuchElementException("Missing target $target") diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt index 0ae533754d6..480bfad8862 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt @@ -53,7 +53,8 @@ internal fun commonizeTarget( parameters.logger.progress(output, "Commonized declarations from ${inputs.targets}") { val classifiers = CirKnownClassifiers( - classifierIndices = availableTrees.toList().map(::CirClassifierIndex), + classifierIndices = availableTrees.mapValue(::CirClassifierIndex), + targetDependencies = availableTrees.mapValue(CirTreeRoot::dependencies), commonizedNodes = CirCommonizedClassifierNodes.default(), commonDependencies = parameters.dependencyClassifiers(output) ) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt index 065ab9daa97..8e3eb9cc942 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirKnownClassifiers.kt @@ -6,10 +6,12 @@ package org.jetbrains.kotlin.commonizer.mergedtree import gnu.trove.THashMap +import org.jetbrains.kotlin.commonizer.TargetDependent import org.jetbrains.kotlin.commonizer.cir.CirEntityId class CirKnownClassifiers( - val classifierIndices: List, + val classifierIndices: TargetDependent, + val targetDependencies: TargetDependent, val commonizedNodes: CirCommonizedClassifierNodes, val commonDependencies: CirProvidedClassifiers ) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/transformer/CirAliasTypeSubstitutor.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/transformer/CirAliasTypeSubstitutor.kt index b8580bb1a2a..1febdd33eb8 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/transformer/CirAliasTypeSubstitutor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/transformer/CirAliasTypeSubstitutor.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.commonizer.transformer +import org.jetbrains.kotlin.commonizer.TargetDependent import org.jetbrains.kotlin.commonizer.cir.* import org.jetbrains.kotlin.commonizer.cir.CirClassType.Companion.copyInterned import org.jetbrains.kotlin.commonizer.cir.CirTypeAliasType.Companion.copyInterned @@ -15,7 +16,7 @@ import org.jetbrains.kotlin.commonizer.tree.CirTreeTypeAlias internal class CirAliasTypeSubstitutor( private val commonDependencies: CirProvidedClassifiers, - private val classifierIndices: List + private val classifierIndices: TargetDependent ) : CirTypeSubstitutor { override fun substitute(targetIndex: Int, type: CirType): CirType { diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/TypeCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/TypeCommonizerTest.kt index 890ecb7b904..4b97b39bb4b 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/TypeCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/core/TypeCommonizerTest.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.commonizer.core +import org.jetbrains.kotlin.commonizer.TargetDependent import org.jetbrains.kotlin.commonizer.cir.* import org.jetbrains.kotlin.commonizer.mergedtree.* import org.jetbrains.kotlin.commonizer.utils.isUnderStandardKotlinPackages @@ -25,7 +26,8 @@ class TypeCommonizerTest : AbstractCommonizerTest() { fun initialize() { // reset cache classifiers = CirKnownClassifiers( - classifierIndices = emptyList(), // TODO NOW + classifierIndices = TargetDependent.empty(), + targetDependencies = TargetDependent.empty(), commonizedNodes = CirCommonizedClassifierNodes.default(), commonDependencies = object : CirProvidedClassifiers { override fun hasClassifier(classifierId: CirEntityId) = classifierId.packageName.isUnderStandardKotlinPackages diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/transformer/InlineTypeAliasCirNodeTransformerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/transformer/InlineTypeAliasCirNodeTransformerTest.kt index 93a5e7c36f1..8f48dcc5594 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/transformer/InlineTypeAliasCirNodeTransformerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/transformer/InlineTypeAliasCirNodeTransformerTest.kt @@ -1,5 +1,6 @@ package org.jetbrains.kotlin.commonizer.transformer +import org.jetbrains.kotlin.commonizer.TargetDependent import org.jetbrains.kotlin.commonizer.cir.* import org.jetbrains.kotlin.commonizer.mergedtree.* import org.jetbrains.kotlin.descriptors.ClassKind @@ -15,7 +16,8 @@ class InlineTypeAliasCirNodeTransformerTest { private val storageManager = LockBasedStorageManager("test") private val classifiers = CirKnownClassifiers( - classifierIndices = emptyList(), + classifierIndices = TargetDependent.empty(), + targetDependencies = TargetDependent.empty(), commonizedNodes = CirCommonizedClassifierNodes.default(), commonDependencies = CirProvidedClassifiers.EMPTY ) diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/merge/AbstractMergeCirTreeTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/merge/AbstractMergeCirTreeTest.kt index e9d187c34b9..18ffca57002 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/merge/AbstractMergeCirTreeTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/tree/merge/AbstractMergeCirTreeTest.kt @@ -88,7 +88,8 @@ abstract class AbstractMergeCirTreeTest : KtInlineSourceCommonizerTestCase() { private fun createDefaultKnownClassifiers(): CirKnownClassifiers { return CirKnownClassifiers( - emptyList(), // TODO NOW + TargetDependent.empty(), + TargetDependent.empty(), CirCommonizedClassifierNodes.default(), CirProvidedClassifiers.of( CirFictitiousFunctionClassifiers, diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt index e700f2576dc..9aefe2fd41f 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt @@ -52,7 +52,8 @@ private fun createValidClassifierId(classifierId: String): CirEntityId { } internal val MOCK_CLASSIFIERS = CirKnownClassifiers( - classifierIndices = emptyList(), + classifierIndices = TargetDependent.empty(), + targetDependencies = TargetDependent.empty(), commonizedNodes = object : CirCommonizedClassifierNodes { override fun classNode(classId: CirEntityId) = CirClassNode( classId,