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:
+4
-1
@@ -39,6 +39,8 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass
|
|||||||
import org.jetbrains.kotlin.asJava.classes.cannotModify
|
import org.jetbrains.kotlin.asJava.classes.cannotModify
|
||||||
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
import org.jetbrains.kotlin.asJava.classes.lazyPub
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
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.TimeUnit
|
||||||
import java.util.concurrent.locks.ReentrantLock
|
import java.util.concurrent.locks.ReentrantLock
|
||||||
import org.jetbrains.kotlin.trackers.createProjectWideOutOfBlockModificationTracker
|
import org.jetbrains.kotlin.trackers.createProjectWideOutOfBlockModificationTracker
|
||||||
@@ -51,9 +53,10 @@ abstract class FirLightClassBase protected constructor(manager: PsiManager) : Li
|
|||||||
get() = invalidAccess()
|
get() = invalidAccess()
|
||||||
|
|
||||||
private class FirLightClassesLazyCreator(private val project: Project) : KotlinClassInnerStuffCache.LazyCreator() {
|
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 {
|
override fun <T : Any> get(initializer: () -> T, dependencies: List<Any>): Lazy<T> = lazyPub {
|
||||||
PsiCachedValueImpl(PsiManager.getInstance(project)) {
|
PsiCachedValueImpl(PsiManager.getInstance(project)) {
|
||||||
CachedValueProvider.Result.create(initializer(), dependencies)
|
CachedValueProvider.Result.create(hackyAllowRunningOnEdt(initializer) , dependencies)
|
||||||
}.value ?: error("initializer cannot return null")
|
}.value ?: error("initializer cannot return null")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -19,8 +19,10 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
|||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||||
import org.jetbrains.kotlin.idea.asJava.*
|
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.analyze
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
|
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.*
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility
|
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
|
val containingFile = classOrObject.containingFile
|
||||||
if (containingFile is KtCodeFragment) {
|
if (containingFile is KtCodeFragment) {
|
||||||
|
|||||||
Reference in New Issue
Block a user