FIR IDE: separate ValidityOwner to ValidityTokenOwner & ValidityToken

This commit is contained in:
Ilya Kirillov
2020-07-10 13:38:37 +03:00
parent 6a6580dd97
commit c0f5c90231
35 changed files with 162 additions and 132 deletions
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.frontend.api package org.jetbrains.kotlin.idea.frontend.api
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeProvider import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeProvider
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -13,11 +12,7 @@ import org.jetbrains.kotlin.idea.frontend.api.types.KtType
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) : ValidityOwner { abstract class KtAnalysisSession(override val token: ValidityToken) : ValidityTokenOwner {
protected open val validityToken = ReadActionConfinementValidityToken(project)
override fun isValid(): Boolean = validityToken.isValid()
override fun invalidationReason(): String = validityToken.invalidationReason()
abstract val symbolProvider: KtSymbolProvider abstract val symbolProvider: KtSymbolProvider
abstract val scopeProvider: KtScopeProvider abstract val scopeProvider: KtScopeProvider
@@ -9,33 +9,10 @@ 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 ValidityOwner { class ReadActionConfinementValidityToken(project: Project) : ValidityToken() {
fun isValid(): Boolean
fun invalidationReason(): String
}
@Suppress("NOTHING_TO_INLINE")
inline fun ValidityOwner.assertIsValid() {
assert(isValid()) { "Access to invalid $this, invalidation reason is ${invalidationReason()}" }
}
inline fun <R> ValidityOwner.withValidityAssertion(action: () -> R): R {
assertIsValid()
return action()
}
interface ValidityOwnerByValidityToken : ValidityOwner {
val token: ValidityOwner
override fun isValid(): Boolean = token.isValid()
override fun invalidationReason(): String = token.invalidationReason()
}
class ReadActionConfinementValidityToken(project: Project) : ValidityOwner {
private val modificationTracker = KotlinModificationTrackerService.getInstance(project).modificationTracker private val modificationTracker = KotlinModificationTrackerService.getInstance(project).modificationTracker
private val onCreatedTimeStamp = modificationTracker.modificationCount private val onCreatedTimeStamp = modificationTracker.modificationCount
override fun isValid(): Boolean { override fun isValid(): Boolean {
val application = ApplicationManager.getApplication() val application = ApplicationManager.getApplication()
if (application.isDispatchThread) return false if (application.isDispatchThread) return false
@@ -43,11 +20,11 @@ class ReadActionConfinementValidityToken(project: Project) : ValidityOwner {
return onCreatedTimeStamp == modificationTracker.modificationCount return onCreatedTimeStamp == modificationTracker.modificationCount
} }
override fun invalidationReason(): String { override fun getInvalidationReason(): String {
val application = ApplicationManager.getApplication() val application = ApplicationManager.getApplication()
if (application.isDispatchThread) return "Called in EDT thread" if (application.isDispatchThread) return "Called in EDT thread"
if (!application.isReadAccessAllowed) return "Called outside read action" if (!application.isReadAccessAllowed) return "Called outside read action"
if (onCreatedTimeStamp != modificationTracker.modificationCount) return "PSI has changed since creation" if (onCreatedTimeStamp != modificationTracker.modificationCount) return "PSI has changed since creation"
error("Getting invalidation reason for valid invalidatable") error("Getting invalidation reason for valid validity token")
} }
} }
@@ -0,0 +1,21 @@
/*
* 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.idea.frontend.api
abstract class ValidityToken {
abstract fun isValid(): Boolean
abstract fun getInvalidationReason(): String
}
@Suppress("NOTHING_TO_INLINE")
inline fun ValidityToken.assertIsValid() {
if (!isValid()) {
throw InvalidEntityAccessException("Access to invalid $this, invalidation reason is ${getInvalidationReason()}")
}
}
class InvalidEntityAccessException(override val message: String): IllegalStateException()
@@ -0,0 +1,20 @@
/*
* 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.idea.frontend.api
interface ValidityTokenOwner {
val token: ValidityToken
}
@Suppress("NOTHING_TO_INLINE")
inline fun ValidityTokenOwner.assertIsValid() {
token.assertIsValid()
}
inline fun <R> ValidityTokenOwner.withValidityAssertion(action: () -> R): R {
assertIsValid()
return action()
}
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.idea.frontend.api.scopes package org.jetbrains.kotlin.idea.frontend.api.scopes
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface KtScope : ValidityOwner { interface KtScope : ValidityTokenOwner {
// TODO check that names are accessible // TODO check that names are accessible
// maybe return some kind of lazy set // maybe return some kind of lazy set
fun getAllNames(): Set<Name> fun getAllNames(): Set<Name>
@@ -5,14 +5,14 @@
package org.jetbrains.kotlin.idea.frontend.api.scopes package org.jetbrains.kotlin.idea.frontend.api.scopes
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
abstract class KtScopeProvider : ValidityOwner { abstract class KtScopeProvider : ValidityTokenOwner {
abstract fun getMemberScope(classSymbol: KtClassOrObjectSymbol): KtMemberScope abstract fun getMemberScope(classSymbol: KtClassOrObjectSymbol): KtMemberScope
abstract fun getDeclaredMemberScope(classSymbol: KtClassOrObjectSymbol): KtDeclaredMemberScope abstract fun getDeclaredMemberScope(classSymbol: KtClassOrObjectSymbol): KtDeclaredMemberScope
abstract fun getPackageScope(packageSymbol: KtPackageSymbol): KtPackageScope abstract fun getPackageScope(packageSymbol: KtPackageSymbol): KtPackageScope
@@ -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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
interface KtSymbol : ValidityOwner { interface KtSymbol : ValidityTokenOwner {
val origin: KtSymbolOrigin val origin: KtSymbolOrigin
val psi: PsiElement? val psi: PsiElement?
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols package org.jetbrains.kotlin.idea.frontend.api.symbols
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
abstract class KtSymbolProvider : ValidityOwner { abstract class KtSymbolProvider : ValidityTokenOwner {
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)
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.idea.frontend.api.types package org.jetbrains.kotlin.idea.frontend.api.types
import org.jetbrains.kotlin.idea.frontend.api.KtTypeArgument import org.jetbrains.kotlin.idea.frontend.api.KtTypeArgument
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol 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 : ValidityOwner { interface KtType : ValidityTokenOwner {
fun isEqualTo(other: KtType): Boolean fun isEqualTo(other: KtType): Boolean
fun isSubTypeOf(superType: KtType): Boolean fun isSubTypeOf(superType: KtType): Boolean
@@ -5,8 +5,8 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.scopes package org.jetbrains.kotlin.idea.frontend.api.fir.scopes
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol
@@ -20,8 +20,8 @@ import org.jetbrains.kotlin.name.Name
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
class KtFirCompositeScope( class KtFirCompositeScope(
override val subScopes: List<KtScope>, override val subScopes: List<KtScope>,
override val token: ValidityOwner override val token: ValidityToken
) : KtCompositeScope, ValidityOwnerByValidityToken { ) : KtCompositeScope, ValidityTokenOwner {
override fun getAllNames(): Set<Name> = withValidityAssertion { override fun getAllNames(): Set<Name> = withValidityAssertion {
buildSet { buildSet {
subScopes.flatMapTo(this) { it.getAllNames() } subScopes.flatMapTo(this) { it.getAllNames() }
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
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.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
@@ -17,12 +17,12 @@ import org.jetbrains.kotlin.idea.frontend.api.scopes.KtUnsubstitutedScope
internal class KtFirDeclaredMemberScope( internal class KtFirDeclaredMemberScope(
override val owner: KtFirClassOrObjectSymbol, override val owner: KtFirClassOrObjectSymbol,
override val token: ValidityOwner, token: ValidityToken,
builder: KtSymbolByFirBuilder builder: KtSymbolByFirBuilder
) : KtFirDelegatingScope(builder), ) : KtFirDelegatingScope(builder, token),
KtDeclaredMemberScope, KtDeclaredMemberScope,
KtUnsubstitutedScope<KtFirDelegatingScope>, KtUnsubstitutedScope<KtFirDelegatingScope>,
ValidityOwnerByValidityToken { ValidityTokenOwner {
override val firScope: FirScope by weakRef(declaredMemberScope(owner.fir)) override val firScope: FirScope by weakRef(declaredMemberScope(owner.fir))
} }
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.fir.scopes.processClassifiersByName
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol import org.jetbrains.kotlin.fir.symbols.PossiblyFirFakeOverrideSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope
@@ -23,7 +25,11 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal abstract class KtFirDelegatingScope(private val builder: KtSymbolByFirBuilder) : KtScope, ValidityOwnerByValidityToken { internal abstract class KtFirDelegatingScope(
private val builder: KtSymbolByFirBuilder,
override val token: ValidityToken
) : KtScope, ValidityTokenOwner {
abstract val firScope: FirScope abstract val firScope: FirScope
private val allNamesCached by cached { getCallableNames() + getClassLikeSymbolNames() } private val allNamesCached by cached { getCallableNames() + getClassLikeSymbolNames() }
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope import org.jetbrains.kotlin.fir.resolve.buildUseSiteMemberScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
@@ -18,9 +18,9 @@ import org.jetbrains.kotlin.idea.frontend.api.scopes.KtUnsubstitutedScope
internal class KtFirMemberScope( internal class KtFirMemberScope(
override val owner: KtFirClassOrObjectSymbol, override val owner: KtFirClassOrObjectSymbol,
override val token: ValidityOwner, token: ValidityToken,
builder: KtSymbolByFirBuilder builder: KtSymbolByFirBuilder
) : KtFirDelegatingScope(builder), KtMemberScope, KtUnsubstitutedScope<KtMemberScope>, ValidityOwnerByValidityToken { ) : KtFirDelegatingScope(builder, token), KtMemberScope, KtUnsubstitutedScope<KtMemberScope>, ValidityTokenOwner {
override val firScope: FirScope by weakRef { override val firScope: FirScope by weakRef {
owner.fir.buildUseSiteMemberScope(owner.fir.session, ScopeSession()) owner.fir.buildUseSiteMemberScope(owner.fir.session, ScopeSession())
} }
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes
import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractSimpleImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractSimpleImportingScope
import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultSimpleImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultSimpleImportingScope
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
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
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtNonStarImportingScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtNonStarImportingScope
@@ -19,8 +19,8 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirNonStarImportingScope( internal class KtFirNonStarImportingScope(
firScope: FirAbstractSimpleImportingScope, firScope: FirAbstractSimpleImportingScope,
builder: KtSymbolByFirBuilder, builder: KtSymbolByFirBuilder,
override val token: ValidityOwner override val token: ValidityToken
) : KtFirDelegatingScope(builder), KtNonStarImportingScope, ValidityOwnerByValidityToken { ) : KtFirDelegatingScope(builder, token), KtNonStarImportingScope, ValidityTokenOwner {
override val firScope: FirAbstractSimpleImportingScope = firScope override val firScope: FirAbstractSimpleImportingScope = firScope
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
@@ -8,20 +8,19 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.scopes
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
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.symbols.KtFirPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol
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.scopes.KtPackageScope import org.jetbrains.kotlin.idea.frontend.api.scopes.KtPackageScope
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol
internal class KtFirPackageScope( internal class KtFirPackageScope(
override val owner: KtFirPackageSymbol, override val owner: KtFirPackageSymbol,
override val token: ValidityOwner, token: ValidityToken,
builder: KtSymbolByFirBuilder, builder: KtSymbolByFirBuilder,
session: FirSession, session: FirSession,
) : KtPackageScope, KtFirDelegatingScope(builder), ValidityOwnerByValidityToken { ) : KtPackageScope, KtFirDelegatingScope(builder, token), ValidityTokenOwner {
override val firScope: FirScope by weakRef { override val firScope: FirScope by weakRef {
FirPackageMemberScope(owner.fqName, session) FirPackageMemberScope(owner.fqName, session)
} }
@@ -16,8 +16,8 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope
import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirPackageSymbol
@@ -36,12 +36,12 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import java.util.* import java.util.*
internal class KtFirScopeProvider( internal class KtFirScopeProvider(
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder, private val builder: KtSymbolByFirBuilder,
private val project: Project, private val project: Project,
session: FirSession, session: FirSession,
val firResolveState: FirModuleResolveState val firResolveState: FirModuleResolveState
) : KtScopeProvider(), ValidityOwnerByValidityToken { ) : KtScopeProvider(), ValidityTokenOwner {
private val session by weakRef(session) private val session by weakRef(session)
private val memberScopeCache = IdentityHashMap<KtClassOrObjectSymbol, KtMemberScope>() private val memberScopeCache = IdentityHashMap<KtClassOrObjectSymbol, KtMemberScope>()
@@ -120,7 +120,7 @@ internal class KtFirScopeProvider(
} }
} }
private class KtFirDelegatingScopeImpl(firScope: FirScope, builder: KtSymbolByFirBuilder, override val token: ValidityOwner) : private class KtFirDelegatingScopeImpl(firScope: FirScope, builder: KtSymbolByFirBuilder, token: ValidityToken) :
KtFirDelegatingScope(builder), ValidityOwnerByValidityToken { KtFirDelegatingScope(builder, token), ValidityTokenOwner {
override val firScope: FirScope = firScope override val firScope: FirScope = firScope
} }
@@ -9,8 +9,8 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope
import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultStarImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultStarImportingScope
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
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
import org.jetbrains.kotlin.idea.frontend.api.scopes.Import import org.jetbrains.kotlin.idea.frontend.api.scopes.Import
@@ -29,8 +29,8 @@ internal class KtFirStarImportingScope(
firScope: FirAbstractStarImportingScope, firScope: FirAbstractStarImportingScope,
builder: KtSymbolByFirBuilder, builder: KtSymbolByFirBuilder,
project: Project, project: Project,
override val token: ValidityOwner, token: ValidityToken,
) : KtFirDelegatingScope(builder), KtStarImportingScope, ValidityOwnerByValidityToken { ) : KtFirDelegatingScope(builder, token), KtStarImportingScope, ValidityTokenOwner {
override val firScope: FirAbstractStarImportingScope = firScope override val firScope: FirAbstractStarImportingScope = firScope
override val isDefaultImportingScope: Boolean = withValidityAssertion { firScope is FirDefaultStarImportingScope } override val isDefaultImportingScope: Boolean = withValidityAssertion { firScope is FirDefaultStarImportingScope }
private val packageHelper = PackageIndexHelper(project) private val packageHelper = PackageIndexHelper(project)
@@ -9,7 +9,8 @@ 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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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 +19,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.*
internal class KtFirAnonymousFunctionSymbol( internal class KtFirAnonymousFunctionSymbol(
fir: FirAnonymousFunction, fir: FirAnonymousFunction,
override val token: ValidityOwner, override val token: ValidityToken,
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)
@@ -7,14 +7,14 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
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.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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
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.*
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -22,10 +22,10 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirClassOrObjectSymbol( internal class KtFirClassOrObjectSymbol(
fir: FirRegularClass, fir: FirRegularClass,
override val token: ValidityOwner, override val token: ValidityToken,
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 weakRef(fir)
override val psi: PsiElement? by cached { fir.findPsi(fir.session) } override val psi: PsiElement? by cached { fir.findPsi(fir.session) }
override val name: Name get() = withValidityAssertion { fir.classId.shortClassName } override val name: Name get() = withValidityAssertion { fir.classId.shortClassName }
override val classId: ClassId get() = withValidityAssertion { fir.classId } override val classId: ClassId get() = withValidityAssertion { fir.classId }
@@ -12,7 +12,8 @@ import org.jetbrains.kotlin.fir.declarations.getPrimaryConstructorIfAny
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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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
@@ -23,7 +24,7 @@ import org.jetbrains.kotlin.name.ClassId
internal class KtFirConstructorSymbol( internal class KtFirConstructorSymbol(
fir: FirConstructor, fir: FirConstructor,
override val token: ValidityOwner, override val token: ValidityToken,
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,8 @@ 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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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
@@ -19,7 +20,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirConstructorValueParameterSymbol( internal class KtFirConstructorValueParameterSymbol(
fir: FirValueParameterImpl, fir: FirValueParameterImpl,
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtConstructorParameterSymbol(), KtFirSymbol<FirValueParameterImpl> { ) : KtConstructorParameterSymbol(), KtFirSymbol<FirValueParameterImpl> {
override val fir: FirValueParameterImpl by weakRef(fir) override val fir: FirValueParameterImpl by weakRef(fir)
@@ -8,7 +8,8 @@ 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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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
@@ -19,7 +20,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirEnumEntrySymbol( internal class KtFirEnumEntrySymbol(
fir: FirEnumEntry, fir: FirEnumEntry,
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtEnumEntrySymbol(), KtFirSymbol<FirEnumEntry> { ) : KtEnumEntrySymbol(), KtFirSymbol<FirEnumEntry> {
override val fir: FirEnumEntry by weakRef(fir) override val fir: FirEnumEntry by weakRef(fir)
@@ -9,7 +9,8 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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 +25,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirFunctionSymbol( internal class KtFirFunctionSymbol(
fir: FirSimpleFunction, fir: FirSimpleFunction,
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder, private val builder: KtSymbolByFirBuilder,
private val forcedOrigin: FirDeclarationOrigin? = null private val forcedOrigin: FirDeclarationOrigin? = null
) : KtFunctionSymbol(), KtFirSymbol<FirSimpleFunction> { ) : KtFunctionSymbol(), KtFirSymbol<FirSimpleFunction> {
@@ -8,7 +8,8 @@ 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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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
@@ -20,7 +21,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirFunctionValueParameterSymbol( internal class KtFirFunctionValueParameterSymbol(
fir: FirValueParameterImpl, fir: FirValueParameterImpl,
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtFunctionParameterSymbol(), KtFirSymbol<FirValueParameterImpl> { ) : KtFunctionParameterSymbol(), KtFirSymbol<FirValueParameterImpl> {
override val fir: FirValueParameterImpl by weakRef(fir) override val fir: FirValueParameterImpl by weakRef(fir)
@@ -9,8 +9,9 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.declarations.FirField import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.modality import org.jetbrains.kotlin.fir.declarations.modality
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
@@ -21,7 +22,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirJavaFieldSymbol( internal class KtFirJavaFieldSymbol(
fir: FirField, fir: FirField,
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtJavaFieldSymbol(), KtFirSymbol<FirField> { ) : KtJavaFieldSymbol(), KtFirSymbol<FirField> {
override val fir: FirField by weakRef(fir) override val fir: FirField by weakRef(fir)
@@ -8,7 +8,8 @@ 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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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
@@ -20,7 +21,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirLocalVariableSymbol( internal class KtFirLocalVariableSymbol(
fir: FirProperty, fir: FirProperty,
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder private val builder: KtSymbolByFirBuilder
) : KtLocalVariableSymbol(), ) : KtLocalVariableSymbol(),
KtFirSymbol<FirProperty> { KtFirSymbol<FirProperty> {
@@ -9,21 +9,18 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import com.intellij.psi.impl.file.PsiPackageImpl import com.intellij.psi.impl.file.PsiPackageImpl
import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
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
import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
class KtFirPackageSymbol( class KtFirPackageSymbol(
override val fqName: FqName, override val fqName: FqName,
private val project: Project, private val project: Project,
override val token: ValidityOwner override val token: ValidityToken
) : KtPackageSymbol(), ValidityOwnerByValidityToken { ) : KtPackageSymbol(), ValidityTokenOwner {
override val psi: PsiElement? by cached { override val psi: PsiElement? by cached {
PsiPackageImpl(PsiManager.getInstance(project), fqName.asString().replace('/', '.')) PsiPackageImpl(PsiManager.getInstance(project), fqName.asString().replace('/', '.'))
} }
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.modality import org.jetbrains.kotlin.fir.declarations.modality
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.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 +26,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirPropertySymbol( internal class KtFirPropertySymbol(
fir: FirProperty, fir: FirProperty,
override val token: ValidityOwner, override val token: ValidityToken,
private val builder: KtSymbolByFirBuilder, private val builder: KtSymbolByFirBuilder,
private val forcedOrigin: FirDeclarationOrigin? private val forcedOrigin: FirDeclarationOrigin?
) : KtPropertySymbol(), KtFirSymbol<FirProperty> { ) : KtPropertySymbol(), KtFirSymbol<FirProperty> {
@@ -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.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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, ValidityOwnerByValidityToken { internal interface KtFirSymbol<F : FirDeclaration> : KtSymbol, ValidityTokenOwner {
val fir: F val fir: F
override val origin: KtSymbolOrigin get() = withValidityAssertion { fir.origin.asKtSymbolOrigin() } override val origin: KtSymbolOrigin get() = withValidityAssertion { fir.origin.asKtSymbolOrigin() }
} }
@@ -9,8 +9,8 @@ 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.fir.low.level.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
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.*
@@ -21,11 +21,11 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
internal class KtFirSymbolProvider( internal class KtFirSymbolProvider(
override val token: ValidityOwner, override val token: ValidityToken,
firSymbolProvider: FirSymbolProvider, firSymbolProvider: FirSymbolProvider,
private val resolveState: FirModuleResolveState, private val resolveState: FirModuleResolveState,
private val firSymbolBuilder: KtSymbolByFirBuilder private val firSymbolBuilder: KtSymbolByFirBuilder
) : KtSymbolProvider(), ValidityOwnerByValidityToken { ) : KtSymbolProvider(), ValidityTokenOwner {
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,9 +8,11 @@ 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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeAliasSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeAliasSymbol
import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -18,9 +20,9 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirTypeAliasSymbol( internal class KtFirTypeAliasSymbol(
fir: FirTypeAlias, fir: FirTypeAlias,
override val token: ValidityOwner override val token: ValidityToken
) : KtTypeAliasSymbol(), KtFirSymbol<FirTypeAlias> { ) : KtTypeAliasSymbol(), KtFirSymbol<FirTypeAlias> {
override val fir: FirTypeAlias by ReadOnlyWeakRef(fir, this) override val fir: FirTypeAlias by weakRef(fir)
override val psi: PsiElement? by cached { fir.findPsi(fir.session) } override val psi: PsiElement? by cached { fir.findPsi(fir.session) }
override val name: Name get() = withValidityAssertion { fir.name } override val name: Name get() = withValidityAssertion { fir.name }
override val classId: ClassId get() = withValidityAssertion { fir.symbol.classId } override val classId: ClassId get() = withValidityAssertion { fir.symbol.classId }
@@ -8,7 +8,8 @@ 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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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 +18,7 @@ import org.jetbrains.kotlin.name.Name
internal class KtFirTypeParameterSymbol( internal class KtFirTypeParameterSymbol(
fir: FirTypeParameter, fir: FirTypeParameter,
override val token: ValidityOwner override val token: ValidityToken
) : 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) }
@@ -19,7 +19,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, ValidityOwnerByValidityToken { internal interface KtFirType : KtType, ValidityTokenOwner {
val coneType: ConeKotlinType val coneType: ConeKotlinType
val typeCheckerContext: ConeTypeCheckerContext val typeCheckerContext: ConeTypeCheckerContext
@@ -50,7 +50,7 @@ internal interface KtFirType : KtType, ValidityOwnerByValidityToken {
internal class KtFirClassType( internal class KtFirClassType(
coneType: ConeClassLikeTypeImpl, coneType: ConeClassLikeTypeImpl,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: ValidityOwner, override val token: ValidityToken,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtClassType(), KtFirType { ) : KtClassType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -74,7 +74,7 @@ internal class KtFirClassType(
internal class KtFirErrorType( internal class KtFirErrorType(
coneType: ConeClassErrorType, coneType: ConeClassErrorType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: ValidityOwner, override val token: ValidityToken,
) : 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)
@@ -85,7 +85,7 @@ internal class KtFirErrorType(
internal class KtFirTypeParameterType( internal class KtFirTypeParameterType(
coneType: ConeTypeParameterType, coneType: ConeTypeParameterType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: ValidityOwner, override val token: ValidityToken,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtTypeParameterType(), KtFirType { ) : KtTypeParameterType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -105,7 +105,7 @@ internal class KtFirTypeParameterType(
internal class KtFirFlexibleType( internal class KtFirFlexibleType(
coneType: ConeFlexibleType, coneType: ConeFlexibleType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: ValidityOwner, override val token: ValidityToken,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtFlexibleType(), KtFirType { ) : KtFlexibleType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -118,7 +118,7 @@ internal class KtFirFlexibleType(
internal class KtFirIntersectionType( internal class KtFirIntersectionType(
coneType: ConeIntersectionType, coneType: ConeIntersectionType,
typeCheckerContext: ConeTypeCheckerContext, typeCheckerContext: ConeTypeCheckerContext,
override val token: ValidityOwner, override val token: ValidityToken,
private val firBuilder: KtSymbolByFirBuilder, private val firBuilder: KtSymbolByFirBuilder,
) : KtIntersectionType(), KtFirType { ) : KtIntersectionType(), KtFirType {
override val coneType by weakRef(coneType) override val coneType by weakRef(coneType)
@@ -5,16 +5,19 @@
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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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 validityOwner: ValidityOwner) { class ReadOnlyWeakRef<V : Any>
@Deprecated("Consider suing ValidityTokenOwner.weakRef instead")
constructor(value: V, val token: ValidityToken) {
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 (validityOwner.isValid()) { weakRef.get() ?: if (token.isValid()) {
error("Value of $property was garbage collected while analysis session is still valid") error("Value of $property was garbage collected while analysis session is still valid")
} else { } else {
error("Accessing the invalid value of $property") error("Accessing the invalid value of $property")
@@ -22,6 +25,6 @@ class ReadOnlyWeakRef<V : Any>(value: V, val validityOwner: ValidityOwner) {
} }
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
internal inline fun <V : Any> ValidityOwner.weakRef(value: V) = ReadOnlyWeakRef(value, this) internal inline fun <V : Any> ValidityTokenOwner.weakRef(value: V) = ReadOnlyWeakRef(value, token)
internal inline fun <V : Any> ValidityOwner.weakRef(value: () -> V) = ReadOnlyWeakRef(value(), this) internal inline fun <V : Any> ValidityTokenOwner.weakRef(value: () -> V) = ReadOnlyWeakRef(value(), token)
@@ -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.ValidityOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.ValidityOwnerByValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
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
@@ -15,16 +15,16 @@ import kotlin.reflect.KProperty
* Lazy value that guaranties safe publication and checks validity on every access * Lazy value that guaranties safe publication and checks validity on every access
*/ */
class ValidityAwareCachedValue<T>( class ValidityAwareCachedValue<T>(
private val validityOwner: ValidityOwner, private val token: ValidityToken,
init: () -> T init: () -> T
) : ReadOnlyProperty<Any, T> { ) : ReadOnlyProperty<Any, T> {
private val lazyValue = lazy(LazyThreadSafetyMode.PUBLICATION, init) private val lazyValue = lazy(LazyThreadSafetyMode.PUBLICATION, init)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
override fun getValue(thisRef: Any, property: KProperty<*>): T { override fun getValue(thisRef: Any, property: KProperty<*>): T {
validityOwner.assertIsValid() token.assertIsValid()
return lazyValue.value return lazyValue.value
} }
} }
internal fun <T> ValidityOwnerByValidityToken.cached(init: () -> T) = ValidityAwareCachedValue(token, init) internal fun <T> ValidityTokenOwner.cached(init: () -> T) = ValidityAwareCachedValue(token, init)