From e1488eddc89e8744986cb3da8e686c827f0d6f34 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 8 Apr 2019 19:50:12 +0200 Subject: [PATCH] remove unnecessary RecursionGuard instantiations, explain when to use them in javadoc --- .../psi/infos/MethodCandidateInfo.java | 2 +- .../intellij/psi/impl/PsiSubstitutorImpl.java | 3 +- .../psi/impl/ScopedClassHierarchy.java | 7 +-- .../psi/impl/source/JavaVarTypeUtil.java | 6 +- .../psi/impl/source/PsiTypeElementImpl.java | 3 +- .../impl/source/resolve/JavaResolveCache.java | 3 +- .../source/resolve/PsiOldInferenceHelper.java | 3 +- .../psi/impl/source/resolve/ResolveCache.java | 9 ++- .../com/intellij/util/CachedValueBase.java | 5 +- .../com/intellij/util/IdempotenceChecker.java | 3 +- .../execution/services/ServiceView.java | 5 +- .../com/intellij/semantic/SemServiceImpl.java | 2 +- .../RecursionPreventingSafePublicationLazy.kt | 2 +- .../openapi/util/AtomicNotNullLazyValue.java | 3 +- .../openapi/util/AtomicNullableLazyValue.java | 3 +- .../openapi/util/ClearableLazyValue.java | 3 +- .../com/intellij/openapi/util/FieldCache.java | 3 +- .../intellij/openapi/util/NotNullLazyKey.java | 3 +- .../openapi/util/NotNullLazyValue.java | 3 +- .../openapi/util/NullableLazyKey.java | 3 +- .../openapi/util/NullableLazyValue.java | 3 +- .../intellij/openapi/util/RecursionGuard.java | 12 ++-- .../openapi/util/RecursionManager.java | 3 +- .../intellij/openapi/util/UserDataCache.java | 3 +- .../util/VolatileNotNullLazyValue.java | 3 +- .../util/VolatileNullableLazyValue.java | 3 +- .../util/containers/ConcurrentFactoryMap.java | 4 +- .../intellij/util/containers/FactoryMap.java | 4 +- .../lang/psi/impl/GroovyPsiManager.java | 2 +- .../impl/statements/GrVariableBaseImpl.java | 4 +- .../groovy/util/GroovyStdTypeCalculators.java | 9 +-- .../util/NotNullCachedComputableWrapper.java | 5 +- .../util/RecursionAwareSafePublicationLazy.kt | 3 +- .../plugins/javaFX/fxml/JavaFxPsiUtil.java | 3 +- .../intellij/patterns/uast/UastPatterns.kt | 4 +- .../intellij/psi/UastReferenceRegistrar.kt | 5 +- .../util/xml/impl/DomSemContributor.java | 59 ++++++++----------- .../util/xml/impl/DynamicGenericInfo.java | 4 +- .../psi/impl/source/xml/XmlTagImpl.java | 5 +- .../xml/impl/schema/XmlNSDescriptorImpl.java | 8 +-- 40 files changed, 84 insertions(+), 136 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java index a7cc85842b08..3a5d5e1c7aab 100644 --- a/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java +++ b/java/java-psi-api/src/com/intellij/psi/infos/MethodCandidateInfo.java @@ -313,7 +313,7 @@ public class MethodCandidateInfo extends CandidateInfo{ PsiSubstitutor incompleteSubstitutor = super.getSubstitutor(); PsiMethod method = getElement(); if (myTypeArguments == null) { - final RecursionGuard.StackStamp stackStamp = PsiDiamondType.ourDiamondGuard.markStack(); + RecursionGuard.StackStamp stackStamp = RecursionManager.markStack(); myApplicabilityError.remove(); try { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java index f9b0cd248b21..b92bdab7156d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSubstitutorImpl.java @@ -143,12 +143,11 @@ public class PsiSubstitutorImpl implements PsiSubstitutor { return mySubstitutionMap != null ? mySubstitutionMap.hashCode() : 0; } - private static final RecursionGuard ourGuard = RecursionManager.createGuard("substituteGuard"); private PsiType rawTypeForTypeParameter(@NotNull PsiTypeParameter typeParameter) { final PsiClassType[] extendsTypes = typeParameter.getExtendsListTypes(); if (extendsTypes.length > 0) { // First bound - return ourGuard.doPreventingRecursion(extendsTypes[0], true, () -> substitute(extendsTypes[0])); + return RecursionManager.doPreventingRecursion(extendsTypes[0], true, () -> substitute(extendsTypes[0])); } // Object return PsiType.getJavaLangObject(typeParameter.getManager(), typeParameter.getResolveScope()); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/ScopedClassHierarchy.java b/java/java-psi-impl/src/com/intellij/psi/impl/ScopedClassHierarchy.java index e1135e5247c5..f44f56ab42f7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/ScopedClassHierarchy.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/ScopedClassHierarchy.java @@ -55,7 +55,6 @@ class ScopedClassHierarchy { return o1.getManager().areElementsEquivalent(o1, o2); } }; - private static final RecursionGuard ourGuard = RecursionManager.createGuard("ScopedClassHierarchy"); private final PsiClass myPlaceClass; private final GlobalSearchScope myResolveScope; private volatile Map mySupersWithSubstitutors; @@ -110,7 +109,7 @@ class ScopedClassHierarchy { Map map = hierarchy.mySupersWithSubstitutors; if (map == null) { map = ContainerUtil.newTroveMap(CLASS_HASHING_STRATEGY); - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); hierarchy.visitType(JavaPsiFacade.getElementFactory(derivedClass.getProject()).createType(derivedClass, PsiSubstitutor.EMPTY), map); if (stamp.mayCacheNow()) { hierarchy.mySupersWithSubstitutors = map; @@ -143,8 +142,8 @@ class ScopedClassHierarchy { List getImmediateSupersWithCapturing() { List list = myImmediateSupersWithCapturing; if (list == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); - list = ourGuard.doPreventingRecursion(this, true, () -> calcImmediateSupersWithCapturing()); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); + list = RecursionManager.doPreventingRecursion(this, true, () -> calcImmediateSupersWithCapturing()); if (list == null) { return Collections.emptyList(); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java index 56ed41c92157..76259f5bd0d4 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/JavaVarTypeUtil.java @@ -15,7 +15,6 @@ */ package com.intellij.psi.impl.source; -import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; @@ -28,8 +27,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; public class JavaVarTypeUtil { - public static final RecursionGuard ourVarGuard = RecursionManager.createGuard("var.guard"); - public static PsiType getUpwardProjection(@NotNull PsiType t) { return t.accept(new UpwardProjectionTypeVisitor()); } @@ -53,7 +50,6 @@ public class JavaVarTypeUtil { } private static class UpwardProjectionTypeVisitor extends PsiTypeVisitorEx { - private static final RecursionGuard upwardGuard = RecursionManager.createGuard("upwardProjectionGuard"); @Override public PsiType visitType(PsiType type) { return type; @@ -114,7 +110,7 @@ public class JavaVarTypeUtil { } else { - PsiType U = upwardGuard.doPreventingRecursion(ai, true, () -> ai.accept(this)); + PsiType U = RecursionManager.doPreventingRecursion(ai, true, () -> ai.accept(this)); if (U == null) { targetSubstitutor = targetSubstitutor.put(parameter, PsiWildcardType.createUnbounded(manager)); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java index 18e8f091d5c1..ffbbcf106aa3 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java @@ -17,6 +17,7 @@ package com.intellij.psi.impl.source; import com.intellij.codeInsight.daemon.impl.analysis.JavaGenericsUtil; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.*; import com.intellij.psi.augment.PsiAugmentProvider; import com.intellij.psi.impl.PsiImplUtil; @@ -172,7 +173,7 @@ public class PsiTypeElementImpl extends CompositePsiElement implements PsiTypeEl if (!(e instanceof PsiArrayInitializerExpression) && !isSelfReferenced((PsiExpression)e, parent)) { PsiExpression expression = (PsiExpression)e; - PsiType type = JavaVarTypeUtil.ourVarGuard.doPreventingRecursion(expression, true, () -> expression.getType()); + PsiType type = RecursionManager.doPreventingRecursion(expression, true, () -> expression.getType()); return type == null ? null : JavaVarTypeUtil.getUpwardProjection(type); } return null; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java index 7b0dc2e75e33..a06bed0c4d49 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java @@ -24,6 +24,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NotNullLazyKey; import com.intellij.openapi.util.RecursionGuard; +import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.*; import com.intellij.psi.impl.AnyPsiChangeListener; import com.intellij.psi.impl.PsiManagerImpl; @@ -86,7 +87,7 @@ public class JavaResolveCache { PsiType type = isOverloadCheck && polyExpression ? null : map.get(expr); if (type == null) { - final RecursionGuard.StackStamp dStackStamp = PsiDiamondType.ourDiamondGuard.markStack(); + RecursionGuard.StackStamp dStackStamp = RecursionManager.markStack(); type = f.fun(expr); if (!dStackStamp.mayCacheNow()) { return type; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java index ed2667b9e59b..9c124bd084d0 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java @@ -6,6 +6,7 @@ import com.intellij.openapi.projectRoots.JavaSdkVersion; import com.intellij.openapi.projectRoots.JavaVersionService; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.RecursionGuard; +import com.intellij.openapi.util.RecursionManager; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -39,7 +40,7 @@ public class PsiOldInferenceHelper implements PsiInferenceHelper { if (argument == null) continue; if (argument instanceof PsiMethodCallExpression && PsiResolveHelper.ourGuard.currentStack().contains(argument)) continue; - final RecursionGuard.StackStamp stackStamp = PsiDiamondType.ourDiamondGuard.markStack(); + RecursionGuard.StackStamp stackStamp = RecursionManager.markStack(); argTypes[j] = argument.getType(); if (!stackStamp.mayCacheNow()) { argTypes[j] = null; diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java index ed653d8bf321..c69841250a54 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java @@ -42,7 +42,6 @@ import java.util.concurrent.atomic.AtomicReferenceArray; public class ResolveCache { private final AtomicReferenceArray myPhysicalMaps = new AtomicReferenceArray<>(4); //boolean incompleteCode, boolean isPoly private final AtomicReferenceArray myNonPhysicalMaps = new AtomicReferenceArray<>(4); //boolean incompleteCode, boolean isPoly - private final RecursionGuard myGuard = RecursionManager.createGuard("resolveCache"); public static ResolveCache getInstance(Project project) { ProgressIndicatorProvider.checkCanceled(); // We hope this method is being called often enough to cancel daemon processes smoothly @@ -145,8 +144,8 @@ public class ResolveCache { return result; } - RecursionGuard.StackStamp stamp = myGuard.markStack(); - result = needToPreventRecursion ? myGuard.doPreventingRecursion(Trinity.create(ref, incompleteCode, isPoly), true, + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); + result = needToPreventRecursion ? RecursionManager.doPreventingRecursion(Trinity.create(ref, incompleteCode, isPoly), true, () -> resolver.resolve(ref, incompleteCode)) : resolver.resolve(ref, incompleteCode); if (result instanceof ResolveResult) { ensureValidPsi((ResolveResult)result); @@ -198,8 +197,8 @@ public class ResolveCache { return result; } - RecursionGuard.StackStamp stamp = myGuard.markStack(); - result = needToPreventRecursion ? myGuard.doPreventingRecursion(Pair.create(ref, incompleteCode), true, + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); + result = needToPreventRecursion ? RecursionManager.doPreventingRecursion(Pair.create(ref, incompleteCode), true, () -> resolver.resolve(ref, containingFile, incompleteCode)) : resolver.resolve(ref, containingFile, incompleteCode); if (result != null) { ensureValidResults(result); diff --git a/platform/core-impl/src/com/intellij/util/CachedValueBase.java b/platform/core-impl/src/com/intellij/util/CachedValueBase.java index 6b4b8f308cc7..f07ba512b77e 100644 --- a/platform/core-impl/src/com/intellij/util/CachedValueBase.java +++ b/platform/core-impl/src/com/intellij/util/CachedValueBase.java @@ -22,7 +22,6 @@ import java.util.List; */ public abstract class CachedValueBase { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.CachedValueImpl"); - private static final RecursionGuard ourGuard = RecursionManager.createGuard("cachedValue"); private final boolean myTrackValue; private volatile SoftReference> myData; @@ -236,10 +235,10 @@ public abstract class CachedValueBase { return data.getValue(); } - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); Computable> calcData = () -> computeData(doCompute(param)); - data = ourGuard.doPreventingRecursion(this, true, calcData); + data = RecursionManager.doPreventingRecursion(this, true, calcData); if (data == null) { data = calcData.compute(); } diff --git a/platform/core-impl/src/com/intellij/util/IdempotenceChecker.java b/platform/core-impl/src/com/intellij/util/IdempotenceChecker.java index 84a83f2417c5..97c341e66049 100644 --- a/platform/core-impl/src/com/intellij/util/IdempotenceChecker.java +++ b/platform/core-impl/src/com/intellij/util/IdempotenceChecker.java @@ -24,7 +24,6 @@ import java.util.concurrent.ThreadLocalRandom; public class IdempotenceChecker { private static final Logger LOG = Logger.getInstance(IdempotenceChecker.class); private static final Set ourReportedValueClasses = Collections.synchronizedSet(ContainerUtil.newTroveSet()); - private static final RecursionGuard ourGuard = RecursionManager.createGuard("IdempotenceChecker"); private static final ThreadLocal ourRandomCheckNesting = ThreadLocal.withInitial(() -> 0); private static final RegistryValue ourRateCheckProperty = Registry.get("platform.random.idempotence.check.rate"); @@ -257,7 +256,7 @@ public class IdempotenceChecker { */ public static void applyForRandomCheck(T data, Object provider, Computable recomputeValue) { if (areRandomChecksEnabled() && shouldPerformRandomCheck()) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); Integer prevNesting = ourRandomCheckNesting.get(); ourRandomCheckNesting.set(prevNesting + 1); try { diff --git a/platform/lang-impl/src/com/intellij/execution/services/ServiceView.java b/platform/lang-impl/src/com/intellij/execution/services/ServiceView.java index 0afabbceef17..af59b669aeb5 100644 --- a/platform/lang-impl/src/com/intellij/execution/services/ServiceView.java +++ b/platform/lang-impl/src/com/intellij/execution/services/ServiceView.java @@ -23,7 +23,6 @@ import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Splitter; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.ui.*; import com.intellij.ui.components.JBPanelWithEmptyText; @@ -87,8 +86,6 @@ class ServiceView extends JPanel implements Disposable { @NotNull private final Project myProject; @NotNull private final ServiceViewState myState; - private final RecursionGuard myGuard = RecursionManager.createGuard("ServiceView.getData"); - ServiceView(@NotNull Project project, @NotNull ServiceViewState state) { super(new BorderLayout()); myProject = project; @@ -125,7 +122,7 @@ class ServiceView extends JPanel implements Disposable { ServiceViewContributor.ViewDescriptor descriptor = getSelectedDescriptor(); DataProvider dataProvider = descriptor == null ? null : descriptor.getDataProvider(); if (dataProvider != null) { - return myGuard.doPreventingRecursion(this, false, () -> dataProvider.getData(dataId)); + return RecursionManager.doPreventingRecursion(this, false, () -> dataProvider.getData(dataId)); } return null; }); diff --git a/platform/lang-impl/src/com/intellij/semantic/SemServiceImpl.java b/platform/lang-impl/src/com/intellij/semantic/SemServiceImpl.java index 89f64c912c91..e2b8033d2b17 100644 --- a/platform/lang-impl/src/com/intellij/semantic/SemServiceImpl.java +++ b/platform/lang-impl/src/com/intellij/semantic/SemServiceImpl.java @@ -150,7 +150,7 @@ public class SemServiceImpl extends SemService { ensureInitialized(); - RecursionGuard.StackStamp stamp = RecursionManager.createGuard("semService").markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); LinkedHashSet result = new LinkedHashSet<>(); final Map> map = new THashMap<>(); diff --git a/platform/projectModel-api/src/com/intellij/util/RecursionPreventingSafePublicationLazy.kt b/platform/projectModel-api/src/com/intellij/util/RecursionPreventingSafePublicationLazy.kt index 6528b8e43068..48f8c4ce2281 100644 --- a/platform/projectModel-api/src/com/intellij/util/RecursionPreventingSafePublicationLazy.kt +++ b/platform/projectModel-api/src/com/intellij/util/RecursionPreventingSafePublicationLazy.kt @@ -27,7 +27,7 @@ class RecursionPreventingSafePublicationLazy(recursionKey: Any?, initializer: return ourNotNullizer.nullize(valueRef.get()) } - val stamp = ourRecursionGuard.markStack() + val stamp = RecursionManager.markStack() val newValue = ourRecursionGuard.doPreventingRecursion(recursionKey, false, initializerValue) // In case of recursion don't update [valueRef] and don't clear [initializer]. if (newValue === null) { diff --git a/platform/util/src/com/intellij/openapi/util/AtomicNotNullLazyValue.java b/platform/util/src/com/intellij/openapi/util/AtomicNotNullLazyValue.java index 57d4467634ab..0f1ddee16a6c 100644 --- a/platform/util/src/com/intellij/openapi/util/AtomicNotNullLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/AtomicNotNullLazyValue.java @@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public abstract class AtomicNotNullLazyValue extends NotNullLazyValue { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("AtomicNotNullLazyValue"); private volatile T myValue; @Override @@ -34,7 +33,7 @@ public abstract class AtomicNotNullLazyValue extends NotNullLazyValue { synchronized (this) { value = myValue; if (value == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = compute(); if (stamp.mayCacheNow()) { myValue = value; diff --git a/platform/util/src/com/intellij/openapi/util/AtomicNullableLazyValue.java b/platform/util/src/com/intellij/openapi/util/AtomicNullableLazyValue.java index 47608b618d4b..f0d1a33038fa 100644 --- a/platform/util/src/com/intellij/openapi/util/AtomicNullableLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/AtomicNullableLazyValue.java @@ -23,7 +23,6 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public abstract class AtomicNullableLazyValue extends NullableLazyValue { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("AtomicNullableLazyValue"); private volatile T myValue; private volatile boolean myComputed; @@ -39,7 +38,7 @@ public abstract class AtomicNullableLazyValue extends NullableLazyValue { computed = myComputed; value = myValue; if (!computed) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = compute(); if (stamp.mayCacheNow()) { myValue = value; diff --git a/platform/util/src/com/intellij/openapi/util/ClearableLazyValue.java b/platform/util/src/com/intellij/openapi/util/ClearableLazyValue.java index de32d9cb568c..22414f00eb6b 100644 --- a/platform/util/src/com/intellij/openapi/util/ClearableLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/ClearableLazyValue.java @@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull; * Thread-safe version: {@link AtomicClearableLazyValue}. */ public abstract class ClearableLazyValue { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("ClearableLazyValue"); @NotNull public static ClearableLazyValue create(final Computable computable) { @@ -44,7 +43,7 @@ public abstract class ClearableLazyValue { public T getValue() { T result = myValue; if (result == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); result = compute(); if (stamp.mayCacheNow()) { myValue = result; diff --git a/platform/util/src/com/intellij/openapi/util/FieldCache.java b/platform/util/src/com/intellij/openapi/util/FieldCache.java index f60890f73d4b..4802f210191c 100644 --- a/platform/util/src/com/intellij/openapi/util/FieldCache.java +++ b/platform/util/src/com/intellij/openapi/util/FieldCache.java @@ -19,7 +19,6 @@ package com.intellij.openapi.util; import java.util.concurrent.locks.ReentrantReadWriteLock; public abstract class FieldCache { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("fieldCache"); private final ReentrantReadWriteLock.ReadLock r; private final ReentrantReadWriteLock.WriteLock w; @@ -45,7 +44,7 @@ public abstract class FieldCache { try { result = getValue(owner, a); if (result == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); result = compute(owner, p); if (stamp.mayCacheNow()) { putValue(result, owner, a); diff --git a/platform/util/src/com/intellij/openapi/util/NotNullLazyKey.java b/platform/util/src/com/intellij/openapi/util/NotNullLazyKey.java index afca8e1df48a..1694d9d96e76 100644 --- a/platform/util/src/com/intellij/openapi/util/NotNullLazyKey.java +++ b/platform/util/src/com/intellij/openapi/util/NotNullLazyKey.java @@ -23,7 +23,6 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public class NotNullLazyKey extends Key{ - private static final RecursionGuard ourGuard = RecursionManager.createGuard("NotNullLazyKey"); private final NotNullFunction myFunction; private NotNullLazyKey(@NotNull @NonNls String name, @NotNull NotNullFunction function) { @@ -35,7 +34,7 @@ public class NotNullLazyKey extends Key{ public final T getValue(@NotNull H h) { T data = h.getUserData(this); if (data == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); data = myFunction.fun(h); if (stamp.mayCacheNow()) { if (h instanceof UserDataHolderEx) { diff --git a/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java b/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java index cd5f7b7a3f00..dfaceca39340 100644 --- a/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java @@ -25,7 +25,6 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public abstract class NotNullLazyValue { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("NotNullLazyValue"); private T myValue; @NotNull @@ -35,7 +34,7 @@ public abstract class NotNullLazyValue { public T getValue() { T result = myValue; if (result == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); result = compute(); if (stamp.mayCacheNow()) { myValue = result; diff --git a/platform/util/src/com/intellij/openapi/util/NullableLazyKey.java b/platform/util/src/com/intellij/openapi/util/NullableLazyKey.java index ff227aa75be1..62db5767b24a 100644 --- a/platform/util/src/com/intellij/openapi/util/NullableLazyKey.java +++ b/platform/util/src/com/intellij/openapi/util/NullableLazyKey.java @@ -24,7 +24,6 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public class NullableLazyKey extends Key{ - private static final RecursionGuard ourGuard = RecursionManager.createGuard("NullableLazyKey"); private final NullableFunction myFunction; private NullableLazyKey(@NonNls String name, final NullableFunction function) { @@ -36,7 +35,7 @@ public class NullableLazyKey extends Key{ public final T getValue(H h) { T data = h.getUserData(this); if (data == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); data = myFunction.fun(h); if (stamp.mayCacheNow()) { //noinspection unchecked diff --git a/platform/util/src/com/intellij/openapi/util/NullableLazyValue.java b/platform/util/src/com/intellij/openapi/util/NullableLazyValue.java index d02f01bf9a3a..966bc9397e0f 100644 --- a/platform/util/src/com/intellij/openapi/util/NullableLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/NullableLazyValue.java @@ -22,7 +22,6 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public abstract class NullableLazyValue { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("NullableLazyValue"); private boolean myComputed; @Nullable private T myValue; @@ -33,7 +32,7 @@ public abstract class NullableLazyValue { public T getValue() { T value = myValue; if (!myComputed) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = compute(); if (stamp.mayCacheNow()) { myValue = value; diff --git a/platform/util/src/com/intellij/openapi/util/RecursionGuard.java b/platform/util/src/com/intellij/openapi/util/RecursionGuard.java index 1711d73a8526..01b5e372697a 100644 --- a/platform/util/src/com/intellij/openapi/util/RecursionGuard.java +++ b/platform/util/src/com/intellij/openapi/util/RecursionGuard.java @@ -32,21 +32,25 @@ public abstract class RecursionGuard { * @param key an id of the computation. It's stored internally to ensure that a recursive calls with the same key won't lead to endless recursion. * @param memoize whether the result of the computation may be cached thread-locally until the last currently active {@code doPreventingRecursion} call * completes. May be used to speed up things when recursion re-entrance happens: otherwise nothing would be cached at all and - * in some cases exponential performance may be observed. Pass {@code true} if your computation has no side effects. + * in some cases exponential performance may be observed. Pass {@code true} if your computation has no side effects + * and doesn't depend on method parameters. * @param computation a piece of code to compute. * @return the result of the computation or {@code null} if we're entering a computation with this key on this thread recursively, */ @Nullable public abstract T doPreventingRecursion(@NotNull Object key, boolean memoize, @NotNull Computable computation); - /** Use {@link RecursionManager#markStack()} instead */ + /** @deprecated Use {@link RecursionManager#markStack()} instead */ @NotNull + @Deprecated public StackStamp markStack() { return RecursionManager.markStack(); } /** - * @return the current thread-local stack of keys passed to {@link #doPreventingRecursion(Object, boolean, Computable)} + * Note: if you make decisions based on the result of this method, you'd better couple it with {@link #prohibitResultCaching}, + * otherwise you might cache inconsistent values. + * @return the current thread-local stack of keys passed to {@link #doPreventingRecursion(Object, boolean, Computable)}. */ @NotNull public abstract List currentStack(); @@ -71,7 +75,7 @@ public abstract class RecursionGuard { * re-entrant recursive results. When such non-reliable results exist in the thread's call stack, returns false, otherwise true.

* * If you use this with {@link RecursionGuard#doPreventingRecursion(Object, boolean, Computable)}, then the - * {@link RecursionGuard#markStack()}+{@link #mayCacheNow()} should be outside of recursion prevention call. Otherwise + * {@link RecursionManager#markStack()}+{@link #mayCacheNow()} should be outside of recursion prevention call. Otherwise * even the outer recursive computation result won't be cached. In particular, {@code doPreventingRecursion} calls should * be inside your {@link com.intellij.psi.util.CachedValue} provider, not outside cached value access. */ diff --git a/platform/util/src/com/intellij/openapi/util/RecursionManager.java b/platform/util/src/com/intellij/openapi/util/RecursionManager.java index 5978678002d3..279c184debb6 100644 --- a/platform/util/src/com/intellij/openapi/util/RecursionManager.java +++ b/platform/util/src/com/intellij/openapi/util/RecursionManager.java @@ -44,7 +44,7 @@ import java.util.stream.Stream; * {@code RecursionManager} assists in distinguishing this situation and allowing caching outside that loop, but disallowing it inside.

* * To prevent caching incorrect values, please create a {@code private static final} field of {@link #createGuard} call, and then use - * {@link RecursionGuard#markStack()} and {@link RecursionGuard.StackStamp#mayCacheNow()} + * {@link RecursionManager#markStack()} and {@link RecursionGuard.StackStamp#mayCacheNow()} * on it.

* * Note that the above only helps with idempotent recursion loops, that is, the ones that stabilize after one iteration, so that @@ -73,6 +73,7 @@ public class RecursionManager { /** * @param id just some string to separate different recursion prevention policies from each other * @return a helper object which allow you to perform reentrancy-safe computations and check whether caching will be safe. + * Don't use it unless you need to call it from several places in the code, inspect the computation stack and/or prohibit result caching. */ @NotNull public static RecursionGuard createGuard(@NonNls final String id) { diff --git a/platform/util/src/com/intellij/openapi/util/UserDataCache.java b/platform/util/src/com/intellij/openapi/util/UserDataCache.java index f8cce3bc52da..12dfcc06c620 100644 --- a/platform/util/src/com/intellij/openapi/util/UserDataCache.java +++ b/platform/util/src/com/intellij/openapi/util/UserDataCache.java @@ -19,7 +19,6 @@ package com.intellij.openapi.util; import org.jetbrains.annotations.NonNls; public abstract class UserDataCache extends FieldCache, Param> { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("userDataCache"); private final Key myKey; protected UserDataCache() { @@ -52,7 +51,7 @@ public abstract class UserDataCache exte public T get(Key a, Owner owner, Param p) { T value = owner.getUserData(a); if (value == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = compute(owner, p); if (stamp.mayCacheNow()) { value = ((UserDataHolderEx)owner).putUserDataIfAbsent(a, value); diff --git a/platform/util/src/com/intellij/openapi/util/VolatileNotNullLazyValue.java b/platform/util/src/com/intellij/openapi/util/VolatileNotNullLazyValue.java index ebaf38620001..55d7e889bd4d 100644 --- a/platform/util/src/com/intellij/openapi/util/VolatileNotNullLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/VolatileNotNullLazyValue.java @@ -25,7 +25,6 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public abstract class VolatileNotNullLazyValue extends NotNullLazyValue { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("VolatileNotNullLazyValue"); private volatile T myValue; @Override @@ -33,7 +32,7 @@ public abstract class VolatileNotNullLazyValue extends NotNullLazyValue { public final T getValue() { T value = myValue; if (value == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = compute(); if (stamp.mayCacheNow()) { myValue = value; diff --git a/platform/util/src/com/intellij/openapi/util/VolatileNullableLazyValue.java b/platform/util/src/com/intellij/openapi/util/VolatileNullableLazyValue.java index cf3cd7dfa59f..a7dd87f7c848 100644 --- a/platform/util/src/com/intellij/openapi/util/VolatileNullableLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/VolatileNullableLazyValue.java @@ -11,7 +11,6 @@ import org.jetbrains.annotations.Nullable; * @author peter */ public abstract class VolatileNullableLazyValue extends NullableLazyValue { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("VolatileNullableLazyValue"); private volatile boolean myComputed; @Nullable private volatile T myValue; @@ -24,7 +23,7 @@ public abstract class VolatileNullableLazyValue extends NullableLazyValue public T getValue() { T value = myValue; if (!myComputed) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = compute(); if (stamp.mayCacheNow()) { myValue = value; diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java index e5c964221d11..1c5af0df516f 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java @@ -18,8 +18,6 @@ import java.util.function.Supplier; * For not thread-safe (but possible faster and more memory-efficient) alternative please use {@link FactoryMap} */ public abstract class ConcurrentFactoryMap implements ConcurrentMap { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("factoryMap"); - private final ConcurrentMap myMap = createMap(); /** @@ -44,7 +42,7 @@ public abstract class ConcurrentFactoryMap implements ConcurrentMap { K k = notNull(key); V value = map.get(k); if (value == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = create((K)key); if (stamp.mayCacheNow()) { V v = notNull(value); diff --git a/platform/util/src/com/intellij/util/containers/FactoryMap.java b/platform/util/src/com/intellij/util/containers/FactoryMap.java index e3584718a0bc..17a8e82e1f0c 100644 --- a/platform/util/src/com/intellij/util/containers/FactoryMap.java +++ b/platform/util/src/com/intellij/util/containers/FactoryMap.java @@ -33,8 +33,6 @@ import java.util.function.Supplier; * For thread-safe alternative please use {@link ConcurrentFactoryMap} */ public abstract class FactoryMap implements Map { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("factoryMap"); - private Map myMap; /** @@ -58,7 +56,7 @@ public abstract class FactoryMap implements Map { K k = notNull(key); V value = map.get(k); if (value == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = create((K)key); if (stamp.mayCacheNow()) { V v = notNull(value); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java index 0f19484cbf20..2918d6e20f90 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyPsiManager.java @@ -130,7 +130,7 @@ public class GroovyPsiManager { private static PsiType getTypeWithCaching(@NotNull K key, @NotNull ConcurrentMap map, @NotNull Function calculator) { PsiType type = map.get(key); if (type == null) { - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); type = calculator.fun(key); if (type == null) { type = UNKNOWN_TYPE; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java index db12abe01185..44ec92b99a04 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrVariableBaseImpl.java @@ -41,8 +41,6 @@ import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; public abstract class GrVariableBaseImpl extends GrStubElementBase implements GrVariable, StubBasedPsiElement { public static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.lang.psi.impl.statements.GrVariableImpl"); - private static final RecursionGuard ourGuard = RecursionManager.createGuard("grVariableInitializer"); - protected GrVariableBaseImpl(ASTNode node) { super(node); } @@ -151,7 +149,7 @@ public abstract class GrVariableBaseImpl extends G } if (initializer != null) { - PsiType initializerType = ourGuard.doPreventingRecursion(this, true, initializer::getType); + PsiType initializerType = RecursionManager.doPreventingRecursion(this, true, initializer::getType); if (declaredType == null) return initializerType; if (initializerType instanceof PsiClassType && TypesUtil.isAssignable(declaredType, initializerType, this)) { return initializerType; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/GroovyStdTypeCalculators.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/GroovyStdTypeCalculators.java index 94939f048d8c..36933b29b8ec 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/GroovyStdTypeCalculators.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/GroovyStdTypeCalculators.java @@ -15,8 +15,6 @@ */ package org.jetbrains.plugins.groovy.util; -import com.intellij.openapi.util.NullableComputable; -import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiType; @@ -32,11 +30,6 @@ import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; */ public class GroovyStdTypeCalculators { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("GrDescriptorReturnTypeCalculator getClosureReturnType"); - - private GroovyStdTypeCalculators() { - } - public static class ClosureTypeExtractor implements PairFunction { @Override public PsiType fun(GrMethodCall methodCall, PsiMethod method) { @@ -54,7 +47,7 @@ public class GroovyStdTypeCalculators { final GrClosableBlock finalClosure = closure; - return ourGuard.doPreventingRecursion(methodCall, true, (NullableComputable)() -> { + return RecursionManager.doPreventingRecursion(methodCall, true, () -> { PsiType returnType = finalClosure.getReturnType(); if (PsiType.VOID.equals(returnType)) return null; return returnType; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/NotNullCachedComputableWrapper.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/NotNullCachedComputableWrapper.java index 03db6342d81a..9cc892b10560 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/NotNullCachedComputableWrapper.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/NotNullCachedComputableWrapper.java @@ -24,9 +24,6 @@ import org.jetbrains.annotations.TestOnly; import java.util.concurrent.atomic.AtomicReference; public class NotNullCachedComputableWrapper implements NotNullComputable { - - private static final RecursionGuard ourGuard = RecursionManager.createGuard(NotNullCachedComputableWrapper.class.getName()); - private volatile NotNullComputable myComputable; private final AtomicReference myValueRef = new AtomicReference<>(); @@ -44,7 +41,7 @@ public class NotNullCachedComputableWrapper implements NotNullComputable { final NotNullComputable computable = myComputable; if (computable == null) continue; // computable is null only after some thread succeeds CAS - RecursionGuard.StackStamp stamp = ourGuard.markStack(); + RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = computable.compute(); if (stamp.mayCacheNow()) { if (myValueRef.compareAndSet(null, value)) { // try to cache value diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/RecursionAwareSafePublicationLazy.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/RecursionAwareSafePublicationLazy.kt index 86d2fcb5b971..03256be8403e 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/RecursionAwareSafePublicationLazy.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/util/RecursionAwareSafePublicationLazy.kt @@ -28,7 +28,7 @@ class RecursionAwareSafePublicationLazy(initializer: () -> T) : Lazy { return valueRef.get() } - val stamp = ourRecursionGuard.markStack() + val stamp = RecursionManager.markStack() val newValue = initializerValue() if (!stamp.mayCacheNow()) { // In case of recursion don't update [valueRef] and don't clear [initializer]. @@ -49,7 +49,6 @@ class RecursionAwareSafePublicationLazy(initializer: () -> T) : Lazy { override fun toString(): String = if (isInitialized()) value.toString() else "Lazy value not initialized yet." companion object { - private val ourRecursionGuard = RecursionManager.createGuard("RecursionAwareSafePublicationLazy") private val UNINITIALIZED_VALUE: Any = ObjectUtils.sentinel("RecursionAwareSafePublicationLazy initial value") } } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java index f4832aa3ddf2..5aeefb6d947a 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java @@ -275,7 +275,6 @@ public class JavaFxPsiUtil { } private static final Key> INJECTED_CONTROLLER = Key.create("javafx.injected.controller"); - private static final RecursionGuard ourGuard = RecursionManager.createGuard("javafx.controller"); public static PsiClass getControllerClass(final PsiFile containingFile) { if (containingFile instanceof XmlFile) { @@ -1194,7 +1193,7 @@ public class JavaFxPsiUtil { @Nullable private static CachedValueProvider.Result computeInjectedControllerClass(PsiFile containingFile) { - return ourGuard.doPreventingRecursion(containingFile, true, () -> { + return RecursionManager.doPreventingRecursion(containingFile, true, () -> { final Project project = containingFile.getProject(); final Ref injectedController = new Ref<>(); final PsiClass fxmlLoader = diff --git a/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt b/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt index 8ffb47337416..910fbf55dd78 100644 --- a/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt +++ b/uast/uast-common/src/com/intellij/patterns/uast/UastPatterns.kt @@ -82,8 +82,6 @@ private fun isCallExpressionParameter(argumentExpression: UExpression, return call.getArgumentForParameter(parameterIndex) == unwrapPolyadic(argumentExpression) && callPattern.accepts(call) } -private val GUARD = RecursionManager.createGuard("isPropertyAssignCall") - private fun isPropertyAssignCall(argument: UElement, methodPattern: ElementPattern): Boolean { val uBinaryExpression = (argument.uastParent as? UBinaryExpression) ?: return false if (uBinaryExpression.operator != UastBinaryOperator.ASSIGN) return false @@ -95,7 +93,7 @@ private fun isPropertyAssignCall(argument: UElement, methodPattern: ElementPatte is UReferenceExpression -> leftOperand else -> return false } - val references = GUARD.doPreventingRecursion(argument, false) { + val references = RecursionManager.doPreventingRecursion(argument, false) { uastReference.sourcePsi?.references // via `sourcePsi` because of KT-27385 } ?: return false return references.any { methodPattern.accepts(it.resolve()) } diff --git a/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt b/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt index 3ba589d16052..e0f89c60ec3f 100644 --- a/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt +++ b/uast/uast-common/src/com/intellij/psi/UastReferenceRegistrar.kt @@ -97,9 +97,6 @@ private fun getOrCreateCachedElement(element: PsiElement, element.toUElement(it) }.firstOrNull()?.also { context?.put(cachedUElement, it) } -//resolving uast-elements during pattern evaluation could bring us here again -private val PATTERN_ADAPTER_RECURSION_GUARD = RecursionManager.createGuard("add.uast.reference.provider") - private class UastPatternAdapter( val predicate: (UElement, ProcessingContext) -> Boolean, val supportedUElementTypes: List> @@ -108,7 +105,7 @@ private class UastPatternAdapter( override fun accepts(o: Any?): Boolean = accepts(o, null) override fun accepts(o: Any?, context: ProcessingContext?): Boolean = when (o) { - is PsiElement -> PATTERN_ADAPTER_RECURSION_GUARD.doPreventingRecursion(this, false) { + is PsiElement -> RecursionManager.doPreventingRecursion(this, false) { getOrCreateCachedElement(o, context, supportedUElementTypes) ?.let { predicate(it, (context ?: ProcessingContext()).apply { put(REQUESTED_PSI_ELEMENT, o) }) } ?: false diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomSemContributor.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomSemContributor.java index 12152997986f..1ae101cf87e9 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomSemContributor.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomSemContributor.java @@ -3,8 +3,6 @@ package com.intellij.util.xml.impl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.NullableComputable; -import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; @@ -18,7 +16,6 @@ import com.intellij.semantic.SemContributor; import com.intellij.semantic.SemRegistrar; import com.intellij.semantic.SemService; import com.intellij.util.ArrayUtil; -import com.intellij.util.NullableFunction; import com.intellij.util.xml.EvaluatedXmlName; import com.intellij.util.xml.EvaluatedXmlNameImpl; import com.intellij.util.xml.XmlName; @@ -131,46 +128,40 @@ final class DomSemContributor extends SemContributor { return null; }); - registrar.registerSemElementProvider(DomManagerImpl.DOM_CUSTOM_HANDLER_KEY, nonRootTag, new NullableFunction() { - private final RecursionGuard myGuard = RecursionManager.createGuard("customDomParent"); + registrar.registerSemElementProvider(DomManagerImpl.DOM_CUSTOM_HANDLER_KEY, nonRootTag, tag -> { + if (StringUtil.isEmpty(tag.getName())) return null; - @Override - public CollectionElementInvocationHandler fun(XmlTag tag) { - if (StringUtil.isEmpty(tag.getName())) return null; + XmlTag parentTag = PhysicalDomParentStrategy.getParentTag(tag); + assert parentTag != null; - final XmlTag parentTag = PhysicalDomParentStrategy.getParentTag(tag); - assert parentTag != null; + DomInvocationHandler parent = RecursionManager.doPreventingRecursion(tag, true, () -> getParentDom(parentTag)); + if (parent == null) return null; - DomInvocationHandler parent = myGuard.doPreventingRecursion(tag, true, - (NullableComputable)() -> getParentDom(parentTag)); - if (parent == null) return null; + DomGenericInfoEx info = parent.getGenericInfo(); + List customs = info.getCustomNameChildrenDescription(); + if (customs.isEmpty()) return null; - DomGenericInfoEx info = parent.getGenericInfo(); - final List customs = info.getCustomNameChildrenDescription(); - if (customs.isEmpty()) return null; + if (semService.getSemElement(DomManagerImpl.DOM_INDEXED_HANDLER_KEY, tag) == null && + semService.getSemElement(DomManagerImpl.DOM_COLLECTION_HANDLER_KEY, tag) == null) { - if (semService.getSemElement(DomManagerImpl.DOM_INDEXED_HANDLER_KEY, tag) == null && - semService.getSemElement(DomManagerImpl.DOM_COLLECTION_HANDLER_KEY, tag) == null) { - - String localName = tag.getLocalName(); - XmlFile file = parent.getFile(); - for (final DomFixedChildDescription description : info.getFixedChildrenDescriptions()) { - XmlName xmlName = description.getXmlName(); - if (localName.equals(xmlName.getLocalName()) && DomImplUtil.isNameSuitable(xmlName, tag, parent, file)) { - return null; - } + String localName = tag.getLocalName(); + XmlFile file = parent.getFile(); + for (DomFixedChildDescription description : info.getFixedChildrenDescriptions()) { + XmlName xmlName = description.getXmlName(); + if (localName.equals(xmlName.getLocalName()) && DomImplUtil.isNameSuitable(xmlName, tag, parent, file)) { + return null; } - for (CustomDomChildrenDescription description : customs) { - if (description.getTagNameDescriptor() != null) { - AbstractCollectionChildDescription desc = (AbstractCollectionChildDescription)description; - Type type = description.getType(); - return new CollectionElementInvocationHandler(type, tag, desc, parent, null); - } + } + for (CustomDomChildrenDescription description : customs) { + if (description.getTagNameDescriptor() != null) { + AbstractCollectionChildDescription desc = (AbstractCollectionChildDescription)description; + Type type = description.getType(); + return new CollectionElementInvocationHandler(type, tag, desc, parent, null); } } - - return null; } + + return null; }); registrar.registerSemElementProvider(DomManagerImpl.DOM_ATTRIBUTE_HANDLER_KEY, diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DynamicGenericInfo.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DynamicGenericInfo.java index ee0a2edd386e..721c28f8a0d6 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DynamicGenericInfo.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DynamicGenericInfo.java @@ -3,7 +3,6 @@ package com.intellij.util.xml.impl; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.xml.XmlFile; import com.intellij.reference.SoftReference; @@ -30,7 +29,6 @@ import java.util.Set; */ public class DynamicGenericInfo extends DomGenericInfoEx { private static final Key>> HOLDERS_CACHE = Key.create("DOM_CHILDREN_HOLDERS_CACHE"); - private static final RecursionGuard ourGuard = RecursionManager.createGuard("dynamicGenericInfo"); private final StaticGenericInfo myStaticGenericInfo; @NotNull private final DomInvocationHandler myInvocationHandler; private volatile boolean myInitialized; @@ -60,7 +58,7 @@ public class DynamicGenericInfo extends DomGenericInfoEx { if (!myInvocationHandler.exists()) return true; - return ourGuard.doPreventingRecursion(myInvocationHandler, false, () -> { + return RecursionManager.doPreventingRecursion(myInvocationHandler, false, () -> { DomExtensionsRegistrarImpl registrar = runDomExtenders(); synchronized (myInvocationHandler) { diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java index 706831f9432a..d0770522dbb7 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlTagImpl.java @@ -63,7 +63,6 @@ import java.util.stream.Collectors; public class XmlTagImpl extends XmlElementImpl implements XmlTag, HintedReferenceHost { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.xml.XmlTagImpl"); @NonNls private static final String XML_NS_PREFIX = "xml"; - private static final RecursionGuard ourGuard = RecursionManager.createGuard("xmlTag"); private static final Key> SUBTAGS_WITH_INCLUDES_KEY = Key.create("subtags with includes"); private static final Key> SUBTAGS_WITHOUT_INCLUDES_KEY = Key.create("subtags without includes"); private static final Comparator RANGE_COMPARATOR = Comparator.comparingInt(TextRange::getStartOffset); @@ -467,7 +466,7 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag, HintedReferenc @Override public XmlElementDescriptor getDescriptor() { return CachedValuesManager.getCachedValue(this, () -> { - XmlElementDescriptor descriptor = ourGuard.doPreventingRecursion(this, true, this::computeElementDescriptor); + XmlElementDescriptor descriptor = RecursionManager.doPreventingRecursion(this, true, this::computeElementDescriptor); return Result.create(descriptor, PsiModificationTracker.MODIFICATION_COUNT, externalResourceModificationTracker()); }); } @@ -795,7 +794,7 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag, HintedReferenc // When there is no namespace declarations then qualified names should be just used in dtds // this implies that we may have "" namespace prefix ! (see last paragraph in Namespaces in Xml, Section 5) - String result = ourGuard.doPreventingRecursion(Trinity.create("getNsByPrefix", this, prefix), true, () -> { + String result = RecursionManager.doPreventingRecursion(Trinity.create("getNsByPrefix", this, prefix), true, () -> { final String nsFromEmptyPrefix = getNamespaceByPrefix(""); if (nsFromEmptyPrefix.isEmpty()) return nsFromEmptyPrefix; diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java index 00146c29bfe3..70f6e9b7f7dd 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java @@ -20,7 +20,6 @@ import com.intellij.javaee.ExternalResourceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.Trinity; import com.intellij.openapi.util.text.StringUtil; @@ -71,9 +70,8 @@ public class XmlNSDescriptorImpl implements XmlNSDescriptorEx,Validator UNDECLARED_STD_TYPES = new HashSet<>(); @NonNls private static final String INCLUDE_TAG_NAME = "include"; @NonNls private static final String REDEFINE_TAG_NAME = "redefine"; - private static final RecursionGuard myRedefinedDescriptorsInProcessing = RecursionManager.createGuard("myRedefinedDescriptorsInProcessing"); - private final Map> myDescriptorsMap = Collections.synchronizedMap(new HashMap>()); - private final Map, CachedValue> myTypesMap = Collections.synchronizedMap(new HashMap, CachedValue>()); + private final Map> myDescriptorsMap = Collections.synchronizedMap(new HashMap<>()); + private final Map, CachedValue> myTypesMap = Collections.synchronizedMap(new HashMap<>()); private XmlFile myFile; private XmlTag myTag; private String myTargetNamespace; @@ -104,7 +102,7 @@ public class XmlNSDescriptorImpl implements XmlNSDescriptorEx,Validator { + RecursionManager.doPreventingRecursion(tag, false, () -> { final XmlFile file = getRedefinedElementDescriptorFile(tag); addDependency(file, visited); return null;