[FIR] Add workaround for KT-19306

This commit is contained in:
Dmitriy Novozhilov
2020-06-26 16:28:37 +03:00
parent 3f5db6b86e
commit ac51e5dbd1
5 changed files with 13 additions and 1 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.utils.AttributeArrayOwner
import org.jetbrains.kotlin.fir.utils.Protected
import org.jetbrains.kotlin.fir.utils.TypeRegistry
import org.jetbrains.kotlin.fir.utils.isEmpty
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -20,6 +21,7 @@ abstract class ConeAttribute<T : ConeAttribute<T>> {
abstract val key: KClass<out T>
}
@OptIn(Protected::class)
class ConeAttributes private constructor(attributes: List<ConeAttribute<*>>) : AttributeArrayOwner<ConeAttribute<*>, ConeAttribute<*>>() {
companion object : TypeRegistry<ConeAttribute<*>, ConeAttribute<*>>() {
inline fun <reified T : ConeAttribute<T>> attributeAccessor(): ReadOnlyProperty<ConeAttributes, T?> {
@@ -10,8 +10,14 @@ import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KClass
import kotlin.reflect.KProperty
@RequiresOptIn
annotation class Protected
@OptIn(Protected::class)
abstract class AbstractArrayMapOwner<K : Any, V : Any> {
protected abstract val arrayMap: ArrayMap<V>
// TODO: make [arrayMap] protected and remove annotation after KT-19306 fix
@get:Protected
abstract val arrayMap: ArrayMap<V>
protected abstract val typeRegistry: TypeRegistry<K, V>
abstract class AbstractArrayMapAccessor<K : Any, V : Any, T : V>(
@@ -16,6 +16,7 @@ import kotlin.reflect.KClass
* Note that you can remove attributes from [AttributeArrayOwner] despite
* from components in [ComponentArrayOwner]
*/
@OptIn(Protected::class)
abstract class AttributeArrayOwner<K : Any, T : Any> : AbstractArrayMapOwner<K, T>() {
@Suppress("UNCHECKED_CAST")
final override var arrayMap: ArrayMap<T> = EmptyArrayMap as ArrayMap<T>
@@ -11,6 +11,7 @@ import kotlin.reflect.KClass
* [ComponentArrayOwner] based on [ArrayMap] with flexible size and should be used for
* storing services in entities with limited number of instances, like FirSession
*/
@OptIn(Protected::class)
abstract class ComponentArrayOwner<K : Any, V : Any> : AbstractArrayMapOwner<K, V>() {
final override val arrayMap: ArrayMap<V> =
ArrayMapImpl()
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.utils.ArrayMapAccessor
import org.jetbrains.kotlin.fir.utils.ComponentArrayOwner
import org.jetbrains.kotlin.fir.utils.Protected
import org.jetbrains.kotlin.fir.utils.TypeRegistry
import kotlin.reflect.KClass
@@ -47,6 +48,7 @@ class FirExtensionService(val session: FirSession) : ComponentArrayOwner<FirExte
}
@PluginServicesInitialization
@OptIn(Protected::class)
fun getAllExtensions(): List<FirExtension> {
return arrayMap.flatten()
}