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.psi.*
abstract class KtAnalysisSession(project: Project) : Invalidatable {
abstract class KtAnalysisSession(project: Project) : ValidityOwner {
protected open val validityToken = ReadActionConfinementValidityToken(project)
override fun isValid(): Boolean = validityToken.isValid()
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.Name
interface KtType : Invalidatable {
interface KtType : ValidityOwner {
fun isEqualTo(other: KtType): Boolean
fun isSubTypeOf(superType: KtType): Boolean
@@ -9,29 +9,29 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
interface Invalidatable {
interface ValidityOwner {
fun isValid(): Boolean
fun invalidationReason(): String
}
@Suppress("NOTHING_TO_INLINE")
inline fun Invalidatable.assertIsValid() {
inline fun ValidityOwner.assertIsValid() {
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()
return action()
}
interface InvalidatableByValidityToken : Invalidatable {
val token: Invalidatable
interface ValidityOwnerByValidityToken : ValidityOwner {
val token: ValidityOwner
override fun isValid(): Boolean = token.isValid()
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 ownerThread = Thread.currentThread()
private val onCreatedTimeStamp = modificationTracker.modificationCount
@@ -6,9 +6,9 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols
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 psi: PsiElement?
}
@@ -5,11 +5,11 @@
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.psi.*
abstract class KtSymbolProvider : Invalidatable {
abstract class KtSymbolProvider : ValidityOwner {
open fun getSymbol(psi: KtDeclaration): KtSymbol = when (psi) {
is KtParameter -> getParameterSymbol(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.AbstractTypeCheckerContext
internal interface KtFirType : KtType, InvalidatableByValidityToken {
internal interface KtFirType : KtType, ValidityOwnerByValidityToken {
val coneType: ConeKotlinType
val typeCheckerContext: ConeTypeCheckerContext
@@ -49,7 +49,7 @@ internal interface KtFirType : KtType, InvalidatableByValidityToken {
internal class KtFirClassType(
coneType: ConeClassLikeTypeImpl,
typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable,
override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder,
) : KtClassType(), KtFirType {
override val coneType by weakRef(coneType)
@@ -73,7 +73,7 @@ internal class KtFirClassType(
internal class KtFirErrorType(
coneType: ConeClassErrorType,
typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable,
override val token: ValidityOwner,
) : KtErrorType(), KtFirType {
override val coneType by weakRef(coneType)
override val typeCheckerContext by weakRef(typeCheckerContext)
@@ -84,7 +84,7 @@ internal class KtFirErrorType(
internal class KtFirTypeParameterType(
coneType: ConeTypeParameterType,
typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable,
override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder,
) : KtTypeParameterType(), KtFirType {
override val coneType by weakRef(coneType)
@@ -104,7 +104,7 @@ internal class KtFirTypeParameterType(
internal class KtFirFlexibleType(
coneType: ConeFlexibleType,
typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable,
override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder,
) : KtFlexibleType(), KtFirType {
override val coneType by weakRef(coneType)
@@ -117,7 +117,7 @@ internal class KtFirFlexibleType(
internal class KtFirIntersectionType(
coneType: ConeIntersectionType,
typeCheckerContext: ConeTypeCheckerContext,
override val token: Invalidatable,
override val token: ValidityOwner,
private val firBuilder: KtSymbolByFirBuilder,
) : KtIntersectionType(), KtFirType {
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.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.idea.frontend.api.*
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
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.ValidityOwner
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.KtFirLocalVariableSymbol
@@ -9,7 +9,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
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.fir.KtSymbolByFirBuilder
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(
fir: FirAnonymousFunction,
override val token: Invalidatable,
override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder
) : KtAnonymousFunctionSymbol(), KtFirSymbol<FirAnonymousFunction> {
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.fir.declarations.*
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.utils.ReadOnlyWeakRef
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirClassOrObjectSymbol(
fir: FirRegularClass,
override val token: Invalidatable,
override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder
) : KtClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> {
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.resolve.firSymbolProvider
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.fir.KtSymbolByFirBuilder
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(
fir: FirConstructor,
override val token: Invalidatable,
override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder
) : KtConstructorSymbol(), KtFirSymbol<FirConstructor> {
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 org.jetbrains.kotlin.fir.declarations.FirEnumEntry
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.fir.KtSymbolByFirBuilder
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 org.jetbrains.kotlin.fir.declarations.FirField
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.fir.KtSymbolByFirBuilder
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.isSuspend
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.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirFunctionSymbol(
fir: FirSimpleFunction,
override val token: Invalidatable,
override val token: ValidityOwner,
private val builder: KtSymbolByFirBuilder,
) : KtFunctionSymbol(), KtFirSymbol<FirSimpleFunction> {
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 org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
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.fir.KtSymbolByFirBuilder
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 org.jetbrains.kotlin.fir.declarations.FirProperty
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.fir.KtSymbolByFirBuilder
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 org.jetbrains.kotlin.fir.declarations.FirProperty
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.fir.KtSymbolByFirBuilder
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.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.KtSymbolOrigin
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
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.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable
import org.jetbrains.kotlin.idea.frontend.api.InvalidatableByValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
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.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -18,10 +18,10 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.*
internal class KtFirSymbolProvider(
override val token: Invalidatable,
override val token: ValidityOwner,
firSymbolProvider: FirSymbolProvider,
private val firSymbolBuilder: KtSymbolByFirBuilder
) : KtSymbolProvider(), InvalidatableByValidityToken {
) : KtSymbolProvider(), ValidityOwnerByValidityToken {
private val firSymbolProvider by weakRef(firSymbolProvider)
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 org.jetbrains.kotlin.fir.declarations.*
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.cached
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeAliasSymbol
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirTypeAliasSymbol(
fir: FirTypeAlias,
override val token: Invalidatable
override val token: ValidityOwner
) : KtTypeAliasSymbol(), KtFirSymbol<FirTypeAlias> {
override val fir: FirTypeAlias by ReadOnlyWeakRef(fir, this)
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 org.jetbrains.kotlin.fir.declarations.FirTypeParameter
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.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirTypeParameterSymbol(
fir: FirTypeParameter,
override val token: Invalidatable
override val token: ValidityOwner
) : KtTypeParameterSymbol(), KtFirSymbol<FirTypeParameter> {
override val fir: FirTypeParameter by weakRef(fir)
override val psi: PsiElement? by cached { fir.findPsi(fir.session) }
@@ -5,16 +5,16 @@
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 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)
@Suppress("NOTHING_TO_INLINE")
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")
} else {
error("Accessing the invalid coneType")
@@ -22,4 +22,4 @@ class ReadOnlyWeakRef<V : Any>(value: V, val invalidatable: Invalidatable) {
}
@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
import org.jetbrains.kotlin.idea.frontend.api.Invalidatable
import org.jetbrains.kotlin.idea.frontend.api.InvalidatableByValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken
import org.jetbrains.kotlin.idea.frontend.api.assertIsValid
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
@@ -14,14 +14,14 @@ import kotlin.reflect.KProperty
// all access are considered to be from a single thread
// which should be checked in invalidatable.assertIsValid()
class ValidityAwareCachedValue<T>(
private val invalidatable: Invalidatable,
private val validityOwner: ValidityOwner,
private val init: () -> T
) : ReadOnlyProperty<Any, T> {
var value: Any? = UNITITIALIZED
@Suppress("UNCHECKED_CAST")
override fun getValue(thisRef: Any, property: KProperty<*>): T {
invalidatable.assertIsValid()
validityOwner.assertIsValid()
if (value === UNITITIALIZED) {
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