MethodReturnTypeFix: updated fix to change method return type based on return statements in method body (IDEA-216275)

GitOrigin-RevId: e97990950039123c8c41921a71342b8ed60afdee
This commit is contained in:
Artemiy Sartakov
2019-07-04 09:02:24 +03:00
committed by intellij-monorepo-bot
parent 52aa1ae553
commit 42d733a694
42 changed files with 381 additions and 55 deletions
@@ -1,6 +1,6 @@
class C {
<error descr="Illegal type: 'void'">void</error>[] m1() { }
<error descr="Illegal type: 'void'">void</error> m2()[] { }
<error descr="Illegal type: 'void'">void</error>[] <error descr="Invalid return type">m1</error>() { }
<error descr="Illegal type: 'void'">void</error> <error descr="Invalid return type">m2</error>()[] { }
void m3(<error descr="Illegal type: 'void'">void</error> p) {}
{
@@ -6,7 +6,7 @@ interface ii {}
int f1() throws Exception {
int <error descr="Invalid return type">f1</error>() throws Exception {
<error descr="Missing return statement">}</error>
Object f2(int i) throws Exception {
@@ -217,7 +217,7 @@ interface ii {}
int f1() throws Exception {
int <error descr="Invalid return type">f1</error>() throws Exception {
<error descr="Missing return statement">}</error>
Object f2(int i) throws Exception {
@@ -421,7 +421,7 @@ interface ii {}
int f1() throws Exception {
int <error descr="Invalid return type">f1</error>() throws Exception {
<error descr="Missing return statement">}</error>
Object f2(int i) throws Exception {
@@ -626,7 +626,7 @@ interface ii {}
int f1() throws Exception {
int <error descr="Invalid return type">f1</error>() throws Exception {
<error descr="Missing return statement">}</error>
Object f2(int i) throws Exception {
@@ -829,7 +829,7 @@ interface ii {}
int f1() throws Exception {
int <error descr="Invalid return type">f1</error>() throws Exception {
<error descr="Missing return statement">}</error>
Object f2(int i) throws Exception {
@@ -1,12 +1,12 @@
class s {
void f() {
void <error descr="Invalid return type">f</error>() {
<error descr="Cannot return a value from a method with void result type">return 0;</error>
}
void f2() {
return;
}
int f3() {
int <error descr="Invalid return type">f3</error>() {
<error descr="Missing return value">return;</error>
}
int f4() {
@@ -6,7 +6,7 @@ class Test {
<warning descr="Unchecked call to 'isAssignableFrom(Class<?>)' as a member of raw type 'java.lang.Class'">foo.isAssignableFrom</warning>(Object.class);
}
public List<String> transform(List<List<String>> result) {
public List<String> <error descr="Invalid return type">transform</error>(List<List<String>> result) {
<error descr="Incompatible types. Found: 'java.util.List<java.util.List<java.lang.String>>', required: 'java.util.List<java.lang.String>'">return result;</error>
}
}
@@ -2,7 +2,7 @@ class Test {
public <T> T doStuff() {
return null;
}
public boolean test() {
public boolean <error descr="Invalid return type">test</error>() {
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'boolean'">return doStuff();</error>
}
@@ -9,7 +9,7 @@ public class WrongGenerics {
}
@SuppressWarnings("unchecked")
<T> Set<Foo<? extends T>> bar(Set<Foo<? extends T>> foo) {
<T> Set<Foo<? extends T>> <error descr="Invalid return type">bar</error>(Set<Foo<? extends T>> foo) {
return <error descr="Inconvertible types; cannot cast 'java.util.Set<Foo<? extends T>>' to 'java.util.Set<Foo<?>>'">(Set<Foo<?>>) foo</error>;
}
@@ -1,5 +1,5 @@
class Bug {
static A test(A[] as) {
static A <error descr="Invalid return type">test</error>(A[] as) {
for (<error descr="Incompatible types. Found: 'Bug.B', required: 'Bug.A'">B b</error> : as) {
<error descr="Incompatible types. Found: 'Bug.B', required: 'Bug.A'">return b;</error>
}
@@ -12,7 +12,7 @@ class B<S> extends A<S> {
<error descr="'foo(T, S)' in 'A' clashes with 'foo(Object, Object)' in 'B'; both methods have same erasure, yet neither overrides the other">class C extends B<String></error> {
@Override
<T> T foo(T x, String y) {
<T> T <error descr="Invalid return type">foo</error>(T x, String y) {
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'T'">return super.foo(x, y);</error>
}
}
@@ -16,7 +16,7 @@ class LimitedPool<T> {
void cleanup(T t);
}
public T alloc() {
public T <error descr="Invalid return type">alloc</error>() {
if (index >= capacity) return factory.create();
if (storage[index] == null) {
@@ -76,7 +76,7 @@ class d {
}
class e {
String foo () {
String <error descr="Invalid return type">foo</error> () {
MyList myList = new MyList();
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.String'">return myList.get(0);</error>
}
@@ -128,7 +128,7 @@ class A111<T> {
return v;
}
String g(A111 a) {
String <error descr="Invalid return type">g</error>(A111 a) {
//noinspection unchecked
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.String'">return a.f("");</error>
}
@@ -151,7 +151,7 @@ class A11<T> extends A1 {
class Test1<X> {
X x;
java.util.ArrayList<Number> foo = new java.util.ArrayList<Number>();
public static Number foo() {
public static Number <error descr="Invalid return type">foo</error>() {
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.Number'">return new Test1().foo.get(0);</error>
}
}
@@ -4,7 +4,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
class Test {
public static <Om> List<Om> sort(Comparator comp, Stream<Om> stream) {
public static <Om> List<Om> <error descr="Invalid return type">sort</error>(Comparator comp, Stream<Om> stream) {
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.util.List<Om>'">return stream.sorted(comp).collect(Collectors.toList());</error>
}
@@ -1,5 +1,5 @@
class Foo<T extends Enum> {
public T bar(Class<? extends T> type, String str) {
public T <error descr="Invalid return type">bar</error>(Class<? extends T> type, String str) {
return <error descr="Incompatible types. Required T but 'valueOf' was inferred to T:
Incompatible types: Enum is not convertible to T">Enum.valueOf(type, str);</error>
}
@@ -12,7 +12,7 @@ class B<S> extends A<S> {
<error descr="'foo(T, S)' in 'A' clashes with 'foo(Object, Object)' in 'B'; both methods have same erasure, yet neither overrides the other">class C extends B<String></error> {
@Override
<T> T foo(T x, String y) {
<T> T <error descr="Invalid return type">foo</error>(T x, String y) {
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'T'">return super.foo(x, y);</error>
}
}
@@ -16,7 +16,7 @@ class LimitedPool<T> {
void cleanup(T t);
}
public T alloc() {
public T <error descr="Invalid return type">alloc</error>() {
if (index >= capacity) return factory.create();
if (storage[index] == null) {
@@ -87,7 +87,7 @@ class d {
}
class e {
String foo () {
String <error descr="Invalid return type">foo</error> () {
MyList myList = new MyList();
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.String'">return myList.get(0);</error>
}
@@ -139,7 +139,7 @@ class A111<T> {
return v;
}
String g(A111 a) {
String <error descr="Invalid return type">g</error>(A111 a) {
//noinspection unchecked
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.String'">return a.f("");</error>
}
@@ -162,7 +162,7 @@ class A11<T> extends A1 {
class Test1<X> {
X x;
java.util.ArrayList<Number> foo = new java.util.ArrayList<Number>();
public static Number foo() {
public static Number <error descr="Invalid return type">foo</error>() {
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.lang.Number'">return new Test1().foo.get(0);</error>
}
}
@@ -3,7 +3,7 @@ abstract class Group {
public Group() {
}
public <T extends Category> T get(Key<T> key) {
public <T extends Category> T <error descr="Invalid return type">get</error>(Key<T> key) {
return <error descr="Incompatible types. Required T but 'getCategory' was inferred to R:
Incompatible types: Category is not convertible to T">getCategory(key);</error>
}
@@ -1,6 +1,6 @@
class Outer<T> {
class Inner { }
Foo<Outer.Inner> m(Foo<Outer<Integer>.Inner> foo) {
Foo<Outer.Inner> <error descr="Invalid return type">m</error>(Foo<Outer<Integer>.Inner> foo) {
<error descr="Incompatible types. Found: 'Foo<Outer<java.lang.Integer>.Inner>', required: 'Foo<Outer.Inner>'">return foo;</error>
}
}
@@ -6,7 +6,7 @@ class Test {
return list.stream().flatMap(List::stream).collect(Collectors.toList());
}
private static List<Object> test1(List<List> list) {
private static List<Object> <error descr="Invalid return type">test1</error>(List<List> list) {
<error descr="Incompatible types. Found: 'java.lang.Object', required: 'java.util.List<java.lang.Object>'">return list.stream().flatMap(l -> l.stream()).collect(Collectors.toList());</error>
}
}
@@ -26,7 +26,7 @@ public class ConcurrentCollectors {
}
static class Test3 {
static <T, K, D, M1 extends Map<K, D>> C<T, M1> groupingBy(F<M1> f,
static <T, K, D, M1 extends Map<K, D>> C<T, M1> <error descr="Invalid return type">groupingBy</error>(F<M1> f,
C<T, D> c,
BiConsumer<M1, T> consumer) {
return new CImpl<error descr="Cannot infer arguments"><></error>(f, consumer, arg(c.getOp()));
@@ -11,7 +11,7 @@ interface Foo<T> {
}
class Bar {
Foo<List<String>> transform(final Foo<? extends String> foo) {
Foo<List<String>> <error descr="Invalid return type">transform</error>(final Foo<? extends String> foo) {
<error descr="Incompatible types. Found: 'Foo<? extends java.util.List<? extends java.lang.String>>', required: 'Foo<java.util.List<java.lang.String>>'">return foo
.map(v2 -> tuple(v2))
.onClose();</error>
@@ -3,7 +3,7 @@ import java.util.Map;
import java.util.stream.Collectors;
class MyTest {
static Map<String, Meeting> getMeetingsById(List<Meeting> meetings){
static Map<String, Meeting> <error descr="Invalid return type">getMeetingsById</error>(List<Meeting> meetings){
return <error descr="Incompatible types. Required Map<String, Meeting> but 'collect' was inferred to R:
no instance(s) of type variable(s) A, A, K, R, T exist so that List<T> conforms to Meeting">meetings.stream()
.collect(Collectors.groupingBy(Meeting::getId));</error>
@@ -0,0 +1,11 @@
// "Make 'm' return 'java.util.AbstractList<java.lang.Object>' or predecessor" "true"
import java.util.*;
class Test {
AbstractList<Object> m(boolean b) {
if (b) return new ArrayList<>();
return new LinkedList<>();
}
}
@@ -0,0 +1,10 @@
// "Make 'm' return 'java.lang.Integer' or predecessor" "true"
class Test {
Integer m(boolean b) {
if (b) return null;
return 42;
}
}
@@ -0,0 +1,9 @@
// "Make 'm' return 'int'" "true"
class Test {
int m() {
return 42;
}
}
@@ -0,0 +1,8 @@
// "Make 'm' return 'void'" "true"
class Test {
void m() {
}
}
@@ -0,0 +1,9 @@
// "Make 'm' return 'double'" "true"
class Test {
double m(boolean b) {
if (b) return 42;
return 10.0;
}
}
@@ -2,7 +2,7 @@
class Test {
<caret><selection>Object</selection> foo() {
Object foo() {
return null;
}
}
@@ -0,0 +1,11 @@
// "Make 'm' return 'java.util.AbstractList<java.lang.Object>' or predecessor" "true"
import java.util.*;
class Test {
void <caret>m(boolean b) {
if (b) return new ArrayList<>();
return new LinkedList<>();
}
}
@@ -0,0 +1,10 @@
// "Make 'm' return 'java.lang.Integer' or predecessor" "true"
class Test {
void <caret>m(boolean b) {
if (b) return null;
return 42;
}
}
@@ -0,0 +1,9 @@
// "Make 'm' return 'int'" "true"
class Test {
void <caret>m() {
return 42;
}
}
@@ -0,0 +1,8 @@
// "Make 'm' return 'void'" "true"
class Test {
int <caret>m() {
}
}
@@ -0,0 +1,9 @@
// "Make 'm' return 'double'" "true"
class Test {
<caret>m(boolean b) {
if (b) return 42;
return 10.0;
}
}