FIR IDE: do not read declaration phase without read lock hold
This commit is contained in:
committed by
TeamCityServer
parent
0cf00d0f72
commit
0a80fbb078
@@ -26,6 +26,8 @@ import org.jetbrains.kotlin.fir.resolve.calls.jvm.JvmCallConflictResolverFactory
|
|||||||
import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents
|
import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirQualifierResolverImpl
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirQualifierResolverImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirTypeResolverImpl
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirTypeResolverImpl
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseCheckingPhaseManager
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseManager
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.GeneratedClassIndex
|
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.GeneratedClassIndex
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.impl.FirDeclaredMemberScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
||||||
@@ -58,6 +60,10 @@ fun FirSession.registerSealedClassInheritorsProvider() {
|
|||||||
register(SealedClassInheritorsProvider::class, SealedClassInheritorsProviderImpl)
|
register(SealedClassInheritorsProvider::class, SealedClassInheritorsProviderImpl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(SessionConfiguration::class)
|
||||||
|
fun FirSession.registerFirCliPhaseManager() {
|
||||||
|
register(FirPhaseManager::class, FirPhaseCheckingPhaseManager)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// -------------------------- Resolve components --------------------------
|
// -------------------------- Resolve components --------------------------
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ object FirSessionFactory {
|
|||||||
): FirJavaModuleBasedSession {
|
): FirJavaModuleBasedSession {
|
||||||
return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply {
|
return FirJavaModuleBasedSession(moduleInfo, sessionProvider).apply {
|
||||||
registerThreadUnsafeCaches()
|
registerThreadUnsafeCaches()
|
||||||
|
registerFirCliPhaseManager()
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
registerResolveComponents(lookupTracker)
|
registerResolveComponents(lookupTracker)
|
||||||
registerJavaSpecificResolveComponents()
|
registerJavaSpecificResolveComponents()
|
||||||
@@ -127,6 +128,7 @@ object FirSessionFactory {
|
|||||||
): FirLibrarySession {
|
): FirLibrarySession {
|
||||||
return FirLibrarySession(moduleInfo, sessionProvider).apply {
|
return FirLibrarySession(moduleInfo, sessionProvider).apply {
|
||||||
registerThreadUnsafeCaches()
|
registerThreadUnsafeCaches()
|
||||||
|
registerFirCliPhaseManager()
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
registerSealedClassInheritorsProvider()
|
registerSealedClassInheritorsProvider()
|
||||||
|
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 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.fir.resolve.transformers
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirRenderer
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
|
import org.jetbrains.kotlin.fir.render
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
|
|
||||||
|
object FirPhaseCheckingPhaseManager : FirPhaseManager() {
|
||||||
|
override fun ensureResolved(symbol: AbstractFirBasedSymbol<*>, requiredPhase: FirResolvePhase) {
|
||||||
|
val fir = symbol.fir as FirDeclaration
|
||||||
|
val availablePhase = fir.resolvePhase
|
||||||
|
require(availablePhase >= requiredPhase) {
|
||||||
|
"Expected at least $requiredPhase for $symbol but was $availablePhase\n{${fir.render(renderMode)}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val renderMode = FirRenderer.RenderMode.WithResolvePhases.copy(renderDeclarationOrigin = true)
|
||||||
|
}
|
||||||
+1
-1
@@ -17,4 +17,4 @@ abstract class FirPhaseManager : FirSessionComponent {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal val FirSession.phaseManager: FirPhaseManager? by FirSession.nullableSessionComponentAccessor()
|
internal val FirSession.phaseManager: FirPhaseManager by FirSession.sessionComponentAccessor()
|
||||||
|
|||||||
+3
-7
@@ -23,13 +23,9 @@ fun AbstractFirBasedSymbol<*>.ensureResolved(
|
|||||||
// TODO: Decide which one session should be used and probably get rid of the parameter if use-site session is not needed
|
// TODO: Decide which one session should be used and probably get rid of the parameter if use-site session is not needed
|
||||||
@Suppress("UNUSED_PARAMETER") useSiteSession: FirSession,
|
@Suppress("UNUSED_PARAMETER") useSiteSession: FirSession,
|
||||||
) {
|
) {
|
||||||
val fir = fir as FirDeclaration
|
val session = (fir as FirDeclaration).session
|
||||||
val availablePhase = fir.resolvePhase
|
val phaseManager = session.phaseManager
|
||||||
if (availablePhase >= requiredPhase) return
|
phaseManager.ensureResolved(this, requiredPhase)
|
||||||
val resolver = fir.session.phaseManager
|
|
||||||
?: error("phaseManager should be defined when working with FIR in phased mode")
|
|
||||||
|
|
||||||
resolver.ensureResolved(this, requiredPhase)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirSymbolOwner<*>.ensureResolved(
|
fun FirSymbolOwner<*>.ensureResolved(
|
||||||
|
|||||||
+3
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
|||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseCheckingPhaseManager
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseManager
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirPhaseManager
|
||||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.session.*
|
import org.jetbrains.kotlin.fir.session.*
|
||||||
@@ -170,6 +171,7 @@ internal object FirIdeSessionFactory {
|
|||||||
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
|
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
|
||||||
FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply {
|
FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply {
|
||||||
registerIdeComponents()
|
registerIdeComponents()
|
||||||
|
register(FirPhaseManager::class, FirPhaseCheckingPhaseManager)
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
registerJavaSpecificResolveComponents()
|
registerJavaSpecificResolveComponents()
|
||||||
|
|
||||||
@@ -213,6 +215,7 @@ internal object FirIdeSessionFactory {
|
|||||||
): FirIdeBuiltinsAndCloneableSession {
|
): FirIdeBuiltinsAndCloneableSession {
|
||||||
return FirIdeBuiltinsAndCloneableSession(project, builtinTypes).apply {
|
return FirIdeBuiltinsAndCloneableSession(project, builtinTypes).apply {
|
||||||
registerIdeComponents()
|
registerIdeComponents()
|
||||||
|
register(FirPhaseManager::class, FirPhaseCheckingPhaseManager)
|
||||||
registerCommonComponents(languageVersionSettings)
|
registerCommonComponents(languageVersionSettings)
|
||||||
|
|
||||||
val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)
|
val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)
|
||||||
|
|||||||
Reference in New Issue
Block a user