From b7ab465ad9b52ae9d5acd4014f00d9b5a92a345c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 30 May 2014 16:28:04 +0400 Subject: [PATCH] old inference: choose child type between types in subtypes constraint (IDEA-118536) --- .../psi/impl/source/resolve/PsiOldInferenceHelper.java | 7 ++++++- .../genericsHighlighting/IDEA118536.java | 10 ++++++++++ .../codeInsight/daemon/GenericsHighlightingTest.java | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA118536.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java index 84e3b27dd60a..fdcbc96770cb 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiOldInferenceHelper.java @@ -286,7 +286,8 @@ public class PsiOldInferenceHelper implements PsiInferenceHelper { Pair otherConstraint = inferMethodTypeParameterFromParent(typeParameter, partialSubstitutor, parent, policy); if (otherConstraint != null) { - if (otherConstraint.getSecond() == ConstraintType.EQUALS || otherConstraint.getSecond() == ConstraintType.SUPERTYPE) { + if (otherConstraint.getSecond() == ConstraintType.EQUALS || otherConstraint.getSecond() == ConstraintType.SUPERTYPE || + compareSubtypes(constraint.getFirst(), otherConstraint.getFirst())) { constraint = otherConstraint; } } @@ -307,6 +308,10 @@ public class PsiOldInferenceHelper implements PsiInferenceHelper { return partialSubstitutor; } + private static boolean compareSubtypes(final PsiType type, final PsiType parentType) { + return type != null && parentType != null && TypeConversionUtil.isAssignable(type, parentType); + } + @Override @NotNull public PsiSubstitutor inferTypeArguments(@NotNull PsiTypeParameter[] typeParameters, diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA118536.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA118536.java new file mode 100644 index 000000000000..b747456247fe --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA118536.java @@ -0,0 +1,10 @@ +import java.util.Comparator; + +class MyTest { + void foo(final Ordering natural){ + compound(natural); + } + Ordering compound(Comparator secondaryComparator) { return null; } +} +abstract class Ordering implements 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 f8bbb46623a2..62bd61da7c4f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -353,6 +353,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA123509() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } public void testIDEA125031() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } public void testIDEA24479() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } + public void testIDEA118536() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));