[FIR] Flatten ConeAttributeWithConeType when transforming
This is necessary to prevent exponential growth of the attribute structure. Since we usually care for the most inner value of a ConeAttributeWithConeType like EnhancedTypeForWarningAttribute, this shouldn't alter any behavior.
This commit is contained in:
committed by
Space Team
parent
b8ff04004a
commit
cf494ada0b
@@ -63,7 +63,11 @@ inline fun <T : ConeAttributeWithConeType<T>> ConeAttributeWithConeType<T>.trans
|
|||||||
): ConeAttributeWithConeType<T>? {
|
): ConeAttributeWithConeType<T>? {
|
||||||
val transformedType = transform(coneType) ?: return null
|
val transformedType = transform(coneType) ?: return null
|
||||||
if (transformedType == coneType) return this
|
if (transformedType == coneType) return this
|
||||||
return copyWith(transformedType)
|
|
||||||
|
// If the type contains the attribute itself, use the nested type from the attribute to prevent exponential growth.
|
||||||
|
// As an example, consider a substitution {T -> Attr(Foo) Bar} applied to a type `Attr(T) T`.
|
||||||
|
// If we don't flatten the attribute chain, we would get `Attr(Attr(Foo) Bar) Bar`.
|
||||||
|
return copyWith(transformedType.attributes[key]?.coneType ?: transformedType)
|
||||||
}
|
}
|
||||||
|
|
||||||
typealias ConeAttributeKey = KClass<out ConeAttribute<*>>
|
typealias ConeAttributeKey = KClass<out ConeAttribute<*>>
|
||||||
@@ -120,8 +124,13 @@ class ConeAttributes private constructor(attributes: List<ConeAttribute<*>>) : A
|
|||||||
}
|
}
|
||||||
|
|
||||||
operator fun contains(attributeKey: KClass<out ConeAttribute<*>>): Boolean {
|
operator fun contains(attributeKey: KClass<out ConeAttribute<*>>): Boolean {
|
||||||
|
return get(attributeKey) != null
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun <T : ConeAttribute<*>> get(attributeKey: KClass<T>) : T? {
|
||||||
val index = getId(attributeKey)
|
val index = getId(attributeKey)
|
||||||
return arrayMap[index] != null
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
return arrayMap[index] as T?
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun plus(attribute: ConeAttribute<*>): ConeAttributes {
|
operator fun plus(attribute: ConeAttribute<*>): ConeAttributes {
|
||||||
|
|||||||
Reference in New Issue
Block a user