[FIR] Combine type attributes in typealias expansion
^KT-48651 Fixed
This commit is contained in:
committed by
teamcityserver
parent
0f6b6dbca3
commit
37b427c656
@@ -17,6 +17,8 @@ object CompilerConeAttributes {
|
|||||||
|
|
||||||
override fun union(other: Exact?): Exact? = null
|
override fun union(other: Exact?): Exact? = null
|
||||||
override fun intersect(other: Exact?): Exact? = null
|
override fun intersect(other: Exact?): Exact? = null
|
||||||
|
override fun add(other: Exact?): Exact = this
|
||||||
|
|
||||||
override fun isSubtypeOf(other: Exact?): Boolean = true
|
override fun isSubtypeOf(other: Exact?): Boolean = true
|
||||||
|
|
||||||
override val key: KClass<out Exact> = Exact::class
|
override val key: KClass<out Exact> = Exact::class
|
||||||
@@ -29,6 +31,7 @@ object CompilerConeAttributes {
|
|||||||
|
|
||||||
override fun union(other: NoInfer?): NoInfer? = null
|
override fun union(other: NoInfer?): NoInfer? = null
|
||||||
override fun intersect(other: NoInfer?): NoInfer? = null
|
override fun intersect(other: NoInfer?): NoInfer? = null
|
||||||
|
override fun add(other: NoInfer?): NoInfer = this
|
||||||
override fun isSubtypeOf(other: NoInfer?): Boolean = true
|
override fun isSubtypeOf(other: NoInfer?): Boolean = true
|
||||||
|
|
||||||
override val key: KClass<out NoInfer> = NoInfer::class
|
override val key: KClass<out NoInfer> = NoInfer::class
|
||||||
@@ -41,6 +44,8 @@ object CompilerConeAttributes {
|
|||||||
|
|
||||||
override fun union(other: EnhancedNullability?): EnhancedNullability? = other
|
override fun union(other: EnhancedNullability?): EnhancedNullability? = other
|
||||||
override fun intersect(other: EnhancedNullability?): EnhancedNullability = this
|
override fun intersect(other: EnhancedNullability?): EnhancedNullability = this
|
||||||
|
override fun add(other: EnhancedNullability?): EnhancedNullability = this
|
||||||
|
|
||||||
override fun isSubtypeOf(other: EnhancedNullability?): Boolean = true
|
override fun isSubtypeOf(other: EnhancedNullability?): Boolean = true
|
||||||
|
|
||||||
override val key: KClass<out EnhancedNullability> = EnhancedNullability::class
|
override val key: KClass<out EnhancedNullability> = EnhancedNullability::class
|
||||||
@@ -53,6 +58,8 @@ object CompilerConeAttributes {
|
|||||||
|
|
||||||
override fun union(other: ExtensionFunctionType?): ExtensionFunctionType? = other
|
override fun union(other: ExtensionFunctionType?): ExtensionFunctionType? = other
|
||||||
override fun intersect(other: ExtensionFunctionType?): ExtensionFunctionType = this
|
override fun intersect(other: ExtensionFunctionType?): ExtensionFunctionType = this
|
||||||
|
override fun add(other: ExtensionFunctionType?): ExtensionFunctionType = this
|
||||||
|
|
||||||
override fun isSubtypeOf(other: ExtensionFunctionType?): Boolean = true
|
override fun isSubtypeOf(other: ExtensionFunctionType?): Boolean = true
|
||||||
|
|
||||||
override val key: KClass<out ExtensionFunctionType> = ExtensionFunctionType::class
|
override val key: KClass<out ExtensionFunctionType> = ExtensionFunctionType::class
|
||||||
@@ -65,6 +72,8 @@ object CompilerConeAttributes {
|
|||||||
|
|
||||||
override fun union(other: UnsafeVariance?): UnsafeVariance? = null
|
override fun union(other: UnsafeVariance?): UnsafeVariance? = null
|
||||||
override fun intersect(other: UnsafeVariance?): UnsafeVariance? = null
|
override fun intersect(other: UnsafeVariance?): UnsafeVariance? = null
|
||||||
|
override fun add(other: UnsafeVariance?): UnsafeVariance = this
|
||||||
|
|
||||||
override fun isSubtypeOf(other: UnsafeVariance?): Boolean = true
|
override fun isSubtypeOf(other: UnsafeVariance?): Boolean = true
|
||||||
|
|
||||||
override val key: KClass<out UnsafeVariance> = UnsafeVariance::class
|
override val key: KClass<out UnsafeVariance> = UnsafeVariance::class
|
||||||
|
|||||||
@@ -15,6 +15,17 @@ import kotlin.reflect.KClass
|
|||||||
abstract class ConeAttribute<T : ConeAttribute<T>> : AnnotationMarker {
|
abstract class ConeAttribute<T : ConeAttribute<T>> : AnnotationMarker {
|
||||||
abstract fun union(other: @UnsafeVariance T?): T?
|
abstract fun union(other: @UnsafeVariance T?): T?
|
||||||
abstract fun intersect(other: @UnsafeVariance T?): T?
|
abstract fun intersect(other: @UnsafeVariance T?): T?
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is used to decide how multiple attributes should be united in presence of typealiases:
|
||||||
|
* typealias B = @SomeAttribute(1) A
|
||||||
|
* typealias C = @SomeAttribute(2) B
|
||||||
|
*
|
||||||
|
* For determining attribute value of expanded type of C we should add @SomeAttribute(2) to @SomeAttribute(1)
|
||||||
|
*
|
||||||
|
* This function must be symmetrical: a.add(b) == b.add(a)
|
||||||
|
*/
|
||||||
|
abstract fun add(other: @UnsafeVariance T?): T
|
||||||
abstract fun isSubtypeOf(other: @UnsafeVariance T?): Boolean
|
abstract fun isSubtypeOf(other: @UnsafeVariance T?): Boolean
|
||||||
|
|
||||||
abstract override fun toString(): String
|
abstract override fun toString(): String
|
||||||
@@ -65,6 +76,10 @@ class ConeAttributes private constructor(attributes: List<ConeAttribute<*>>) : A
|
|||||||
return perform(other) { this.intersect(it) }
|
return perform(other) { this.intersect(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun add(other: ConeAttributes): ConeAttributes {
|
||||||
|
return perform(other) { this.add(it) }
|
||||||
|
}
|
||||||
|
|
||||||
operator fun contains(attribute: ConeAttribute<*>): Boolean {
|
operator fun contains(attribute: ConeAttribute<*>): Boolean {
|
||||||
val index = getId(attribute.key)
|
val index = getId(attribute.key)
|
||||||
return arrayMap[index] != null
|
return arrayMap[index] != null
|
||||||
|
|||||||
@@ -68,7 +68,10 @@ fun ConeClassLikeType.directExpansionType(
|
|||||||
val typeAliasSymbol = lookupTag.toSymbol(useSiteSession) as? FirTypeAliasSymbol ?: return null
|
val typeAliasSymbol = lookupTag.toSymbol(useSiteSession) as? FirTypeAliasSymbol ?: return null
|
||||||
val typeAlias = typeAliasSymbol.fir
|
val typeAlias = typeAliasSymbol.fir
|
||||||
|
|
||||||
val resultType = expandedConeType(typeAlias)?.applyNullabilityFrom(useSiteSession, this) ?: return null
|
val resultType = expandedConeType(typeAlias)
|
||||||
|
?.applyNullabilityFrom(useSiteSession, this)
|
||||||
|
?.applyAttributesFrom(useSiteSession, this)
|
||||||
|
?: return null
|
||||||
|
|
||||||
if (resultType.typeArguments.isEmpty()) return resultType
|
if (resultType.typeArguments.isEmpty()) return resultType
|
||||||
return mapTypeAliasArguments(typeAlias, this, resultType, useSiteSession) as? ConeClassLikeType
|
return mapTypeAliasArguments(typeAlias, this, resultType, useSiteSession) as? ConeClassLikeType
|
||||||
@@ -82,6 +85,14 @@ private fun ConeClassLikeType.applyNullabilityFrom(
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ConeClassLikeType.applyAttributesFrom(
|
||||||
|
session: FirSession,
|
||||||
|
abbreviation: ConeClassLikeType
|
||||||
|
): ConeClassLikeType {
|
||||||
|
val combinedAttributes = attributes.add(abbreviation.attributes)
|
||||||
|
return withAttributes(combinedAttributes, session.typeContext)
|
||||||
|
}
|
||||||
|
|
||||||
private fun mapTypeAliasArguments(
|
private fun mapTypeAliasArguments(
|
||||||
typeAlias: FirTypeAlias,
|
typeAlias: FirTypeAlias,
|
||||||
abbreviatedType: ConeClassLikeType,
|
abbreviatedType: ConeClassLikeType,
|
||||||
|
|||||||
@@ -14,6 +14,11 @@ class CustomAnnotationTypeAttribute(val annotations: List<FirAnnotation>) : Cone
|
|||||||
|
|
||||||
override fun intersect(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null
|
override fun intersect(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute? = null
|
||||||
|
|
||||||
|
override fun add(other: CustomAnnotationTypeAttribute?): CustomAnnotationTypeAttribute {
|
||||||
|
if (other == null) return this
|
||||||
|
return CustomAnnotationTypeAttribute(annotations + other.annotations)
|
||||||
|
}
|
||||||
|
|
||||||
override fun isSubtypeOf(other: CustomAnnotationTypeAttribute?): Boolean = true
|
override fun isSubtypeOf(other: CustomAnnotationTypeAttribute?): Boolean = true
|
||||||
|
|
||||||
override fun toString(): String = annotations.joinToString(separator = " ") { it.render() }
|
override fun toString(): String = annotations.joinToString(separator = " ") { it.render() }
|
||||||
|
|||||||
Reference in New Issue
Block a user