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 com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.FirModuleBasedSession 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.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider import org.jetbrains.kotlin.fir.resolve.FirProvider
@@ -32,7 +31,7 @@ class FirIdeJavaModuleBasedSession(
init { init {
registerComponent( registerComponent(
FirProvider::class, FirProvider::class,
IdeFirProvider(project, scope, RawFirBuilder(this, stubMode = false), this) IdeFirProvider(project, scope, this)
) )
registerComponent( registerComponent(
FirSymbolProvider::class, FirSymbolProvider::class,
@@ -28,7 +28,6 @@ import org.jetbrains.kotlin.psi.KtFile
class IdeFirProvider( class IdeFirProvider(
val project: Project, val project: Project,
val scope: GlobalSearchScope, val scope: GlobalSearchScope,
val builder: RawFirBuilder,
val session: FirSession val session: FirSession
) : FirProvider() { ) : FirProvider() {
private val cacheProvider = FirProviderImpl(session) private val cacheProvider = FirProviderImpl(session)
@@ -51,10 +50,13 @@ class IdeFirProvider(
} }
fun getOrBuildFile(ktFile: KtFile): FirFile { fun getOrBuildFile(ktFile: KtFile): FirFile {
return files.getOrPut(ktFile) { files[ktFile]?.let { return it }
val file = builder.buildFirFile(ktFile) return synchronized(ktFile) {
cacheProvider.recordFile(file) files.getOrPut(ktFile) {
file val file = RawFirBuilder(session, stubMode = false).buildFirFile(ktFile)
cacheProvider.recordFile(file)
file
}
} }
} }