Rewrite FirDeclarationDataRegistry.data to avoid type parameter problems

This commit is contained in:
Mikhail Glukhikh
2021-04-08 13:38:14 +03:00
parent 0c17ce2f44
commit e2cc0510de
5 changed files with 13 additions and 13 deletions
@@ -66,6 +66,10 @@ abstract class TypeRegistry<K : Any, V : Any> {
return NullableArrayMapAccessor(kClass, getId(kClass))
}
fun <KK : K> generateAnyNullableAccessor(kClass: KClass<KK>): NullableArrayMapAccessor<K, V, *> {
return NullableArrayMapAccessor(kClass, getId(kClass))
}
fun <T : K> getId(kClass: KClass<T>): Int {
return idPerType.computeIfAbsent(kClass) { idCounter.getAndIncrement() }
}
@@ -162,8 +162,6 @@ class DelegatedWrapperData<D : FirCallableDeclaration<*>>(
val containingClass: ConeClassLikeLookupTag,
val delegateField: FirField,
)
@Suppress("DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER")
var <D : FirCallableDeclaration<*>>
D.delegatedWrapperData: DelegatedWrapperData<D>? by FirDeclarationDataRegistry.data(DelegatedWrapperDataKey)
@@ -63,6 +63,5 @@ class ImportedFromObjectData<D : FirCallableDeclaration<*>>(
val original: D,
)
@Suppress("DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER")
var <D : FirCallableDeclaration<*>>
D.importedFromObjectData: ImportedFromObjectData<D>? by FirDeclarationDataRegistry.data(ImportedFromObjectClassIdKey)
@@ -80,13 +80,11 @@ inline fun <reified S : FirCallableSymbol<*>> S.unwrapFakeOverrides(): S = fir.u
private object SubstitutedOverrideOriginalKey : FirDeclarationDataKey()
@Suppress("DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER")
var <D : FirCallableDeclaration<*>>
D.originalForSubstitutionOverrideAttr: D? by FirDeclarationDataRegistry.data(SubstitutedOverrideOriginalKey)
private object IntersectionOverrideOriginalKey : FirDeclarationDataKey()
@Suppress("DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER")
var <D : FirCallableDeclaration<*>>
D.originalForIntersectionOverrideAttr: D? by FirDeclarationDataRegistry.data(IntersectionOverrideOriginalKey)
@@ -40,9 +40,9 @@ class FirDeclarationAttributes : AttributeArrayOwner<FirDeclarationDataKey, Any>
* var FirDeclaration.someString: String? by FirDeclarationDataRegistry.data(SomeKey)
*/
object FirDeclarationDataRegistry : TypeRegistry<FirDeclarationDataKey, Any>() {
fun <K : FirDeclarationDataKey, V : Any> data(key: K): ReadWriteProperty<FirDeclaration, V?> {
fun <K : FirDeclarationDataKey> data(key: K): DeclarationDataAccessor {
val kClass = key::class
return DeclarationDataAccessor(generateNullableAccessor(kClass), kClass)
return DeclarationDataAccessor(generateAnyNullableAccessor(kClass), kClass)
}
fun <K : FirDeclarationDataKey, V : Any> attributesAccessor(key: K): ReadWriteProperty<FirDeclarationAttributes, V?> {
@@ -50,15 +50,16 @@ object FirDeclarationDataRegistry : TypeRegistry<FirDeclarationDataKey, Any>() {
return AttributeDataAccessor(generateNullableAccessor(kClass), kClass)
}
private class DeclarationDataAccessor<V : Any>(
val dataAccessor: NullableArrayMapAccessor<FirDeclarationDataKey, Any, V>,
class DeclarationDataAccessor(
private val dataAccessor: NullableArrayMapAccessor<FirDeclarationDataKey, Any, *>,
val key: KClass<out FirDeclarationDataKey>
) : ReadWriteProperty<FirDeclaration, V?> {
override fun getValue(thisRef: FirDeclaration, property: KProperty<*>): V? {
return dataAccessor.getValue(thisRef.attributes, property)
) {
operator fun <V> getValue(thisRef: FirDeclaration, property: KProperty<*>): V? {
@Suppress("UNCHECKED_CAST")
return dataAccessor.getValue(thisRef.attributes, property) as? V
}
override fun setValue(thisRef: FirDeclaration, property: KProperty<*>, value: V?) {
operator fun <V> setValue(thisRef: FirDeclaration, property: KProperty<*>, value: V?) {
thisRef.attributes[key] = value
}
}