diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java index 8b7b7fb27c3c..d1218c9dae05 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/SubtypingConstraint.java @@ -66,11 +66,15 @@ public class SubtypingConstraint implements ConstraintFormula { @Override public boolean reduce(InferenceSession session, List constraints) { if (myT instanceof PsiWildcardType) { - final PsiType tBound = ((PsiWildcardType)myT).getBound(); + PsiType tBound = ((PsiWildcardType)myT).getBound(); if (tBound == null) { return true; } + if (tBound instanceof PsiCapturedWildcardType) { + tBound = ((PsiWildcardType)myT).isExtends() ? ((PsiCapturedWildcardType)tBound).getUpperBound() + : ((PsiCapturedWildcardType)tBound).getLowerBound(); + } if (myS instanceof PsiCapturedWildcardType) { myS = ((PsiCapturedWildcardType)myS).getWildcard(); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardBoundsCombination.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardBoundsCombination.java new file mode 100644 index 000000000000..d621979d7bf9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardBoundsCombination.java @@ -0,0 +1,16 @@ +import java.util.*; +import java.util.function.Consumer; + +class NachCollections { + Consumer> consumer(Consumer> c) { + return null; + } + + public void forEach(Collection> c1, + Collection> c2, + Consumer> a) { + c1.forEach(consumer(a)); + c2.forEach(consumer(a)); + } +} + diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java index cf8ad1c9fb9f..6385fe5d125e 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java @@ -10,6 +10,6 @@ class Node { class Main { public static void main(NodeProperty nval, Node expr) { - int val = expr.get(nval); + int val = expr.get(nval); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index 8cd16f665e67..8f9167d83a21 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -755,6 +755,10 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testErasure() throws Exception { doTest(); } + public void testWildcardBoundsCombination() throws Exception { + doTest(); + } + private void doTest() { doTest(false); }