From 729e2971ae770e6b5d5bde7517ec08bbf79ea104 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 13 Jan 2023 16:38:48 +0100 Subject: [PATCH] [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 --- .../sessions/LLFirSessionProviderStorage.kt | 34 +++++++++---------- .../analysis/low/level/api/fir/util/utils.kt | 13 +++---- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt index 3cc6465206e..8690c19d77c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt @@ -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)? diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt index 3abddb1a79b..a85e218db2d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt @@ -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 executeWithoutPCE(crossinline action: () -> T): T { - var result: T? = null - ProgressManager.getInstance().executeNonCancelableSection { result = action() } - @Suppress("UNCHECKED_CAST") - return result as T -} - internal inline fun Lock.lockWithPCECheck(lockingIntervalMs: Long, action: () -> T): T { while (true) { checkCanceled()