[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
+2
-4
@@ -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,
|
||||||
|
|||||||
+4
-9
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user