diff --git a/platform/core-api/src/com/intellij/psi/stubs/StubBuildCachedValuesManager.kt b/platform/core-api/src/com/intellij/psi/stubs/StubBuildCachedValuesManager.kt index d958f51257c3..47332fad0683 100644 --- a/platform/core-api/src/com/intellij/psi/stubs/StubBuildCachedValuesManager.kt +++ b/platform/core-api/src/com/intellij/psi/stubs/StubBuildCachedValuesManager.kt @@ -41,6 +41,7 @@ import java.util.function.Function object StubBuildCachedValuesManager { private val myStubBuildId = ThreadLocal() + private val myComputingCachedValue = ThreadLocal() private val ourStubBuildIdCounter = AtomicLong() @JvmStatic @@ -59,6 +60,11 @@ object StubBuildCachedValuesManager { val isBuildingStubs: Boolean get() = myStubBuildId.get() != null + @JvmStatic + @get:ApiStatus.Internal + val isComputingCachedValue: Boolean + get() = myComputingCachedValue.get() == true + private val stubBuildId: Long? get() = myStubBuildId.get() @@ -74,7 +80,12 @@ object StubBuildCachedValuesManager { val node = dataHolder.getNode() var current = node.getUserData(stubBuildingKey) if (current == null || current.buildId != stubBuildId) { - current = StubBuildCachedValue(stubBuildId, provider.apply(parameter)) + myComputingCachedValue.set(true) + current = try { + StubBuildCachedValue(stubBuildId, provider.apply(parameter)) + } finally { + myComputingCachedValue.remove() + } node.putUserData>(stubBuildingKey, current) } return current.value @@ -95,7 +106,12 @@ object StubBuildCachedValuesManager { if (stubBuildId != null) { var current = node.getUserData(stubBuildingKey) if (current == null || current.buildId != stubBuildId) { - val value = provider.compute(parameter) + myComputingCachedValue.set(true) + val value = try { + provider.compute(parameter) + } finally { + myComputingCachedValue.remove() + } current = StubBuildCachedValue(stubBuildId, value.getValue()) node.putUserData(stubBuildingKey, current) } @@ -120,8 +136,12 @@ object StubBuildCachedValuesManager { val node = dataHolder.getNode() var current = node.getUserData(stubBuildingKey) if (current == null || current.buildId != stubBuildId) { - - val value = provider.compute(parameter) + myComputingCachedValue.set(true) + val value = try { + provider.compute(parameter) + } finally { + myComputingCachedValue.remove() + } current = StubBuildCachedValue(stubBuildId, value.getValue()) node.putUserData(stubBuildingKey, current) } @@ -177,8 +197,12 @@ object StubBuildCachedValuesManager { val node = dataHolder.getNode() var current = node.getUserData(stubBuildingKey) if (current == null || current.buildId != stubBuildId) { - - val value = provider.compute() + myComputingCachedValue.set(true) + val value = try { + provider.compute() + } finally { + myComputingCachedValue.remove() + } current = StubBuildCachedValue(stubBuildId, value?.getValue()) node.putUserData(stubBuildingKey, current) } diff --git a/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java b/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java index 2b39d29f7f10..b254972424f2 100644 --- a/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java +++ b/platform/core-api/src/com/intellij/psi/util/CachedValuesManager.java @@ -77,6 +77,7 @@ public abstract class CachedValuesManager { P parameter) { ParameterizedCachedValue value; if (StubBuildCachedValuesManager.isBuildingStubs() + && !StubBuildCachedValuesManager.isComputingCachedValue() && (ApplicationManager.getApplication().isUnitTestMode() || ApplicationManager.getApplication().isInternal())) { Logger.getInstance(getClass()).error("StubBuildCachedValuesManager should be used during stub building to improve performance"); }