From a42674ef0e8d60e894eb115cb46bd4f31a1d73fa Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 19 Oct 2020 14:17:23 +0300 Subject: [PATCH] FIR IDE: add hack to allow access symbols on edt --- .../api/ReadActionConfinementValidityToken.kt | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/ReadActionConfinementValidityToken.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/ReadActionConfinementValidityToken.kt index 4753f4cf1a4..f23d1512d53 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/ReadActionConfinementValidityToken.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/ReadActionConfinementValidityToken.kt @@ -13,18 +13,45 @@ class ReadActionConfinementValidityToken(project: Project) : ValidityToken() { private val modificationTracker = KotlinModificationTrackerService.getInstance(project).modificationTracker private val onCreatedTimeStamp = modificationTracker.modificationCount + @OptIn(HackToForceAllowRunningAnalyzeOnEDT::class) override fun isValid(): Boolean { val application = ApplicationManager.getApplication() - if (application.isDispatchThread) return false + if (application.isDispatchThread && !allowOnEdt.get()) return false if (!application.isReadAccessAllowed) return false return onCreatedTimeStamp == modificationTracker.modificationCount } + @OptIn(HackToForceAllowRunningAnalyzeOnEDT::class) override fun getInvalidationReason(): String { val application = ApplicationManager.getApplication() - if (application.isDispatchThread) return "Called in EDT thread" + if (application.isDispatchThread && !allowOnEdt.get()) return "Called in EDT thread" if (!application.isReadAccessAllowed) return "Called outside read action" if (onCreatedTimeStamp != modificationTracker.modificationCount) return "PSI has changed since creation" error("Getting invalidation reason for valid validity token") } + + companion object { + @HackToForceAllowRunningAnalyzeOnEDT + val allowOnEdt: ThreadLocal = ThreadLocal.withInitial { false } + } +} + +@RequiresOptIn("All frontend related work should not be allowed to be ran from EDT thread. Only use it as a temporary solution") +annotation class HackToForceAllowRunningAnalyzeOnEDT + +/** + * All frontend related work should not be allowed to be ran from EDT thread. Only use it as a temporary solution. + * + * @see KtAnalysisSession + * @see ReadActionConfinementValidityToken + */ +@HackToForceAllowRunningAnalyzeOnEDT +inline fun hackyAllowRunningOnEdt(action: () -> T): T { + if (ReadActionConfinementValidityToken.allowOnEdt.get()) return action() + ReadActionConfinementValidityToken.allowOnEdt.set(true) + try { + return action() + } finally { + ReadActionConfinementValidityToken.allowOnEdt.set(false) + } } \ No newline at end of file