[LL FIR] do not create project module under non-cancelable section
It seems to be safe as we modify the caches atomically by updating LLFirSessionsCache.mappings. So, PCE during project structure creation, should not break the caches ^KTIJ-24012 fixed
This commit is contained in:
committed by
Space Team
parent
5674722742
commit
729e2971ae
+16
-18
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirLi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirNonUnderContentRootSessionFactory
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.addValueFor
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.executeWithoutPCE
|
||||
import org.jetbrains.kotlin.analysis.project.structure.*
|
||||
import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
|
||||
import org.jetbrains.kotlin.analysis.providers.KtModuleStateTracker
|
||||
@@ -35,26 +34,25 @@ class LLFirSessionProviderStorage(val project: Project) {
|
||||
fun getSessionProvider(
|
||||
useSiteKtModule: KtModule,
|
||||
configureSession: (LLFirSession.() -> Unit)? = null
|
||||
): LLFirSessionProvider = executeWithoutPCE {
|
||||
when (useSiteKtModule) {
|
||||
is KtSourceModule -> {
|
||||
createSessionProviderForSourceSession(useSiteKtModule, configureSession)
|
||||
}
|
||||
|
||||
is KtLibraryModule, is KtLibrarySourceModule -> {
|
||||
createSessionProviderForLibraryOrLibrarySource(useSiteKtModule, configureSession)
|
||||
}
|
||||
|
||||
is KtNotUnderContentRootModule -> {
|
||||
val session = LLFirNonUnderContentRootSessionFactory.getInstance(project)
|
||||
.getNonUnderContentRootSession(useSiteKtModule)
|
||||
LLFirSessionProvider(project, session, KtModuleToSessionMappingByMapImpl(mapOf(useSiteKtModule to session)))
|
||||
}
|
||||
|
||||
else -> error("Unexpected ${useSiteKtModule::class.simpleName}")
|
||||
): LLFirSessionProvider = when (useSiteKtModule) {
|
||||
is KtSourceModule -> {
|
||||
createSessionProviderForSourceSession(useSiteKtModule, configureSession)
|
||||
}
|
||||
|
||||
is KtLibraryModule, is KtLibrarySourceModule -> {
|
||||
createSessionProviderForLibraryOrLibrarySource(useSiteKtModule, configureSession)
|
||||
}
|
||||
|
||||
is KtNotUnderContentRootModule -> {
|
||||
val session = LLFirNonUnderContentRootSessionFactory.getInstance(project)
|
||||
.getNonUnderContentRootSession(useSiteKtModule)
|
||||
LLFirSessionProvider(project, session, KtModuleToSessionMappingByMapImpl(mapOf(useSiteKtModule to session)))
|
||||
}
|
||||
|
||||
else -> error("Unexpected ${useSiteKtModule::class.simpleName}")
|
||||
}
|
||||
|
||||
|
||||
private fun createSessionProviderForSourceSession(
|
||||
useSiteKtModule: KtSourceModule,
|
||||
configureSession: (LLFirSession.() -> Unit)?
|
||||
|
||||
+4
-9
@@ -6,24 +6,19 @@
|
||||
package org.jetbrains.kotlin.analysis.low.level.api.fir.util
|
||||
|
||||
import com.intellij.openapi.progress.ProgressManager
|
||||
import com.intellij.psi.util.*
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtObjectLiteralExpression
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral
|
||||
import java.util.concurrent.TimeUnit
|
||||
import java.util.concurrent.locks.Lock
|
||||
|
||||
|
||||
internal inline fun <T> executeWithoutPCE(crossinline action: () -> T): T {
|
||||
var result: T? = null
|
||||
ProgressManager.getInstance().executeNonCancelableSection { result = action() }
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return result as T
|
||||
}
|
||||
|
||||
internal inline fun <T> Lock.lockWithPCECheck(lockingIntervalMs: Long, action: () -> T): T {
|
||||
while (true) {
|
||||
checkCanceled()
|
||||
|
||||
Reference in New Issue
Block a user