FIR IDE: add hack to allow access symbols on edt
This commit is contained in:
+29
-2
@@ -13,18 +13,45 @@ class ReadActionConfinementValidityToken(project: Project) : ValidityToken() {
|
|||||||
private val modificationTracker = KotlinModificationTrackerService.getInstance(project).modificationTracker
|
private val modificationTracker = KotlinModificationTrackerService.getInstance(project).modificationTracker
|
||||||
private val onCreatedTimeStamp = modificationTracker.modificationCount
|
private val onCreatedTimeStamp = modificationTracker.modificationCount
|
||||||
|
|
||||||
|
@OptIn(HackToForceAllowRunningAnalyzeOnEDT::class)
|
||||||
override fun isValid(): Boolean {
|
override fun isValid(): Boolean {
|
||||||
val application = ApplicationManager.getApplication()
|
val application = ApplicationManager.getApplication()
|
||||||
if (application.isDispatchThread) return false
|
if (application.isDispatchThread && !allowOnEdt.get()) return false
|
||||||
if (!application.isReadAccessAllowed) return false
|
if (!application.isReadAccessAllowed) return false
|
||||||
return onCreatedTimeStamp == modificationTracker.modificationCount
|
return onCreatedTimeStamp == modificationTracker.modificationCount
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(HackToForceAllowRunningAnalyzeOnEDT::class)
|
||||||
override fun getInvalidationReason(): String {
|
override fun getInvalidationReason(): String {
|
||||||
val application = ApplicationManager.getApplication()
|
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 (!application.isReadAccessAllowed) return "Called outside read action"
|
||||||
if (onCreatedTimeStamp != modificationTracker.modificationCount) return "PSI has changed since creation"
|
if (onCreatedTimeStamp != modificationTracker.modificationCount) return "PSI has changed since creation"
|
||||||
error("Getting invalidation reason for valid validity token")
|
error("Getting invalidation reason for valid validity token")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@HackToForceAllowRunningAnalyzeOnEDT
|
||||||
|
val allowOnEdt: ThreadLocal<Boolean> = 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 <T> hackyAllowRunningOnEdt(action: () -> T): T {
|
||||||
|
if (ReadActionConfinementValidityToken.allowOnEdt.get()) return action()
|
||||||
|
ReadActionConfinementValidityToken.allowOnEdt.set(true)
|
||||||
|
try {
|
||||||
|
return action()
|
||||||
|
} finally {
|
||||||
|
ReadActionConfinementValidityToken.allowOnEdt.set(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user