From 43e079d97d9f579c3910bf4da703ce08b89b4f7e Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 18 Feb 2013 11:29:40 +0100 Subject: [PATCH] skip inference from parent for diamond's search for constructor (IDEA-101166) --- .../source/resolve/PsiResolveHelperImpl.java | 19 ++++++++++++++++++- .../InferenceFromTypeParamsBounds.java | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java index 4c67ded6ab00..bcc9b74ba564 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java @@ -47,6 +47,13 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { public static final Pair RAW_INFERENCE = new Pair(null, ConstraintType.EQUALS); private final PsiManager myManager; + public static final ThreadLocal> OUR_CONSTRUCTORS = new ThreadLocal>(){ + @Override + protected Map initialValue() { + return new HashMap(); + } + }; + public PsiResolveHelperImpl(PsiManager manager) { myManager = manager; } @@ -76,7 +83,13 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { substitutor = substitutor.putAll(TypeConversionUtil.getSuperClassSubstitutor(aClass, anonymous, substitutor)); } else { - processor = new MethodResolverProcessor(aClass, argumentList, place); + final PsiType alreadyThere = OUR_CONSTRUCTORS.get().put(argumentList, type); + try { + processor = new MethodResolverProcessor(aClass, argumentList, place); + } + finally { + if (alreadyThere == null) OUR_CONSTRUCTORS.get().remove(argumentList); + } } ResolveState state = ResolveState.initial().put(PsiSubstitutor.KEY, substitutor); @@ -1149,6 +1162,10 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { @NotNull final PsiCallExpression parentCall) { if (Registry.is("disable.graph.inference", false)) return null; final PsiExpressionList argumentList = parentCall.getArgumentList(); + final PsiType inferDiamond = OUR_CONSTRUCTORS.get().get(argumentList); + if (inferDiamond != null) { + return FAILED_INFERENCE; + } return ourGraphGuard.doPreventingRecursion(methodCall, true, new Computable>() { @Override public Pair compute() { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/InferenceFromTypeParamsBounds.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/InferenceFromTypeParamsBounds.java index d383dda6c45b..073216a79f62 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/InferenceFromTypeParamsBounds.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/InferenceFromTypeParamsBounds.java @@ -20,7 +20,7 @@ public class IDEA10166 { Supplier mapSupplier, BiConsumer accumulator) { BinaryOperator mapBinaryOperator = leftMapMerger(mergeFunction); - return null;//new CollectorImpl<>(mapSupplier, accumulator, leftMapMerger(mergeFunction)); + return new CollectorImpl<>(mapSupplier, accumulator, leftMapMerger(mergeFunction)); } static > BinaryOperator leftMapMerger(BinaryOperator mergeFunction) {