Synchronized IdeFirProvider.getOrBuild file, don't share RawFirBuilder

Before this commit RawFirBuilder was reused,
that provoked a lot of synchronization problems
This commit is contained in:
Mikhail Glukhikh
2019-12-05 19:00:01 +03:00
parent ccb343e26b
commit 63121df6ba
2 changed files with 8 additions and 7 deletions
@@ -9,7 +9,6 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleBasedSession
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider
@@ -32,7 +31,7 @@ class FirIdeJavaModuleBasedSession(
init {
registerComponent(
FirProvider::class,
IdeFirProvider(project, scope, RawFirBuilder(this, stubMode = false), this)
IdeFirProvider(project, scope, this)
)
registerComponent(
FirSymbolProvider::class,
@@ -28,7 +28,6 @@ import org.jetbrains.kotlin.psi.KtFile
class IdeFirProvider(
val project: Project,
val scope: GlobalSearchScope,
val builder: RawFirBuilder,
val session: FirSession
) : FirProvider() {
private val cacheProvider = FirProviderImpl(session)
@@ -51,10 +50,13 @@ class IdeFirProvider(
}
fun getOrBuildFile(ktFile: KtFile): FirFile {
return files.getOrPut(ktFile) {
val file = builder.buildFirFile(ktFile)
cacheProvider.recordFile(file)
file
files[ktFile]?.let { return it }
return synchronized(ktFile) {
files.getOrPut(ktFile) {
val file = RawFirBuilder(session, stubMode = false).buildFirFile(ktFile)
cacheProvider.recordFile(file)
file
}
}
}