From 17b020f7c2d18df5b8f98e441147de3a9225d15e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 17 Apr 2014 13:32:27 +0200 Subject: [PATCH] new overload resolution: covariant comparison of return types --- .../resolve/graphInference/InferenceSession.java | 4 ++-- .../JavaMethodsConflictResolver.java | 4 ++-- .../mostSpecific/MostSpecificByReturnType.java | 16 ++++++++++++++++ .../lambda/MostSpecificResolutionTest.java | 4 ++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/MostSpecificByReturnType.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 e681d2d5a31b..9d9c373159f9 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 @@ -1070,7 +1070,7 @@ public class InferenceSession { session.addConstraint(new StrictSubtypingConstraint(tReturnType, sReturnType)); return true; } else { - return sReturnType != null && tReturnType != null && TypeConversionUtil.isAssignable(sReturnType, tReturnType); + return sReturnType != null && tReturnType != null && TypeConversionUtil.isAssignable(tReturnType, sReturnType); } } } @@ -1115,7 +1115,7 @@ public class InferenceSession { session.addConstraint(new StrictSubtypingConstraint(tReturnType, sReturnType)); return true; } else { - return sReturnType != null && tReturnType != null && TypeConversionUtil.isAssignable(sReturnType, tReturnType); + return sReturnType != null && tReturnType != null && TypeConversionUtil.isAssignable(tReturnType, sReturnType); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java index 5f1e2f696961..93a444036bef 100644 --- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java +++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java @@ -624,11 +624,11 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ } if (!applicable12ignoreFunctionalType && applicable21ignoreFunctionalType) { - return specifics == Specifics.SECOND ? Specifics.SECOND : Specifics.NEITHER; + return specifics == Specifics.FIRST ? Specifics.FIRST : Specifics.NEITHER; } if (!applicable21ignoreFunctionalType && applicable12ignoreFunctionalType) { - return specifics == Specifics.FIRST ? Specifics.FIRST : Specifics.NEITHER; + return specifics == Specifics.SECOND ? Specifics.SECOND : Specifics.NEITHER; } return specifics; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/MostSpecificByReturnType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/MostSpecificByReturnType.java new file mode 100644 index 000000000000..5588c3e623a1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/MostSpecificByReturnType.java @@ -0,0 +1,16 @@ +class Test { + interface I { Object invoke(); } + interface IStr { String foo(); } + + private static void call(IStr str) { + System.out.println(str); + } + + private static void call(I i) { + System.out.println(i); + } + + public static void main(String[] args) { + call(()-> null); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java index 004b52072a84..bea020bb9017 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java @@ -79,6 +79,10 @@ public class MostSpecificResolutionTest extends LightDaemonAnalyzerTestCase { doTest(false); } + public void testMostSpecificByReturnType() throws Exception { + doTest(); + } + private void doTest() { doTest(true); }