FIR IDE: rename Invalidatable -> ValidityOwner

This commit is contained in:
Ilya Kirillov
2020-06-27 00:20:04 +03:00
parent 226d514788
commit a26063b3f8
22 changed files with 51 additions and 58 deletions
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
abstract class KtAnalysisSession(project: Project) : Invalidatable { abstract class KtAnalysisSession(project: Project) : ValidityOwner {
protected open val validityToken = ReadActionConfinementValidityToken(project) protected open val validityToken = ReadActionConfinementValidityToken(project)
override fun isValid(): Boolean = validityToken.isValid() override fun isValid(): Boolean = validityToken.isValid()
override fun invalidationReason(): String = validityToken.invalidationReason() override fun invalidationReason(): String = validityToken.invalidationReason()
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface KtType : Invalidatable { interface KtType : ValidityOwner {
fun isEqualTo(other: KtType): Boolean fun isEqualTo(other: KtType): Boolean
fun isSubTypeOf(superType: KtType): Boolean fun isSubTypeOf(superType: KtType): Boolean
@@ -9,29 +9,29 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
interface Invalidatable { interface ValidityOwner {
fun isValid(): Boolean fun isValid(): Boolean
fun invalidationReason(): String fun invalidationReason(): String
} }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun Invalidatable.assertIsValid() { inline fun ValidityOwner.assertIsValid() {
assert(isValid()) { "Access to invalid $this, invalidation reason is ${invalidationReason()}" } assert(isValid()) { "Access to invalid $this, invalidation reason is ${invalidationReason()}" }
} }
inline fun <R> Invalidatable.withValidityAssertion(action: () -> R): R { inline fun <R> ValidityOwner.withValidityAssertion(action: () -> R): R {
assertIsValid() assertIsValid()
return action() return action()
} }
interface InvalidatableByValidityToken : Invalidatable { interface ValidityOwnerByValidityToken : ValidityOwner {
val token: Invalidatable val token: ValidityOwner
override fun isValid(): Boolean = token.isValid() override fun isValid(): Boolean = token.isValid()
override fun invalidationReason(): String = token.invalidationReason() override fun invalidationReason(): String = token.invalidationReason()
} }
class ReadActionConfinementValidityToken(project: Project) : Invalidatable { class ReadActionConfinementValidityToken(project: Project) : ValidityOwner {
private val modificationTracker = KotlinModificationTrackerService.getInstance(project).modificationTracker private val modificationTracker = KotlinModificationTrackerService.getInstance(project).modificationTracker
private val ownerThread = Thread.currentThread() private val ownerThread = Thread.currentThread()
private val onCreatedTimeStamp = modificationTracker.modificationCount private val onCreatedTimeStamp = modificationTracker.modificationCount
@@ -6,9 +6,9 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols package org.jetbrains.kotlin.idea.frontend.api.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
interface KtSymbol : Invalidatable { interface KtSymbol : ValidityOwner {
val origin: KtSymbolOrigin val origin: KtSymbolOrigin
val psi: PsiElement? val psi: PsiElement?
} }
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols package org.jetbrains.kotlin.idea.frontend.api.symbols
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
abstract class KtSymbolProvider : Invalidatable { abstract class KtSymbolProvider : ValidityOwner {
open fun getSymbol(psi: KtDeclaration): KtSymbol = when (psi) { open fun getSymbol(psi: KtDeclaration): KtSymbol = when (psi) {
is KtParameter -> getParameterSymbol(psi) is KtParameter -> getParameterSymbol(psi)
is KtNamedFunction -> getFunctionSymbol(psi) is KtNamedFunction -> getFunctionSymbol(psi)
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.AbstractTypeChecker
import org.jetbrains.kotlin.types.AbstractTypeCheckerContext import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
internal interface KtFirType : KtType, InvalidatableByValidityToken { internal interface KtFirType : KtType, ValidityOwnerByValidityToken {
val coneType: ConeKotlinType val coneType: ConeKotlinType
val typeCheckerContext: ConeTypeCheckerContext val typeCheckerContext: ConeTypeCheckerContext
@@ -49,7 +49,7 @@ internal interface KtFirType : KtType, InvalidatableByValidityToken {
internal class KtFirClassType( internal class KtFirClassType(
coneType: ConeClassLikeTypeImpl, coneType: ConeClassLikeTypeImpl,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable, override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtClassType(), KtFirType { ) : KtClassType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -73,7 +73,7 @@ internal class KtFirClassType(
internal class KtFirErrorType( internal class KtFirErrorType(
coneType: ConeClassErrorType, coneType: ConeClassErrorType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable, override val token: ValidityOwner,
) : KtErrorType(), KtFirType { ) : KtErrorType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
override val typeCheckerContext by weakRef(typeCheckerContext) override val typeCheckerContext by weakRef(typeCheckerContext)
@@ -84,7 +84,7 @@ internal class KtFirErrorType(
internal class KtFirTypeParameterType( internal class KtFirTypeParameterType(
coneType: ConeTypeParameterType, coneType: ConeTypeParameterType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable, override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtTypeParameterType(), KtFirType { ) : KtTypeParameterType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -104,7 +104,7 @@ internal class KtFirTypeParameterType(
internal class KtFirFlexibleType( internal class KtFirFlexibleType(
coneType: ConeFlexibleType, coneType: ConeFlexibleType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable, override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtFlexibleType(), KtFirType { ) : KtFlexibleType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -117,7 +117,7 @@ internal class KtFirFlexibleType(
internal class KtFirIntersectionType( internal class KtFirIntersectionType(
coneType: ConeIntersectionType, coneType: ConeIntersectionType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable, override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtIntersectionType(), KtFirType { ) : KtIntersectionType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -16,14 +16,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.idea.frontend.api.* import org.jetbrains.kotlin.idea.frontend.api.*
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.idea.frontend.api.*
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.* import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirLocalVariableSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirLocalVariableSymbol
@@ -9,7 +9,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.*
internal class KtFirAnonymousFunctionSymbol( internal class KtFirAnonymousFunctionSymbol(
fir: FirAnonymousFunction, fir: FirAnonymousFunction,
override val token: Invalidatable, override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtAnonymousFunctionSymbol(), KtFirSymbol<FirAnonymousFunction> { ) : KtAnonymousFunctionSymbol(), KtFirSymbol<FirAnonymousFunction> {
override val fir: FirAnonymousFunction by weakRef(fir) override val fir: FirAnonymousFunction by weakRef(fir)
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.ReadOnlyWeakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.ReadOnlyWeakRef
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirClassOrObjectSymbol( internal class KtFirClassOrObjectSymbol(
fir: FirRegularClass, fir: FirRegularClass,
override val token: Invalidatable, override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> { ) : KtClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> {
override val fir: FirRegularClass by ReadOnlyWeakRef(fir, this) override val fir: FirRegularClass by ReadOnlyWeakRef(fir, this)
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
internal class KtFirConstructorSymbol( internal class KtFirConstructorSymbol(
fir: FirConstructor, fir: FirConstructor,
override val token: Invalidatable, override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtConstructorSymbol(), KtFirSymbol<FirConstructor> { ) : KtConstructorSymbol(), KtFirSymbol<FirConstructor> {
override val fir: FirConstructor by weakRef(fir) override val fir: FirConstructor by weakRef(fir)
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirField import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.isLocal
import org.jetbrains.kotlin.fir.declarations.isOperator import org.jetbrains.kotlin.fir.declarations.isOperator
import org.jetbrains.kotlin.fir.declarations.isSuspend import org.jetbrains.kotlin.fir.declarations.isSuspend
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirFunctionSymbol( internal class KtFirFunctionSymbol(
fir: FirSimpleFunction, fir: FirSimpleFunction,
override val token: Invalidatable, override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder, private val builder: KtSymbolByFirBuilder,
) : KtFunctionSymbol(), KtFirSymbol<FirSimpleFunction> { ) : KtFunctionSymbol(), KtFirSymbol<FirSimpleFunction> {
override val fir: FirSimpleFunction by weakRef(fir) override val fir: FirSimpleFunction by weakRef(fir)
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.KtType import org.jetbrains.kotlin.idea.frontend.api.KtType
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -7,12 +7,12 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.idea.frontend.api.InvalidatableByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
internal interface KtFirSymbol<F : FirDeclaration> : KtSymbol, InvalidatableByValidityToken { internal interface KtFirSymbol<F : FirDeclaration> : KtSymbol, ValidityOwnerByValidityToken {
val fir: F val fir: F
override val origin: KtSymbolOrigin get() = withValidityAssertion { fir.origin.asKtSymbolOrigin() } override val origin: KtSymbolOrigin get() = withValidityAssertion { fir.origin.asKtSymbolOrigin() }
} }
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.InvalidatableByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -18,10 +18,10 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
internal class KtFirSymbolProvider( internal class KtFirSymbolProvider(
override val token: Invalidatable, override val token: ValidityOwner,
firSymbolProvider: FirSymbolProvider, firSymbolProvider: FirSymbolProvider,
private val firSymbolBuilder: KtSymbolByFirBuilder private val firSymbolBuilder: KtSymbolByFirBuilder
) : KtSymbolProvider(), InvalidatableByValidityToken { ) : KtSymbolProvider(), ValidityOwnerByValidityToken {
private val firSymbolProvider by weakRef(firSymbolProvider) private val firSymbolProvider by weakRef(firSymbolProvider)
override fun getParameterSymbol(psi: KtParameter): KtParameterSymbol = withValidityAssertion { override fun getParameterSymbol(psi: KtParameter): KtParameterSymbol = withValidityAssertion {
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.ReadOnlyWeakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.ReadOnlyWeakRef
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeAliasSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeAliasSymbol
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirTypeAliasSymbol( internal class KtFirTypeAliasSymbol(
fir: FirTypeAlias, fir: FirTypeAlias,
override val token: Invalidatable override val token: ValidityOwner
) : KtTypeAliasSymbol(), KtFirSymbol<FirTypeAlias> { ) : KtTypeAliasSymbol(), KtFirSymbol<FirTypeAlias> {
override val fir: FirTypeAlias by ReadOnlyWeakRef(fir, this) override val fir: FirTypeAlias by ReadOnlyWeakRef(fir, this)
override val psi: PsiElement? by cached { fir.findPsi(fir.session) } override val psi: PsiElement? by cached { fir.findPsi(fir.session) }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirTypeParameterSymbol( internal class KtFirTypeParameterSymbol(
fir: FirTypeParameter, fir: FirTypeParameter,
override val token: Invalidatable override val token: ValidityOwner
) : KtTypeParameterSymbol(), KtFirSymbol<FirTypeParameter> { ) : KtTypeParameterSymbol(), KtFirSymbol<FirTypeParameter> {
override val fir: FirTypeParameter by weakRef(fir) override val fir: FirTypeParameter by weakRef(fir)
override val psi: PsiElement? by cached { fir.findPsi(fir.session) } override val psi: PsiElement? by cached { fir.findPsi(fir.session) }
@@ -5,16 +5,16 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.utils package org.jetbrains.kotlin.idea.frontend.api.fir.utils
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
class ReadOnlyWeakRef<V : Any>(value: V, val invalidatable: Invalidatable) { class ReadOnlyWeakRef<V : Any>(value: V, val validityOwner: ValidityOwner) {
val weakRef = WeakReference(value) val weakRef = WeakReference(value)
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline operator fun getValue(thisRef: Any, property: KProperty<*>): V = inline operator fun getValue(thisRef: Any, property: KProperty<*>): V =
weakRef.get() ?: if (invalidatable.isValid()) { weakRef.get() ?: if (validityOwner.isValid()) {
error("Cone type was garbage collected while analysis session is still valid") error("Cone type was garbage collected while analysis session is still valid")
} else { } else {
error("Accessing the invalid coneType") error("Accessing the invalid coneType")
@@ -22,4 +22,4 @@ class ReadOnlyWeakRef<V : Any>(value: V, val invalidatable: Invalidatable) {
} }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
internal inline fun <V : Any> Invalidatable.weakRef(value: V) = ReadOnlyWeakRef(value, this) internal inline fun <V : Any> ValidityOwner.weakRef(value: V) = ReadOnlyWeakRef(value, this)
@@ -5,8 +5,8 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.utils package org.jetbrains.kotlin.idea.frontend.api.fir.utils
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.InvalidatableByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken
import org.jetbrains.kotlin.idea.frontend.api.assertIsValid import org.jetbrains.kotlin.idea.frontend.api.assertIsValid
import kotlin.properties.ReadOnlyProperty import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
@@ -14,14 +14,14 @@ import kotlin.reflect.KProperty
// all access are considered to be from a single thread // all access are considered to be from a single thread
// which should be checked in invalidatable.assertIsValid() // which should be checked in invalidatable.assertIsValid()
class ValidityAwareCachedValue<T>( class ValidityAwareCachedValue<T>(
private val invalidatable: Invalidatable, private val validityOwner: ValidityOwner,
private val init: () -> T private val init: () -> T
) : ReadOnlyProperty<Any, T> { ) : ReadOnlyProperty<Any, T> {
var value: Any? = UNITITIALIZED var value: Any? = UNITITIALIZED
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
override fun getValue(thisRef: Any, property: KProperty<*>): T { override fun getValue(thisRef: Any, property: KProperty<*>): T {
invalidatable.assertIsValid() validityOwner.assertIsValid()
if (value === UNITITIALIZED) { if (value === UNITITIALIZED) {
value = init() value = init()
} }
@@ -29,6 +29,6 @@ class ValidityAwareCachedValue<T>(
} }
} }
internal fun <T> InvalidatableByValidityToken.cached(init: () -> T) = ValidityAwareCachedValue(token, init) internal fun <T> ValidityOwnerByValidityToken.cached(init: () -> T) = ValidityAwareCachedValue(token, init)
internal object UNITITIALIZED internal object UNITITIALIZED