FIR IDE: always pass ValidityToken to KtAnalysisSessionComponent

This commit is contained in:
Ilya Kirillov
2020-08-18 15:47:18 +03:00
parent 2290d2fcc0
commit c191373a6b
10 changed files with 32 additions and 19 deletions
@@ -11,5 +11,4 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
abstract class KtAnalysisSessionComponent : ValidityTokenOwner {
protected abstract val analysisSession: KtAnalysisSession
final override val token: ValidityToken get() = analysisSession.token
}
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.idea.frontend.api.symbols
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.components.KtAnalysisSessionComponent
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
abstract class KtSymbolProvider : ValidityTokenOwner {
abstract class KtSymbolProvider : KtAnalysisSessionComponent() {
open fun getSymbol(psi: KtDeclaration): KtSymbol = when (psi) {
is KtParameter -> getParameterSymbol(psi)
is KtNamedFunction -> getFunctionSymbol(psi)
@@ -34,14 +34,14 @@ private constructor(
private val project = element.project
override val smartCastProvider: KtSmartCastProvider = KtFirSmartcastProvider(this)
override val typeProvider: KtTypeProvider = KtFirTypeProvider(this)
override val diagnosticProvider: KtDiagnosticProvider = KtFirDiagnosticProvider(this)
override val containingDeclarationProvider = KtFirSymbolContainingDeclarationProvider(this)
override val callResolver: KtCallResolver = KtFirCallResolver(this)
override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState) }
override val smartCastProvider: KtSmartCastProvider = KtFirSmartcastProvider(this, token)
override val typeProvider: KtTypeProvider = KtFirTypeProvider(this, token)
override val diagnosticProvider: KtDiagnosticProvider = KtFirDiagnosticProvider(this, token)
override val containingDeclarationProvider = KtFirSymbolContainingDeclarationProvider(this, token)
override val callResolver: KtCallResolver = KtFirCallResolver(this, token)
override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState, token) }
override val symbolProvider: KtSymbolProvider =
KtFirSymbolProvider(token, firResolveState.firIdeLibrariesSession.firSymbolProvider, firResolveState, firSymbolBuilder)
KtFirSymbolProvider(this, firResolveState.firIdeLibrariesSession.firSymbolProvider, firResolveState, firSymbolBuilder, token)
override fun createContextDependentCopy(): KtAnalysisSession {
@@ -28,7 +28,10 @@ import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtExpression
internal class KtFirCallResolver(override val analysisSession: KtFirAnalysisSession) : KtCallResolver(), KtFirAnalysisSessionComponent {
internal class KtFirCallResolver(
override val analysisSession: KtFirAnalysisSession,
override val token: ValidityToken,
) : KtCallResolver(), KtFirAnalysisSessionComponent {
override fun resolveCall(call: KtBinaryExpression): CallInfo? = withValidityAssertion {
val firCall = call.getOrBuildFirSafe<FirFunctionCall>(firResolveState) ?: return null
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartCast
import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartcastKind
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtDiagnosticProvider
import org.jetbrains.kotlin.idea.frontend.api.components.KtSmartCastProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
@@ -21,7 +22,8 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtExpression
internal class KtFirDiagnosticProvider(
override val analysisSession: KtFirAnalysisSession
override val analysisSession: KtFirAnalysisSession,
override val token: ValidityToken,
) : KtDiagnosticProvider(), KtFirAnalysisSessionComponent {
override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> = withValidityAssertion {
LowLevelFirApiFacade.getDiagnosticsFor(element, firResolveState)
@@ -55,8 +55,9 @@ internal class KtFirScopeProvider(
private val builder: KtSymbolByFirBuilder,
private val project: Project,
firResolveState: FirModuleResolveState,
override val token: ValidityToken,
) : KtScopeProvider(), ValidityTokenOwner {
override val analysisSession: KtAnalysisSession by analysisSession.weakRef(analysisSession)
override val analysisSession: KtAnalysisSession by weakRef(analysisSession)
private val firResolveState by weakRef(firResolveState)
private val firScopeStorage = FirScopeRegistry()
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartCast
import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartcastKind
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtSmartCastProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
@@ -17,8 +18,9 @@ import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion
import org.jetbrains.kotlin.psi.KtExpression
internal class KtFirSmartcastProvider(
override val analysisSession: KtFirAnalysisSession
) : KtSmartCastProvider(), KtFirAnalysisSessionComponent {
override val analysisSession: KtFirAnalysisSession,
override val token: ValidityToken,
) : KtSmartCastProvider(), KtFirAnalysisSessionComponent {
override fun getSmartCastedToTypes(expression: KtExpression): Collection<KtType> = withValidityAssertion {
// TODO filter out not used smartcasts
expression.getOrBuildFirSafe<FirExpressionWithSmartcast>(analysisSession.firResolveState)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.components
import com.intellij.psi.util.parentOfType
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtSymbolContainingDeclarationProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -15,7 +16,8 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.psi.KtDeclaration
internal class KtFirSymbolContainingDeclarationProvider(
override val analysisSession: KtFirAnalysisSession
override val analysisSession: KtFirAnalysisSession,
override val token: ValidityToken,
) : KtSymbolContainingDeclarationProvider(), KtFirAnalysisSessionComponent {
override fun getContainingDeclaration(symbol: KtSymbolWithKind): KtSymbolWithKind? {
if (symbol is KtPackageSymbol) return null
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.idea.fir.getOrBuildFirOfType
import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartCast
import org.jetbrains.kotlin.idea.frontend.api.ImplicitReceiverSmartcastKind
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtSmartCastProvider
import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
@@ -23,7 +24,8 @@ import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtExpression
internal class KtFirTypeProvider(
override val analysisSession: KtFirAnalysisSession
override val analysisSession: KtFirAnalysisSession,
override val token: ValidityToken,
) : KtTypeProvider(), KtFirAnalysisSessionComponent {
override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType = withValidityAssertion {
val firDeclaration = declaration.getOrBuildFirOfType<FirCallableDeclaration<*>>(firResolveState)
@@ -9,6 +9,7 @@ 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.fir.low.level.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
@@ -21,10 +22,11 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
internal class KtFirSymbolProvider(
override val token: ValidityToken,
override val analysisSession: KtAnalysisSession,
firSymbolProvider: FirSymbolProvider,
private val resolveState: FirModuleResolveState,
private val firSymbolBuilder: KtSymbolByFirBuilder
private val firSymbolBuilder: KtSymbolByFirBuilder,
override val token: ValidityToken,
) : KtSymbolProvider(), ValidityTokenOwner {
private val firSymbolProvider by weakRef(firSymbolProvider)