From f217ed47c4cc149a575edca3a0e2290994c6062d Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 16 Dec 2014 18:07:07 +0100 Subject: [PATCH] new inference: reject contradicting equals bounds --- .../resolve/graphInference/InferenceSession.java | 9 +++++++-- .../genericsHighlighting8/IDEA57340.java | 4 ++-- .../genericsHighlighting8/IDEADEV15534.java | 2 +- .../RejectContradictingEqualsBounds.java | 15 +++++++++++++++ .../SuperWildcardWithBoundPromotion.java | 2 +- .../genericsHighlighting8/Variance.java | 4 ++-- .../daemon/lambda/GenericsHighlighting8Test.java | 4 ++++ 7 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/RejectContradictingEqualsBounds.java 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 c860ac25009f..de16d5e67b30 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 @@ -17,6 +17,7 @@ package com.intellij.psi.impl.source.resolve.graphInference; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; @@ -890,7 +891,7 @@ public class InferenceSession { return composeBound(var, InferenceBound.EQ, new Function, PsiType>() { @Override public PsiType fun(Pair pair) { - return pair.first; //todo check if equals + return !Comparing.equal(pair.first, pair.second) ? null : pair.first; } }, substitutor); } @@ -916,7 +917,11 @@ public class InferenceSession { lub = lowerBound; } else { - lub = fun.fun(Pair.create(lub, lowerBound)); + final Pair pair = Pair.create(lub, lowerBound); + lub = fun.fun(pair); + if (lub == null) { + return PsiType.NULL; + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57340.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57340.java index f5e4c92d621a..9a2eade8a242 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57340.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA57340.java @@ -9,8 +9,8 @@ class B { void bar(B b, A foo1) { baz(b.foo()); A foo = b.foo(); - baz(foo); - baz(foo1); + baz(foo); + baz(foo1); } void baz(A a) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEADEV15534.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEADEV15534.java index 774a2efdae03..438d93ffff8c 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEADEV15534.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEADEV15534.java @@ -18,7 +18,7 @@ class SortTest> implements Comparable> { list.add(t1); SortTest t2 = new SortTest(0); list.add(t2); - Collections.sort(list); + Collections.sort(list); t1.compareTo(t2); //this should be OK diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/RejectContradictingEqualsBounds.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/RejectContradictingEqualsBounds.java new file mode 100644 index 000000000000..e197a9998d76 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/RejectContradictingEqualsBounds.java @@ -0,0 +1,15 @@ +class B {} +abstract class A { + void baz35(B a) {} + abstract B foo35(); + void bar35(A a){ + baz35(a.foo35()); + } + + + void baz44(B a) {} + abstract B foo44(); + void bar44(A a){ + baz44(a.foo44()); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SuperWildcardWithBoundPromotion.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SuperWildcardWithBoundPromotion.java index 33dd56b27183..f45acb005299 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SuperWildcardWithBoundPromotion.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SuperWildcardWithBoundPromotion.java @@ -47,7 +47,7 @@ class Test { } void bug1(Parametrized param) { - foo(param); + foo(param); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java index 7556292ef538..ab4bb7836081 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java @@ -152,7 +152,7 @@ class S2 { } void bar(List k) { - f(k, k); + f(k, k); } } @@ -162,7 +162,7 @@ class S3 { } void bar(Map k) { - f(k); + f(k); } } 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 bc3a7a025690..e2ca081a9602 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 @@ -780,6 +780,10 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { doTest(false); } + public void testRejectContradictingEqualsBounds() throws Exception { + doTest(false); + } + private void doTest() { doTest(false); }