diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 91eb1e1ff345..ac6cff20e949 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -46,23 +46,24 @@ public class InferenceSession { private static final Function, PsiType> UPPER_BOUND_FUNCTION = new Function, PsiType>() { @Override public PsiType fun(Pair pair) { - if (pair.first instanceof PsiArrayType && TypesDistinctProver.proveArrayTypeDistinct((PsiArrayType)pair.first, pair.second)) { - return null; - } - if (pair.second instanceof PsiArrayType && TypesDistinctProver.proveArrayTypeDistinct((PsiArrayType)pair.second, pair.first)) { - return null; - } - - if (pair.first instanceof PsiCapturedWildcardType && TypesDistinctProver.provablyDistinct(((PsiCapturedWildcardType)pair.first).getUpperBound(), pair.second)) { - return null; - } + if (!isValidGlb(pair.first, pair.second)) return null; + if (!isValidGlb(pair.second, pair.first)) return null; - if (pair.second instanceof PsiCapturedWildcardType && TypesDistinctProver.provablyDistinct(((PsiCapturedWildcardType)pair.second).getUpperBound(), pair.first)) { - return null; - } - return GenericsUtil.getGreatestLowerBound(pair.first, pair.second); } + + private boolean isValidGlb(PsiType first, PsiType second) { + if (second instanceof PsiArrayType && TypesDistinctProver.proveArrayTypeDistinct((PsiArrayType)second, first)) { + return false; + } + if (second instanceof PsiCapturedWildcardType && !first.isAssignableFrom(second)) { + final PsiClass conjunct = PsiUtil.resolveClassInType(first); + if (conjunct != null && !conjunct.isInterface() ) { + return false; + } + } + return true; + } }; private static final String EQUALITY_CONSTRAINTS_PRESENTATION = "equality constraints"; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/GlbValidityWithCapturedWildcards.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/GlbValidityWithCapturedWildcards.java new file mode 100644 index 000000000000..7894dab9cdbb --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/GlbValidityWithCapturedWildcards.java @@ -0,0 +1,26 @@ + +interface Condition { + boolean value(T t); +} +abstract class Test { + + protected static T findNearestTopLevelSymbol(Class clazz, + Condition condition) { + + return null; + } + + interface OCSymbol {} + interface SwiftSymbol extends OCSymbol {} + + + class AbstractCache {} + class SwiftCache extends AbstractCache {} + + private static void foo(final Condition condition) { + SwiftSymbol s = findNearestTopLevelSymbol(SwiftCache.class, condition); + } + private static void foo1(final Condition condition) { + SwiftSymbol s = findNearestTopLevelSymbol(SwiftCache.class, condition); + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java index fb33f7c9af73..7b59558d3be7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java @@ -391,6 +391,10 @@ public class GraphInferenceHighlightingTest extends LightDaemonAnalyzerTestCase doTest(); } + public void testGlbValidityWithCapturedWildcards() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(false); }