method reference: additional diagnostics for invalid method references (IDEA-149688)

This commit is contained in:
Anna Kozlova
2015-12-29 16:46:58 +01:00
parent 210217ecfa
commit 242cd356a7
11 changed files with 89 additions and 50 deletions
@@ -54,7 +54,7 @@ class MyTest1 {
}
{
Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>;
Bar1 b1 = MyTest2 :: <error descr="Invalid method reference: String cannot be converted to int">foo</error>;
bar(MyTest1 :: foo);
}
}
@@ -80,7 +80,7 @@ class MyTest2 {
}*/
{
Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>;
Bar1 b1 = MyTest2 :: <error descr="Invalid method reference: String cannot be converted to int">foo</error>;
bar(MyTest2 :: foo);
}
}
@@ -106,8 +106,8 @@ class MyTest3 {
}
{
Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>;
bar(MyTest3 :: <error descr="Cannot resolve method 'foo'">foo</error>);
Bar1 b1 = MyTest2 :: <error descr="Invalid method reference: String cannot be converted to int">foo</error>;
bar(MyTest3 :: <error descr="Invalid method reference: int cannot be converted to String">foo</error>);
}
}
@@ -2,7 +2,7 @@ class Test {
{
Runnable b = Test :: <error descr="Cannot resolve method 'length'">length</error>;
Comparable<String> c = Test :: length;
Comparable<Integer> c1 = Test :: <error descr="Cannot resolve method 'length'">length</error>;
Comparable<Integer> c1 = Test :: <error descr="Invalid method reference: Integer cannot be converted to String">length</error>;
}
public static Integer length(String s) {
@@ -49,7 +49,7 @@ class MyTest {
static {
I1 i1 = MyTest::static_1;
I1 i2 = MyTest::<error descr="Cannot resolve method 'static_2'">static_2</error>;
I1 i3 = MyTest::<error descr="Cannot resolve method 'static_3'">static_3</error>;
I1 i3 = MyTest::<error descr="Invalid method reference: int cannot be converted to String">static_3</error>;
I1 i4 = MyTest::<error descr="Cannot resolve method 'static_4'">static_4</error>;
}
@@ -62,7 +62,7 @@ class MyTest {
I1 i1 = this::_1;
I1 i2 = this::<error descr="Cannot resolve method '_2'">_2</error>;
I1 i3 = this::<error descr="Cannot resolve method '_3'">_3</error>;
I1 i3 = this::<error descr="Invalid method reference: int cannot be converted to String">_3</error>;
I1 i4 = this::<error descr="Cannot resolve method '_4'">_4</error>;
I2 i21 = MyTest::<error descr="Cannot resolve method 'm1'">m1</error>;
@@ -0,0 +1,15 @@
class A {
static class B<T> {
int foo(T x) {return 0;}
}
public static void main(String[] args) {
B<? extends CharSequence> q = new B<>();
Func x = q::<error descr="Invalid method reference: CharSequence cannot be converted to capture of ? extends CharSequence">foo</error>;
x.invoke("");
}
interface Func {
int invoke(CharSequence x);
}
}
@@ -7,7 +7,7 @@ interface B<BT> {
class Test {
public static void test() {
method1(Test::<error descr="Cannot resolve method 'method2'">method2</error>);
method1(Test::<error descr="Invalid method reference: A<capture of ? super M> cannot be converted to A<? super String>">method2</error>);
}
static <M> void method1(B<A<? super M>> arg) { }
@@ -29,14 +29,14 @@ class Test {
static void meth4(I3 s) { }
static {
meth1(Foo::<error descr="Cannot resolve constructor 'Foo'">new</error>);
meth1(Foo::<error descr="Invalid constructor reference: String cannot be converted to X">new</error>);
meth2(Foo::new);
meth3(Foo::<error descr="Cannot resolve constructor 'Foo'">new</error>);
meth3(Foo::<error descr="Invalid constructor reference: Object cannot be converted to X">new</error>);
meth4<error descr="Ambiguous method call: both 'Test.meth4(I1)' and 'Test.meth4(I2)' match">(Foo::new)</error>;
meth1(Test::<error descr="Cannot resolve method 'foo'">foo</error>);
meth1(Test::<error descr="Invalid method reference: String cannot be converted to X">foo</error>);
meth2(Test::foo);
meth3(Test::<error descr="Cannot resolve method 'foo'">foo</error>);
meth3(Test::<error descr="Invalid method reference: Object cannot be converted to X">foo</error>);
meth4<error descr="Ambiguous method call: both 'Test.meth4(I1)' and 'Test.meth4(I2)' match">(Test::foo)</error>;
}
@@ -55,8 +55,8 @@ class Test {
}
void test() {
II1 i1 = this::<error descr="Cannot resolve method 'fooInstance'">fooInstance</error>;
II1 i1 = this::<error descr="Invalid method reference: X cannot be converted to X">fooInstance</error>;
II2 i2 = this::fooInstance;
II3 i3 = this::<error descr="Cannot resolve method 'fooInstance'">fooInstance</error>;
II3 i3 = this::<error descr="Invalid method reference: X cannot be converted to X">fooInstance</error>;
}
}
@@ -17,7 +17,7 @@ abstract class Test {
{
I i = Test::<String>foo;
I i1 = Test::<Integer><error descr="Cannot resolve method 'foo'">foo</error>;
I i1 = Test::<Integer><error descr="Invalid method reference: String cannot be converted to Integer">foo</error>;
I i2 = Test::foo;
}