From 34526b2b5cd40ccfe98ac867f48f1a2b9c6ca7cb Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 14 Sep 2020 19:04:15 +0200 Subject: [PATCH] java error message: explicit method reference ambiguity (IDEA-250654) GitOrigin-RevId: 1fc5f577f298a7f874a111866a394aa7a6c09cc0 --- .../daemon/impl/analysis/HighlightUtil.java | 10 +++------- .../impl/analysis/HighlightVisitorImpl.java | 9 ++++++++- .../lambda/methodRef/AccessModifiers.java | 4 ++-- .../lambda/methodRef/Ambiguity.java | 4 ++-- .../lambda/methodRef/Assignability.java | 2 +- .../lambda/methodRef/ResolveConflicts.java | 2 +- .../lambda/methodRef/SOE.java | 2 +- .../lambda/methodRef/StaticProblems.java | 20 +++++++++---------- .../lambda/methodRef/Varargs.java | 6 +++--- ...reateMethodFromMethodRefApplicability.java | 2 +- .../newMethodRef/PotentialApplicability.java | 8 ++++---- ...otentialCompatibilityWithInvalidShape.java | 2 +- ...StaticNonStaticReferenceTypeAmbiguity.java | 2 +- ...nheritorForMethodRefConflictResolving.java | 2 +- .../lambda/NewMethodRefHighlightingTest.java | 2 +- 15 files changed, 40 insertions(+), 37 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 9b25c3b9dbfb..52627382858f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -2977,12 +2977,8 @@ public final class HighlightUtil { PsiElement element1 = results[0].getElement(); PsiElement element2 = results[1].getElement(); if (element1 instanceof PsiMethod && element2 instanceof PsiMethod) { - String candidate1 = PsiFormatUtil.formatMethod((PsiMethod)element1, PsiSubstitutor.EMPTY, - PsiFormatUtilBase.SHOW_CONTAINING_CLASS | PsiFormatUtilBase.SHOW_NAME | - PsiFormatUtilBase.SHOW_PARAMETERS, PsiFormatUtilBase.SHOW_TYPE); - String candidate2 = PsiFormatUtil.formatMethod((PsiMethod)element2, PsiSubstitutor.EMPTY, - PsiFormatUtilBase.SHOW_CONTAINING_CLASS | PsiFormatUtilBase.SHOW_NAME | - PsiFormatUtilBase.SHOW_PARAMETERS, PsiFormatUtilBase.SHOW_TYPE); + String candidate1 = format(element1); + String candidate2 = format(element2); return JavaErrorBundle.message("incompatible.types.reason.ambiguous.method.reference", candidate1, candidate2); } } @@ -3170,7 +3166,7 @@ public final class HighlightUtil { } @NotNull - private static String format(@NotNull PsiElement element) { + static String format(@NotNull PsiElement element) { if (element instanceof PsiClass) return formatClass((PsiClass)element); if (element instanceof PsiMethod) return JavaHighlightUtil.formatMethod((PsiMethod)element); if (element instanceof PsiField) return formatField((PsiField)element); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index b9881e6880b7..bdf6ae958733 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1597,7 +1597,14 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } } else if (description == null){ - description = JavaErrorBundle.message("cannot.resolve.method", expression.getReferenceName()); + if (results.length > 1) { + String t1 = HighlightUtil.format(Objects.requireNonNull(results[0].getElement())); + String t2 = HighlightUtil.format(Objects.requireNonNull(results[1].getElement())); + description = JavaErrorBundle.message("ambiguous.reference", expression.getReferenceName(), t1, t2); + } + else { + description = JavaErrorBundle.message("cannot.resolve.method", expression.getReferenceName()); + } } if (description != null) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java index ef17a29f17cc..0588c5f292dc 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java @@ -25,8 +25,8 @@ class AlienTest { static { IInt i1 = MyTest::abracadabra; IInt i2 = MyTest::foo; - IInt i3 = MyTest::bar; - IIntInt i4 = MyTest::bar; + IInt i3 = MyTest::bar; + IIntInt i4 = MyTest::bar; IInt i5 = MyTest::baz; IInt i6 = MyTest.foo::foo; IInt i7 = MyTest.Foo::foo; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java index 9f655c743f7f..44d2bbb04d98 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java @@ -22,7 +22,7 @@ class MyTest { { Bar1 b1 = MyTest :: foo; - bar(MyTest :: foo); + bar(MyTest :: foo); } } @@ -122,7 +122,7 @@ class MyTest4 { } { - bar(MyTest4:: foo); + bar(MyTest4:: foo); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java index b4db64c282db..747ec00e877f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java @@ -16,7 +16,7 @@ class Test { class Test1 { { - Runnable b = Test1 :: length; + Runnable b = Test1 :: length; Comparable c = Test1 :: length; Comparable c1 = Test1 :: length; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ResolveConflicts.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ResolveConflicts.java index 587cfbcb8c39..2063b31ec053 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ResolveConflicts.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ResolveConflicts.java @@ -6,7 +6,7 @@ interface Func{ class Main { public static void main(final String[] args) { - Func func = Integer::toString; + Func func = Integer::toString; System.out.println(func.run(6)); } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/SOE.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/SOE.java index 982f851d7330..23459132ca89 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/SOE.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/SOE.java @@ -2,7 +2,7 @@ import java.util.*; class LambdaTest { public void testR() { - new ArrayList() :: size = ""; + new ArrayList() :: size = ""; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java index 6a3c9f43e329..56b1bad6f2a1 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/StaticProblems.java @@ -57,10 +57,10 @@ class MyTest1 { I2 s2 = MyTest1 :: m2; call2(MyTest1::m2); - I2 s3 = MyTest1 :: m3; - call2(MyTest1::m3); - I2 s4 = MyTest1 ::m4; - call2(MyTest1::m4); + I2 s3 = MyTest1 :: m3; + call2(MyTest1::m3); + I2 s4 = MyTest1 ::m4; + call2(MyTest1::m4); } } @@ -106,19 +106,19 @@ class MyTest2 { I2 s2 = MyTest2 :: m2; call2(MyTest2::m2); - I2 s3 = MyTest2 :: m3; - call2(MyTest2::m3); - I2 s4 = MyTest2 ::m4; - call2(MyTest2::m4); + I2 s3 = MyTest2 :: m3; + call2(MyTest2::m3); + I2 s4 = MyTest2 ::m4; + call2(MyTest2::m4); } static void call3(I1 s) {} static void call3(I2 s) {} static { call3(MyTest2::m1); - call3(MyTest2::m2); + call3(MyTest2::m2); call3(MyTest2::m3); - call3(MyTest2::m4); + call3(MyTest2::m4); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java index 1504477c0c19..4b5e796f5b3e 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java @@ -50,7 +50,7 @@ class MyTest { I1 i1 = MyTest::static_1; I1 i2 = MyTest::static_2; I1 i3 = MyTest::static_3; - I1 i4 = MyTest::static_4; + I1 i4 = MyTest::static_4; } @@ -58,12 +58,12 @@ class MyTest { I1 i_1 = MyTest::_1; I1 i_2 = MyTest::_2; I1 i_3 = MyTest::_3; - I1 i_4 = MyTest::_4; + I1 i_4 = MyTest::_4; I1 i1 = this::_1; I1 i2 = this::_2; I1 i3 = this::_3; - I1 i4 = this::_4; + I1 i4 = this::_4; I2 i21 = MyTest::m1; I2 i22 = MyTest::m2; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CreateMethodFromMethodRefApplicability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CreateMethodFromMethodRefApplicability.java index 4ce8a26f649d..41e2da9729a7 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CreateMethodFromMethodRefApplicability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/CreateMethodFromMethodRefApplicability.java @@ -16,7 +16,7 @@ class DemoApplicationTests { Stream.of("") .map(l -> a.get(l.length())) .map(s -> new DemoApplicationTests()).findAny() - .map(d -> d.foo(this::bar)); + .map(d -> d.foo(this::bar)); } void foo(Consumer c) {} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialApplicability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialApplicability.java index b40eab7501f5..cad6bc3d9eb9 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialApplicability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialApplicability.java @@ -31,8 +31,8 @@ class Test { String i1 = instanceCall(this::m0); String i2 = instanceCall(this::m1); String i3 = instanceCall(this::m2); - String i4 = instanceCall(this::m01); - String i5 = instanceCall(this::m012); + String i4 = instanceCall(this::m01); + String i5 = instanceCall(this::m012); } void n0() { } @@ -53,7 +53,7 @@ class Test { Test s1 = staticCall(Test::n0); Test s2 = staticCall(Test::n1); Test s3 = staticCall(Test::n2); - Test s4 = staticCall(Test::n01); - Test s5 = staticCall(Test::n012); + Test s4 = staticCall(Test::n01); + Test s5 = staticCall(Test::n012); } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialCompatibilityWithInvalidShape.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialCompatibilityWithInvalidShape.java index 79d3bd820f0a..547a5f1b784b 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialCompatibilityWithInvalidShape.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/PotentialCompatibilityWithInvalidShape.java @@ -34,7 +34,7 @@ class Test { { Set m = replyWith(this::query); System.out.println(m); - Set m1 = replyWith(this::query1); + Set m1 = replyWith(this::query1); System.out.println(m1); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/StaticNonStaticReferenceTypeAmbiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/StaticNonStaticReferenceTypeAmbiguity.java index 693ef4e2f836..6c94b58f535a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/StaticNonStaticReferenceTypeAmbiguity.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/StaticNonStaticReferenceTypeAmbiguity.java @@ -10,6 +10,6 @@ class Test { static void m(Test t, Object s) {} static void test() { - I i = Test::m; + I i = Test::m; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/SkipStaticInterfaceMethodCalledOnInheritorForMethodRefConflictResolving.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/SkipStaticInterfaceMethodCalledOnInheritorForMethodRefConflictResolving.java index b685622f5dbc..5c7aaf3ddf9a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/SkipStaticInterfaceMethodCalledOnInheritorForMethodRefConflictResolving.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/SkipStaticInterfaceMethodCalledOnInheritorForMethodRefConflictResolving.java @@ -7,7 +7,7 @@ class Main { Function, String> f1 = A::getName; Function, String> f10 = A::getName; Function f2 = B::getName; - Function f3 = b::getName; + Function f3 = b::getName; } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java index 99fe964adccc..3de31ec826ba 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java @@ -83,7 +83,7 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase { doHighlighting() .stream() .filter(info -> info.type == HighlightInfoType.ERROR) - .forEach(info -> Assert.assertEquals("Cannot resolve method 'm'", + .forEach(info -> Assert.assertEquals("Reference to 'm' is ambiguous, both 'm(Test, String)' and 'm(String)' match", info.getToolTip())); } public void testSuperClassPotentiallyApplicableMembers() { doTest(); }