From f4d47cfe59816d7a6f840a3230b55d6b63cc1246 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 10 Jun 2022 12:13:39 +0200 Subject: [PATCH] [Analysis API fir] remove now unneeded ReadOnlyWeakRef --- .../api/fir/components/KtFirBuiltInTypes.kt | 18 ++++++----- .../symbols/KtFirReceiverParameterSymbol.kt | 5 +-- .../api/fir/types/KtFirSubstitutor.kt | 21 ++++++------- .../analysis/api/fir/utils/LazyOnlyWeakRef.kt | 31 ------------------- 4 files changed, 20 insertions(+), 55 deletions(-) delete mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirBuiltInTypes.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirBuiltInTypes.kt index 3aef039909b..ab03d660c92 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirBuiltInTypes.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirBuiltInTypes.kt @@ -5,20 +5,22 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.fir.BuiltinTypes -import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl -import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.components.KtBuiltinTypes import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.types.KtFirUsualClassType import org.jetbrains.kotlin.analysis.api.fir.utils.ValidityAwareCachedValue import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.fir.BuiltinTypes +import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef -internal class KtFirBuiltInTypes(builtinTypes: BuiltinTypes, builder: KtSymbolByFirBuilder, override val token: KtLifetimeToken) : KtBuiltinTypes() { - private val builder by weakRef(builder) +internal class KtFirBuiltInTypes( + builtinTypes: BuiltinTypes, + private val builder: KtSymbolByFirBuilder, + override val token: KtLifetimeToken +) : KtBuiltinTypes() { override val INT: KtType by cachedBuiltin(builtinTypes.intType) override val LONG: KtType by cachedBuiltin(builtinTypes.longType) @@ -41,6 +43,6 @@ internal class KtFirBuiltInTypes(builtinTypes: BuiltinTypes, builder: KtSymbolBy override val NULLABLE_NOTHING: KtType by cachedBuiltin(builtinTypes.nullableNothingType) private fun cachedBuiltin(builtinTypeRef: FirImplicitBuiltinTypeRef): ValidityAwareCachedValue = cached { - KtFirUsualClassType(builtinTypeRef.type as ConeClassLikeTypeImpl, token, builder) // TODO builder leaking + KtFirUsualClassType(builtinTypeRef.type as ConeClassLikeTypeImpl, token, builder) } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt index 63ad7881c9d..61918d044ca 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @@ -24,7 +23,7 @@ internal class KtFirReceiverParameterSymbol( val firSymbol: FirCallableSymbol<*>, val firResolveSession: LLFirResolveSession, override val token: KtLifetimeToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtReceiverParameterSymbol(), KtLifetimeOwner { override val psi: PsiElement? by cached { firSymbol.fir.receiverTypeRef?.findPsi(firSymbol.fir.moduleData.session) } @@ -32,8 +31,6 @@ internal class KtFirReceiverParameterSymbol( require(firSymbol.fir.receiverTypeRef != null) { "$firSymbol doesn't have an extension receiver." } } - private val builder by weakRef(_builder) - override val type: KtType by cached { firSymbol.receiverType(builder) ?: error("$firSymbol doesn't have an extension receiver.") diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt index 1d66e830d46..843eb9a1d70 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirSubstitutor.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.analysis.api.fir.types import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef import org.jetbrains.kotlin.analysis.api.impl.base.KtMapBackedSubstitutor import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken @@ -18,37 +17,35 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap internal abstract class AbstractKtFirSubstitutor( - private val _substitutor: T, - builder: KtSymbolByFirBuilder, + val substitutor: T, + protected val builder: KtSymbolByFirBuilder, override val token: KtLifetimeToken, ) : KtSubstitutor { - protected val builderRef by weakRef(builder) - val substitutor: T get() = withValidityAssertion { _substitutor } override fun substituteOrNull(type: KtType): KtType? = withValidityAssertion { require(type is KtFirType) - substitutor.substituteOrNull(type.coneType)?.type?.let { builderRef.typeBuilder.buildKtType(it) } + substitutor.substituteOrNull(type.coneType)?.type?.let { builder.typeBuilder.buildKtType(it) } } } internal class KtFirGenericSubstitutor( - _substitutor: ConeSubstitutor, + substitutor: ConeSubstitutor, builder: KtSymbolByFirBuilder, token: KtLifetimeToken -) : AbstractKtFirSubstitutor(_substitutor, builder, token) +) : AbstractKtFirSubstitutor(substitutor, builder, token) @OptIn(KtAnalysisApiInternals::class) internal class KtFirMapBackedSubstitutor( - _substitutor: ConeSubstitutorByMap, + substitutor: ConeSubstitutorByMap, builder: KtSymbolByFirBuilder, token: KtLifetimeToken -) : AbstractKtFirSubstitutor(_substitutor, builder, token), KtMapBackedSubstitutor { +) : AbstractKtFirSubstitutor(substitutor, builder, token), KtMapBackedSubstitutor { override fun getAsMap(): Map = withValidityAssertion { val result = mutableMapOf() for ((typeParameter, type) in substitutor.substitution) { - val typeParameterSymbol = builderRef.classifierBuilder.buildTypeParameterSymbolByLookupTag(typeParameter.toLookupTag()) + val typeParameterSymbol = builder.classifierBuilder.buildTypeParameterSymbolByLookupTag(typeParameter.toLookupTag()) if (typeParameterSymbol != null) { - result[typeParameterSymbol] = builderRef.typeBuilder.buildKtType(type) + result[typeParameterSymbol] = builder.typeBuilder.buildKtType(type) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt deleted file mode 100644 index 2218bdddcb1..00000000000 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2010-2020 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.analysis.api.fir.utils - -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import java.lang.ref.WeakReference -import kotlin.reflect.KProperty - -class ReadOnlyWeakRef -@Deprecated("Consider using KtLifetimeTokenOwner.weakRef instead") -constructor(value: V, val token: KtLifetimeToken) { - val weakRef = WeakReference(value) - - @Suppress("NOTHING_TO_INLINE") - inline operator fun getValue(thisRef: Any, property: KProperty<*>): V = - weakRef.get() ?: if (token.isValid()) { - throw EntityWasGarbageCollectedException(property.toString()) - } else { - error("Accessing the invalid value of $property") - } -} - -@Suppress("NOTHING_TO_INLINE", "DEPRECATION") -internal inline fun KtLifetimeOwner.weakRef(value: V) = ReadOnlyWeakRef(value, token) - -@Suppress("DEPRECATION") -internal inline fun KtLifetimeOwner.weakRef(value: () -> V) = ReadOnlyWeakRef(value(), token)