diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt index e11c044f12d..84acd762fa0 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt @@ -56,10 +56,13 @@ class LightClassDataProviderForClassOrObject( } override fun compute(): CachedValueProvider.Result? { - val trackerService = KotlinModificationTrackerService.getInstance(classOrObject.project) return CachedValueProvider.Result.create( - computeLightClassData(), - if (classOrObject.isLocal) trackerService.modificationTracker else trackerService.outOfBlockModificationTracker + computeLightClassData(), + if (classOrObject.isLocal()) { + KotlinModificationTrackerService.getInstance(classOrObject.project).modificationTracker + } else { + KotlinModificationTrackerService.getInstance(classOrObject.project).outOfBlockModificationTracker + } ) } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt index ec666ed69ae..bd3c6f974d8 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLazyLightClass.kt @@ -19,17 +19,12 @@ 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 } - private val _getOwnFields: List by lazySync { lightClassData.getOwnFields(this) } - override fun getOwnFields() = _getOwnFields - - private val _getOwnMethods: List by lazySync { lightClassData.getOwnMethods(this) } - override fun getOwnMethods() = _getOwnMethods + override fun getOwnFields() = lightClassData.getOwnFields(this) + override fun getOwnMethods() = lightClassData.getOwnMethods(this) } \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index f21d2680998..97ae5211c52 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -97,9 +97,7 @@ abstract class KtLightClassForSourceDeclaration( abstract override fun getQualifiedName(): String? override val lightClassData: LightClassData - get() = _findLightClassData - - private val _findLightClassData: LightClassData by lazySync { findLightClassData() } + get() = findLightClassData() protected open fun findLightClassData() = getLightClassDataHolder().findDataForClassOrObject(classOrObject) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt index 8663482fdd3..5d2f62ad1da 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt @@ -20,8 +20,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe // NOTE: avoid using blocking lazy in light classes, it leads to deadlocks fun lazyPub(initializer: () -> T) = lazy(LazyThreadSafetyMode.PUBLICATION, initializer) -fun lazySync(initializer: () -> T) = lazy(LazyThreadSafetyMode.SYNCHRONIZED, initializer) - fun LightElement.cannotModify(): Nothing { throw IncorrectOperationException("Modification not implemented.") } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt index a113d426c3c..ca991d14fbb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/LazyLightClassDataHolder.kt @@ -14,7 +14,7 @@ import com.intellij.psi.impl.java.stubs.PsiJavaFileStub import org.jetbrains.kotlin.asJava.LightClassBuilder import org.jetbrains.kotlin.asJava.builder.* import org.jetbrains.kotlin.asJava.classes.KtLightClass -import org.jetbrains.kotlin.asJava.classes.lazySync +import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightFieldImpl import org.jetbrains.kotlin.asJava.elements.KtLightMethod @@ -43,11 +43,9 @@ sealed class LazyLightClassDataHolder( cache.computeIfAbsent(lazyLightClassDataHolder, diagnostics) } - private val _builderExactContextProvider: LightClassBuilderResult by lazySync { builder(exactContextProvider()) } + private val exactResultLazyValue = lazyPub { builder(exactContextProvider()).stub } - private val exactResultLazyValue = lazySync { _builderExactContextProvider.stub } - - private val lazyInexactStub by lazySync { + private val lazyInexactStub by lazyPub { dummyContextProvider?.let { provider -> provider()?.let { context -> builder.invoke(context).stub } } } @@ -58,7 +56,7 @@ sealed class LazyLightClassDataHolder( override val extraDiagnostics: Diagnostics get() = diagnosticsHolderProvider().getOrCompute(this) { - _builderExactContextProvider.diagnostics + builder(exactContextProvider()).diagnostics // Force lazy diagnostics computation because otherwise a lot of memory is retained by computation. // NB: Laziness here is not crucial anyway since somebody already has requested diagnostics and we hope one will use them .takeUnless { it.isEmpty() } ?: Diagnostics.EMPTY @@ -102,9 +100,9 @@ sealed class LazyLightClassDataHolder( private inner class LazyLightClassData( findDelegate: (PsiJavaFileStub) -> PsiClass ) : LightClassData { - override val clsDelegate: PsiClass by lazySync { findDelegate(javaFileStub) } + override val clsDelegate: PsiClass by lazyPub { findDelegate(javaFileStub) } - private val dummyDelegate: PsiClass? by lazySync { inexactStub?.let(findDelegate) } + private val dummyDelegate: PsiClass? by lazyPub { inexactStub?.let(findDelegate) } override fun getOwnFields(containingClass: KtLightClass): List { if (dummyDelegate == null) return KtLightFieldImpl.fromClsFields(clsDelegate, containingClass)