[Commonizer] Put all CIR utils to a single file
This commit is contained in:
-3
@@ -30,6 +30,3 @@ object CirClassifierRecursionMarker : CirClassifier, CirRecursionMarker {
|
|||||||
override val typeParameters get() = unsupported()
|
override val typeParameters get() = unsupported()
|
||||||
override val visibility get() = unsupported()
|
override val visibility get() = unsupported()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("unused", "NOTHING_TO_INLINE")
|
|
||||||
internal inline fun CirDeclaration.unsupported(): Nothing = error("This method should never be called on ${this::class.java}, $this")
|
|
||||||
|
|||||||
+2
-1
@@ -9,13 +9,14 @@ import kotlinx.metadata.KmTypeAlias
|
|||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassOrTypeAliasType
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassOrTypeAliasType
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeAlias
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeAlias
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.unabbreviate
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.metadata.decodeVisibility
|
import org.jetbrains.kotlin.descriptors.commonizer.metadata.decodeVisibility
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap
|
||||||
|
|
||||||
object CirTypeAliasFactory {
|
object CirTypeAliasFactory {
|
||||||
fun create(name: CirName, source: KmTypeAlias, typeResolver: CirTypeResolver): CirTypeAlias {
|
fun create(name: CirName, source: KmTypeAlias, typeResolver: CirTypeResolver): CirTypeAlias {
|
||||||
val underlyingType = CirTypeFactory.create(source.underlyingType, typeResolver) as CirClassOrTypeAliasType
|
val underlyingType = CirTypeFactory.create(source.underlyingType, typeResolver) as CirClassOrTypeAliasType
|
||||||
val expandedType = CirTypeFactory.unabbreviate(underlyingType)
|
val expandedType = underlyingType.unabbreviate()
|
||||||
|
|
||||||
return CirTypeAlias.create(
|
return CirTypeAlias.create(
|
||||||
annotations = CirAnnotationFactory.createAnnotations(source.flags, typeResolver, source::annotations),
|
annotations = CirAnnotationFactory.createAnnotations(source.flags, typeResolver, source::annotations),
|
||||||
|
|||||||
-70
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.factory
|
|||||||
import gnu.trove.TIntObjectHashMap
|
import gnu.trove.TIntObjectHashMap
|
||||||
import kotlinx.metadata.*
|
import kotlinx.metadata.*
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.core.computeExpandedType
|
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvided
|
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvided
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvidedClassifiers
|
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvidedClassifiers
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.TypeParameterResolver
|
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.TypeParameterResolver
|
||||||
@@ -68,39 +67,6 @@ object CirTypeFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : CirSimpleType> makeNullable(type: T): T {
|
|
||||||
if (type.isMarkedNullable)
|
|
||||||
return type
|
|
||||||
|
|
||||||
val result = when (type) {
|
|
||||||
is CirClassType -> CirClassType.createInterned(
|
|
||||||
classId = type.classifierId,
|
|
||||||
outerType = type.outerType,
|
|
||||||
visibility = type.visibility,
|
|
||||||
arguments = type.arguments,
|
|
||||||
isMarkedNullable = true
|
|
||||||
)
|
|
||||||
is CirTypeAliasType -> CirTypeAliasType.createInterned(
|
|
||||||
typeAliasId = type.classifierId,
|
|
||||||
underlyingType = makeNullable(type.underlyingType),
|
|
||||||
arguments = type.arguments,
|
|
||||||
isMarkedNullable = true
|
|
||||||
)
|
|
||||||
is CirTypeParameterType -> CirTypeParameterType.createInterned(
|
|
||||||
index = type.index,
|
|
||||||
isMarkedNullable = true
|
|
||||||
)
|
|
||||||
else -> error("Unsupported type: $type")
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
return result as T
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
|
||||||
inline fun <T : CirSimpleType> makeNullableIfNecessary(type: T, necessary: Boolean): T =
|
|
||||||
if (!necessary) type else makeNullable(type)
|
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun decodeVariance(variance: KmVariance): Variance = when (variance) {
|
inline fun decodeVariance(variance: KmVariance): Variance = when (variance) {
|
||||||
KmVariance.INVARIANT -> Variance.INVARIANT
|
KmVariance.INVARIANT -> Variance.INVARIANT
|
||||||
@@ -108,42 +74,6 @@ object CirTypeFactory {
|
|||||||
KmVariance.OUT -> Variance.OUT_VARIANCE
|
KmVariance.OUT -> Variance.OUT_VARIANCE
|
||||||
}
|
}
|
||||||
|
|
||||||
fun unabbreviate(type: CirClassOrTypeAliasType): CirClassType = when (type) {
|
|
||||||
is CirClassType -> {
|
|
||||||
var hasAbbreviationsInArguments = false
|
|
||||||
val unabbreviatedArguments = type.arguments.compactMap { argument ->
|
|
||||||
val argumentType =
|
|
||||||
(argument as? CirTypeProjectionImpl)?.type as? CirClassOrTypeAliasType ?: return@compactMap argument
|
|
||||||
val unabbreviatedArgumentType = unabbreviate(argumentType)
|
|
||||||
|
|
||||||
if (argumentType == unabbreviatedArgumentType)
|
|
||||||
argument
|
|
||||||
else {
|
|
||||||
hasAbbreviationsInArguments = true
|
|
||||||
CirTypeProjectionImpl(
|
|
||||||
projectionKind = argument.projectionKind,
|
|
||||||
type = unabbreviatedArgumentType
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val outerType = type.outerType
|
|
||||||
val unabbreviatedOuterType = outerType?.let(::unabbreviate)
|
|
||||||
|
|
||||||
if (!hasAbbreviationsInArguments && outerType == unabbreviatedOuterType)
|
|
||||||
type
|
|
||||||
else
|
|
||||||
CirClassType.createInterned(
|
|
||||||
classId = type.classifierId,
|
|
||||||
outerType = unabbreviatedOuterType,
|
|
||||||
visibility = type.visibility,
|
|
||||||
arguments = unabbreviatedArguments,
|
|
||||||
isMarkedNullable = type.isMarkedNullable
|
|
||||||
)
|
|
||||||
}
|
|
||||||
is CirTypeAliasType -> unabbreviate(computeExpandedType(type))
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
private inline fun createArguments(arguments: List<KmTypeProjection>, typeResolver: CirTypeResolver): List<CirTypeProjection> {
|
private inline fun createArguments(arguments: List<KmTypeProjection>, typeResolver: CirTypeResolver): List<CirTypeProjection> {
|
||||||
return arguments.compactMap { argument ->
|
return arguments.compactMap { argument ->
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 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.cir
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap
|
||||||
|
|
||||||
|
fun <T : CirSimpleType> T.makeNullable(): T {
|
||||||
|
if (isMarkedNullable)
|
||||||
|
return this
|
||||||
|
|
||||||
|
val result = when (this) {
|
||||||
|
is CirClassType -> CirClassType.createInterned(
|
||||||
|
classId = classifierId,
|
||||||
|
outerType = outerType,
|
||||||
|
visibility = visibility,
|
||||||
|
arguments = arguments,
|
||||||
|
isMarkedNullable = true
|
||||||
|
)
|
||||||
|
is CirTypeAliasType -> CirTypeAliasType.createInterned(
|
||||||
|
typeAliasId = classifierId,
|
||||||
|
underlyingType = underlyingType.makeNullable(),
|
||||||
|
arguments = arguments,
|
||||||
|
isMarkedNullable = true
|
||||||
|
)
|
||||||
|
is CirTypeParameterType -> CirTypeParameterType.createInterned(
|
||||||
|
index = index,
|
||||||
|
isMarkedNullable = true
|
||||||
|
)
|
||||||
|
else -> error("Unsupported type: $this")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
return result as T
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline fun <T : CirSimpleType> T.makeNullableIfNecessary(necessary: Boolean): T =
|
||||||
|
if (!necessary) this else makeNullable()
|
||||||
|
|
||||||
|
fun CirClassOrTypeAliasType.unabbreviate(): CirClassType = when (this) {
|
||||||
|
is CirClassType -> {
|
||||||
|
var hasAbbreviationsInArguments = false
|
||||||
|
val unabbreviatedArguments = arguments.compactMap { argument ->
|
||||||
|
val argumentType =
|
||||||
|
(argument as? CirTypeProjectionImpl)?.type as? CirClassOrTypeAliasType ?: return@compactMap argument
|
||||||
|
val unabbreviatedArgumentType = argumentType.unabbreviate()
|
||||||
|
|
||||||
|
if (argumentType == unabbreviatedArgumentType)
|
||||||
|
argument
|
||||||
|
else {
|
||||||
|
hasAbbreviationsInArguments = true
|
||||||
|
CirTypeProjectionImpl(
|
||||||
|
projectionKind = argument.projectionKind,
|
||||||
|
type = unabbreviatedArgumentType
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val outerType = outerType
|
||||||
|
val unabbreviatedOuterType = outerType?.unabbreviate()
|
||||||
|
|
||||||
|
if (!hasAbbreviationsInArguments && outerType == unabbreviatedOuterType)
|
||||||
|
this
|
||||||
|
else
|
||||||
|
CirClassType.createInterned(
|
||||||
|
classId = classifierId,
|
||||||
|
outerType = unabbreviatedOuterType,
|
||||||
|
visibility = visibility,
|
||||||
|
arguments = unabbreviatedArguments,
|
||||||
|
isMarkedNullable = isMarkedNullable
|
||||||
|
)
|
||||||
|
}
|
||||||
|
is CirTypeAliasType -> computeExpandedType(this).unabbreviate()
|
||||||
|
}
|
||||||
|
|
||||||
|
internal tailrec fun computeExpandedType(underlyingType: CirClassOrTypeAliasType): CirClassType {
|
||||||
|
return when (underlyingType) {
|
||||||
|
is CirClassType -> underlyingType
|
||||||
|
is CirTypeAliasType -> computeExpandedType(underlyingType.underlyingType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("unused", "NOTHING_TO_INLINE")
|
||||||
|
internal inline fun CirDeclaration.unsupported(): Nothing = error("This method should never be called on ${this::class.java}, $this")
|
||||||
+1
-2
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.core
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory
|
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.core.CommonizedTypeAliasAnswer.Companion.FAILURE_MISSING_IN_SOME_TARGET
|
import org.jetbrains.kotlin.descriptors.commonizer.core.CommonizedTypeAliasAnswer.Companion.FAILURE_MISSING_IN_SOME_TARGET
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.core.CommonizedTypeAliasAnswer.Companion.SUCCESS_FROM_DEPENDENCY_LIBRARY
|
import org.jetbrains.kotlin.descriptors.commonizer.core.CommonizedTypeAliasAnswer.Companion.SUCCESS_FROM_DEPENDENCY_LIBRARY
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirKnownClassifiers
|
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirKnownClassifiers
|
||||||
@@ -143,7 +142,7 @@ private class TypeAliasTypeCommonizer(private val classifiers: CirKnownClassifie
|
|||||||
// type alias don't needs to be commonized because it is from the standard library
|
// type alias don't needs to be commonized because it is from the standard library
|
||||||
fun forKnownUnderlyingType(underlyingType: CirClassOrTypeAliasType) = object : CommonizedTypeAliasTypeBuilder {
|
fun forKnownUnderlyingType(underlyingType: CirClassOrTypeAliasType) = object : CommonizedTypeAliasTypeBuilder {
|
||||||
override fun build(typeAliasId: CirEntityId, arguments: List<CirTypeProjection>, isMarkedNullable: Boolean): CirTypeAliasType {
|
override fun build(typeAliasId: CirEntityId, arguments: List<CirTypeProjection>, isMarkedNullable: Boolean): CirTypeAliasType {
|
||||||
val underlyingTypeWithProperNullability = CirTypeFactory.makeNullableIfNecessary(underlyingType, isMarkedNullable)
|
val underlyingTypeWithProperNullability = underlyingType.makeNullableIfNecessary(isMarkedNullable)
|
||||||
return CirTypeAliasType.createInterned(
|
return CirTypeAliasType.createInterned(
|
||||||
typeAliasId = typeAliasId,
|
typeAliasId = typeAliasId,
|
||||||
underlyingType = underlyingTypeWithProperNullability, // TODO replace arguments???
|
underlyingType = underlyingTypeWithProperNullability, // TODO replace arguments???
|
||||||
|
|||||||
-7
@@ -11,13 +11,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeAliasType
|
|||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeProjection
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeProjection
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirKnownClassifiers
|
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirKnownClassifiers
|
||||||
|
|
||||||
tailrec fun computeExpandedType(underlyingType: CirClassOrTypeAliasType): CirClassType {
|
|
||||||
return when (underlyingType) {
|
|
||||||
is CirClassType -> underlyingType
|
|
||||||
is CirTypeAliasType -> computeExpandedType(underlyingType.underlyingType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal tailrec fun computeSuitableUnderlyingType(
|
internal tailrec fun computeSuitableUnderlyingType(
|
||||||
classifiers: CirKnownClassifiers,
|
classifiers: CirKnownClassifiers,
|
||||||
underlyingType: CirClassOrTypeAliasType
|
underlyingType: CirClassOrTypeAliasType
|
||||||
|
|||||||
+3
-4
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.descriptors.commonizer.metadata
|
package org.jetbrains.kotlin.descriptors.commonizer.metadata
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory
|
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeResolver
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeResolver
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvided
|
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvided
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMapIndexed
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMapIndexed
|
||||||
@@ -52,7 +51,7 @@ object CirTypeAliasExpander {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val expandedType = expandedProjection.type as CirClassOrTypeAliasType
|
val expandedType = expandedProjection.type as CirClassOrTypeAliasType
|
||||||
return CirTypeFactory.makeNullableIfNecessary(expandedType, expansion.isMarkedNullable)
|
return expandedType.makeNullableIfNecessary(expansion.isMarkedNullable)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun expandTypeProjection(
|
private fun expandTypeProjection(
|
||||||
@@ -101,7 +100,7 @@ object CirTypeAliasExpander {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val substitutedType = CirTypeFactory.makeNullableIfNecessary(argumentType, type.isMarkedNullable)
|
val substitutedType = argumentType.makeNullableIfNecessary(type.isMarkedNullable)
|
||||||
|
|
||||||
CirTypeProjectionImpl(resultingVariance, substitutedType)
|
CirTypeProjectionImpl(resultingVariance, substitutedType)
|
||||||
}
|
}
|
||||||
@@ -170,7 +169,7 @@ object CirTypeAliasExpander {
|
|||||||
|
|
||||||
CirTypeProjectionImpl(
|
CirTypeProjectionImpl(
|
||||||
projectionKind = projection.projectionKind,
|
projectionKind = projection.projectionKind,
|
||||||
type = CirTypeFactory.makeNullable(projectionType)
|
type = projectionType.makeNullable()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -10,7 +10,6 @@ import kotlinx.metadata.klib.*
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.core.computeExpandedType
|
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.*
|
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.*
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.metadata.TypeAliasExpansion.*
|
import org.jetbrains.kotlin.descriptors.commonizer.metadata.TypeAliasExpansion.*
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.DEFAULT_SETTER_VALUE_NAME
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.DEFAULT_SETTER_VALUE_NAME
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ internal fun mockTAType(
|
|||||||
underlyingType: () -> CirClassOrTypeAliasType
|
underlyingType: () -> CirClassOrTypeAliasType
|
||||||
): CirTypeAliasType = CirTypeAliasType.createInterned(
|
): CirTypeAliasType = CirTypeAliasType.createInterned(
|
||||||
typeAliasId = createValidClassifierId(typeAliasId),
|
typeAliasId = createValidClassifierId(typeAliasId),
|
||||||
underlyingType = CirTypeFactory.makeNullableIfNecessary(underlyingType(), nullable),
|
underlyingType = underlyingType().makeNullableIfNecessary(nullable),
|
||||||
arguments = emptyList(),
|
arguments = emptyList(),
|
||||||
isMarkedNullable = nullable
|
isMarkedNullable = nullable
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user