FIR IDE: run SUPER_TYPES & BODY_RESOLVE phases under global lock

This commit is contained in:
Ilya Kirillov
2020-08-07 22:28:01 +03:00
parent 7fb408ecd7
commit 62df2b3195
4 changed files with 43 additions and 4 deletions
@@ -46,10 +46,11 @@ internal class FirIdeJavaModuleBasedSession private constructor(
fun create(
project: Project,
moduleInfo: ModuleSourceInfo,
firPhaseRunner: FirPhaseRunner,
sessionProvider: FirSessionProvider,
): FirIdeJavaModuleBasedSession {
val scopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped)
val firBuilder = FirFileBuilder(sessionProvider as FirIdeSessionProvider, scopeProvider)
val firBuilder = FirFileBuilder(sessionProvider as FirIdeSessionProvider, scopeProvider, firPhaseRunner)
return FirIdeJavaModuleBasedSession(moduleInfo, sessionProvider, firBuilder).apply {
val cache = ModuleFileCacheImpl(this)
val phasedFirFileResolver = IdePhasedFirFileResolver(firBuilder, cache)
@@ -18,9 +18,11 @@ internal class FirIdeResolveStateService(private val project: Project) {
private fun createResolveStateFor(moduleInfo: IdeaModuleInfo): FirModuleResolveStateImpl {
val sessionProvider = FirIdeSessionProvider(project)
val firPhaseRunner = FirPhaseRunner()
val session = FirIdeJavaModuleBasedSession.create(
project,
moduleInfo as ModuleSourceInfo,
firPhaseRunner,
sessionProvider,
).apply { sessionProvider.registerSession(moduleInfo, this) }
@@ -0,0 +1,35 @@
/*
* 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.fir.low.level.api
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.createTransformerBasedProcessorByPhase
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock
internal class FirPhaseRunner {
private val superTypesBodyResolveLock = ReentrantLock()
private val implicitTypesResolveLock = ReentrantLock()
fun runPhase(firFile: FirFile, phase: FirResolvePhase, scopeSession: ScopeSession) = when (phase) {
FirResolvePhase.SUPER_TYPES -> superTypesBodyResolveLock.withLock {
runPhaseWithoutLock(firFile, phase, scopeSession)
}
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE -> implicitTypesResolveLock.withLock {
runPhaseWithoutLock(firFile, phase, scopeSession)
}
else -> {
runPhaseWithoutLock(firFile, phase, scopeSession)
}
}
private fun runPhaseWithoutLock(firFile: FirFile, phase: FirResolvePhase, scopeSession: ScopeSession) {
val phaseProcessor = phase.createTransformerBasedProcessorByPhase(firFile.session, scopeSession)
phaseProcessor.processFile(firFile)
}
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.createTransformerBasedProcessorByPhase
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeSessionProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe
@@ -22,7 +23,8 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe
@ThreadSafe
internal class FirFileBuilder(
private val sessionProvider: FirIdeSessionProvider,
private val scopeProvider: FirScopeProvider
private val scopeProvider: FirScopeProvider,
private val firPhaseRunner: FirPhaseRunner
) {
/**
* Builds a [FirFile] by given [ktFile] and records it's parenting info if it not present in [cache]
@@ -70,8 +72,7 @@ internal class FirFileBuilder(
var currentPhase = fromPhase
while (currentPhase < toPhase) {
currentPhase = currentPhase.next
val phaseProcessor = currentPhase.createTransformerBasedProcessorByPhase(firFile.session, scopeSession)
phaseProcessor.processFile(firFile)
firPhaseRunner.runPhase(firFile, currentPhase, scopeSession)
}
}
}