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 d53bb2e26820..48a41cbafc8f 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 @@ -167,8 +167,9 @@ public class PsiSubstitutorImpl implements PsiSubstitutor { return newBound; } } - if (!wildcard.isBounded()) return PsiWildcardType.createUnbounded(wildcardType.getManager()); - return newBound; + if (wildcard.isBounded()) { + return newBound; + } } return newBound == PsiType.NULL ? newBound : rebound(wildcardType, newBound); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA125423.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA125423.java index 868b4dffd7ac..f2fd3d22350f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA125423.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA125423.java @@ -13,7 +13,7 @@ class Test { class FooBar { void foo(final FooBar fooBar){ - //fooBar.supertype(Iterable.class); + fooBar.supertype(Iterable.class); } void foo1(final FooBar fooBar){ diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SubstitutorCaptureBoundComposition.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SubstitutorCaptureBoundComposition.java new file mode 100644 index 000000000000..8cfa716454b9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SubstitutorCaptureBoundComposition.java @@ -0,0 +1,64 @@ + +interface NodeTraverser { + NodeTraverser filter(Predicate filter); + + NodeTraverser filter1(Predicate filter); + + NodeTraverser filter2(Predicate filter); +} + +interface Predicate

{ +} + +class Test { + + void foo(NodeTraverser traverser, + NodeTraverser traverser1, + NodeTraverser traverser2, + + Predicate filter, + Predicate filter1, + Predicate filter2) { + + traverser.filter(filter); + traverser.filter1(filter); + traverser.filter2(filter); //"'filter2(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + + traverser1.filter(filter); + traverser1.filter1(filter); + traverser1.filter2(filter); // "'filter2(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + + traverser2.filter(filter); // "'filter(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + traverser2.filter1(filter); + traverser2.filter2(filter); + + + + traverser.filter(filter1); + traverser.filter1(filter1); + traverser.filter2(filter1);// "'filter2(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + + traverser1.filter(filter1); + traverser1.filter1(filter1); + traverser1.filter2>(filter1);// "'filter2(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + + traverser2.filter(filter1);// "'filter(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + traverser2.filter1(filter1); + traverser2.filter2(filter1); + + + + traverser.filter(filter2); + traverser.filter1(filter2); + traverser.filter2(filter2);// "'filter2(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + + traverser1.filter(filter2); + traverser1.filter1(filter2); + traverser1.filter2(filter2);// "'filter2(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + + traverser2.filter(filter2);// "'filter(Predicate>)' in 'NodeTraverser' cannot be applied to '(Predicate>)'" + traverser2.filter1(filter2); + traverser2.filter2(filter2); + } + +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedCasts.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedCasts.java index 0532d1f1f6ce..3506396c6c03 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedCasts.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/UncheckedCasts.java @@ -45,7 +45,7 @@ class AllPredicate } public static void foo(SortedMap sourceSortedMap) { - new TreeMap((Comparator) sourceSortedMap.comparator()); + new TreeMap((Comparator) sourceSortedMap.comparator()); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedCasts.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedCasts.java index 0532d1f1f6ce..3506396c6c03 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedCasts.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/UncheckedCasts.java @@ -45,7 +45,7 @@ class AllPredicate } public static void foo(SortedMap sourceSortedMap) { - new TreeMap((Comparator) sourceSortedMap.comparator()); + new TreeMap((Comparator) sourceSortedMap.comparator()); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index eebb36e0ed09..e1a4bcd5cb99 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -386,6 +386,10 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { //jdk should propagate LL 1.4 but actually it provides LL 1.7?! public void testCastObjectToIntJdk14() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_4, false); } + public void testSubstitutorCaptureBoundComposition() { + doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); + } + public void testIDEA127767() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }