Bug 338404

Summary: [quick fix] Generify simple Comparators: Add type arguments to supertype, change parameters of compare(Object, Object)
Product: [Eclipse Project] JDT Reporter: Markus Keller <markus.kell.r>
Component: UIAssignee: JDT-UI-Inbox <jdt-ui-inbox>
Status: ASSIGNED --- QA Contact:
Severity: enhancement    
Priority: P3 CC: carsten.hammer, deepakazad, fabrice.tiercelin
Version: 3.7   
Target Milestone: ---   
Hardware: All   
OS: All   
Whiteboard: fix candidate

Description Markus Keller CLA 2011-02-28 07:16:13 EST
HEAD

Add a quick fix that parametrizes simple Comparators like this one:

package xy;

import java.util.*;

public class Try {
    public static void main(String[] args) {
        List numbers= Arrays.asList(42, 17, -4, 1, 3);
        foo(numbers);
        System.out.println(numbers);
    }

    static void foo(List list) {
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Integer i1= (Integer) o1;
                Integer i2= (Integer) o2;
                return i1.compareTo(i2);
            }
        });
    }
}

Expected result:
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer i1, Integer i2) {
                return i1.compareTo(i2);
            }
        });

The quick fix should be smart and also work if the casts are in different order or if other statements are between the casts.

It should also work if one or both of the casts are inlined, e.g. transform

            public int compare(Object o1, Object o2) {
                return ((Integer) o1).compareTo((Integer) o2);
            }
into
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }