FIR IDE: allow using some light classes stuff from EDT :(

IJ Platform can call light classes methods from EDT from random places
This commit is contained in:
Ilya Kirillov
2020-12-21 12:15:56 +01:00
parent 306b46b8f2
commit 70b1edb81d
2 changed files with 8 additions and 2 deletions
@@ -39,6 +39,8 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.cannotModify
import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.frontend.api.HackToForceAllowRunningAnalyzeOnEDT
import org.jetbrains.kotlin.idea.frontend.api.hackyAllowRunningOnEdt
import java.util.concurrent.TimeUnit
import java.util.concurrent.locks.ReentrantLock
import org.jetbrains.kotlin.trackers.createProjectWideOutOfBlockModificationTracker
@@ -51,9 +53,10 @@ abstract class FirLightClassBase protected constructor(manager: PsiManager) : Li
get() = invalidAccess()
private class FirLightClassesLazyCreator(private val project: Project) : KotlinClassInnerStuffCache.LazyCreator() {
@OptIn(HackToForceAllowRunningAnalyzeOnEDT::class)
override fun <T : Any> get(initializer: () -> T, dependencies: List<Any>): Lazy<T> = lazyPub {
PsiCachedValueImpl(PsiManager.getInstance(project)) {
CachedValueProvider.Result.create(initializer(), dependencies)
CachedValueProvider.Result.create(hackyAllowRunningOnEdt(initializer) , dependencies)
}.value ?: error("initializer cannot return null")
}
}
@@ -19,8 +19,10 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.idea.asJava.*
import org.jetbrains.kotlin.idea.frontend.api.HackToForceAllowRunningAnalyzeOnEDT
import org.jetbrains.kotlin.idea.frontend.api.analyze
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.hackyAllowRunningOnEdt
import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
@@ -44,7 +46,8 @@ fun getOrCreateFirLightClass(classOrObject: KtClassOrObject): KtLightClass? =
)
}
fun createFirLightClassNoCache(classOrObject: KtClassOrObject): KtLightClass? {
@OptIn(HackToForceAllowRunningAnalyzeOnEDT::class)
fun createFirLightClassNoCache(classOrObject: KtClassOrObject): KtLightClass? = hackyAllowRunningOnEdt {
val containingFile = classOrObject.containingFile
if (containingFile is KtCodeFragment) {