Use lazySync instead of lazyPub to avoid raise on creation LightClasses
This commit is contained in:
+3
-6
@@ -56,13 +56,10 @@ class LightClassDataProviderForClassOrObject(
|
||||
}
|
||||
|
||||
override fun compute(): CachedValueProvider.Result<LightClassDataHolder.ForClass>? {
|
||||
val trackerService = KotlinModificationTrackerService.getInstance(classOrObject.project)
|
||||
return CachedValueProvider.Result.create(
|
||||
computeLightClassData(),
|
||||
if (classOrObject.isLocal()) {
|
||||
KotlinModificationTrackerService.getInstance(classOrObject.project).modificationTracker
|
||||
} else {
|
||||
KotlinModificationTrackerService.getInstance(classOrObject.project).outOfBlockModificationTracker
|
||||
}
|
||||
computeLightClassData(),
|
||||
if (classOrObject.isLocal) trackerService.modificationTracker else trackerService.outOfBlockModificationTracker
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,12 +19,17 @@ package org.jetbrains.kotlin.asJava.classes
|
||||
import com.intellij.psi.PsiClass
|
||||
import com.intellij.psi.PsiManager
|
||||
import org.jetbrains.kotlin.asJava.builder.LightClassData
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightField
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
|
||||
|
||||
abstract class KtLazyLightClass(manager: PsiManager) : KtLightClassBase(manager) {
|
||||
abstract val lightClassData: LightClassData
|
||||
|
||||
override val clsDelegate: PsiClass by lazyPub { lightClassData.clsDelegate }
|
||||
|
||||
override fun getOwnFields() = lightClassData.getOwnFields(this)
|
||||
override fun getOwnMethods() = lightClassData.getOwnMethods(this)
|
||||
private val _getOwnFields: List<KtLightField> by lazySync { lightClassData.getOwnFields(this) }
|
||||
override fun getOwnFields() = _getOwnFields
|
||||
|
||||
private val _getOwnMethods: List<KtLightMethod> by lazySync { lightClassData.getOwnMethods(this) }
|
||||
override fun getOwnMethods() = _getOwnMethods
|
||||
}
|
||||
+3
-1
@@ -97,7 +97,9 @@ abstract class KtLightClassForSourceDeclaration(
|
||||
abstract override fun getQualifiedName(): String?
|
||||
|
||||
override val lightClassData: LightClassData
|
||||
get() = findLightClassData()
|
||||
get() = _findLightClassData
|
||||
|
||||
private val _findLightClassData: LightClassData by lazySync { findLightClassData() }
|
||||
|
||||
protected open fun findLightClassData() = getLightClassDataHolder().findDataForClassOrObject(classOrObject)
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||
// NOTE: avoid using blocking lazy in light classes, it leads to deadlocks
|
||||
fun <T> lazyPub(initializer: () -> T) = lazy(LazyThreadSafetyMode.PUBLICATION, initializer)
|
||||
|
||||
fun <T> lazySync(initializer: () -> T) = lazy(LazyThreadSafetyMode.SYNCHRONIZED, initializer)
|
||||
|
||||
fun LightElement.cannotModify(): Nothing {
|
||||
throw IncorrectOperationException("Modification not implemented.")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user