From 1772a4762b1714a3f081687e337197f7f0c76a66 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 23 Nov 2015 19:16:50 +0100 Subject: [PATCH] cache standalone expression types despite of overload check --- .../psi/impl/source/resolve/JavaResolveCache.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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 cb07c0ab3ff6..003b8e9a96b2 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 @@ -30,6 +30,7 @@ import com.intellij.psi.impl.AnyPsiChangeListener; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.source.PsiClassReferenceType; import com.intellij.psi.impl.source.PsiImmediateClassType; +import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.Function; @@ -80,14 +81,20 @@ public class JavaResolveCache { @Nullable public PsiType getType(@NotNull T expr, @NotNull Function f) { - final boolean isOverloadCheck = MethodCandidateInfo.isOverloadCheck(); - PsiType type = isOverloadCheck ? null : myCalculatedTypes.get(expr); + PsiType type = myCalculatedTypes.get(expr); if (type == null) { final RecursionGuard.StackStamp dStackStamp = PsiDiamondType.ourDiamondGuard.markStack(); type = f.fun(expr); - if (!dStackStamp.mayCacheNow() || isOverloadCheck) { + if (!dStackStamp.mayCacheNow()) { return type; } + + //cache standalone expression types as they do not depend on the context + final boolean isOverloadCheck = MethodCandidateInfo.isOverloadCheck(); + if (isOverloadCheck && PsiPolyExpressionUtil.isPolyExpression(expr)) { + return type; + } + if (type == null) type = TypeConversionUtil.NULL_TYPE; myCalculatedTypes.put(expr, type);