[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:
Ilya Kirillov
2023-01-13 16:38:48 +01:00
committed by Space Team
parent 5674722742
commit 729e2971ae
2 changed files with 20 additions and 27 deletions
@@ -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.LLFirNonUnderContentRootSessionFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData 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.addValueFor
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.executeWithoutPCE
import org.jetbrains.kotlin.analysis.project.structure.* import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory
import org.jetbrains.kotlin.analysis.providers.KtModuleStateTracker import org.jetbrains.kotlin.analysis.providers.KtModuleStateTracker
@@ -35,8 +34,7 @@ class LLFirSessionProviderStorage(val project: Project) {
fun getSessionProvider( fun getSessionProvider(
useSiteKtModule: KtModule, useSiteKtModule: KtModule,
configureSession: (LLFirSession.() -> Unit)? = null configureSession: (LLFirSession.() -> Unit)? = null
): LLFirSessionProvider = executeWithoutPCE { ): LLFirSessionProvider = when (useSiteKtModule) {
when (useSiteKtModule) {
is KtSourceModule -> { is KtSourceModule -> {
createSessionProviderForSourceSession(useSiteKtModule, configureSession) createSessionProviderForSourceSession(useSiteKtModule, configureSession)
} }
@@ -53,7 +51,7 @@ class LLFirSessionProviderStorage(val project: Project) {
else -> error("Unexpected ${useSiteKtModule::class.simpleName}") else -> error("Unexpected ${useSiteKtModule::class.simpleName}")
} }
}
private fun createSessionProviderForSourceSession( private fun createSessionProviderForSourceSession(
useSiteKtModule: KtSourceModule, useSiteKtModule: KtSourceModule,
@@ -6,24 +6,19 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.util package org.jetbrains.kotlin.analysis.low.level.api.fir.util
import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.ProgressManager
import com.intellij.psi.util.*
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder import org.jetbrains.kotlin.fir.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.psi 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 org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.concurrent.locks.Lock 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 { internal inline fun <T> Lock.lockWithPCECheck(lockingIntervalMs: Long, action: () -> T): T {
while (true) { while (true) {
checkCanceled() checkCanceled()