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:
+1
-2
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user