Bug 450978

Summary: [refactor] Add "extract static method" refactoring
Product: [Eclipse Project] JDT Reporter: Lukas Eder <lukas.eder>
Component: UIAssignee: JDT-UI-Inbox <jdt-ui-inbox>
Status: CLOSED DUPLICATE QA Contact:
Severity: normal    
Priority: P3 CC: noopur_gupta, stephan.herrmann
Version: 4.5   
Target Milestone: ---   
Hardware: PC   
OS: Windows NT   
Whiteboard:

Description Lukas Eder CLA 2014-11-11 10:04:30 EST
In some cases, when I'm in a non-static context, I would love to be able to refactor / extract a static method. Example:

Situation
----------------------------------------

private int memberField;

public void memberMethod(int a) {
    int b;

    b = a + memberField; // Call extract method for this line
}


Current output
----------------------------------------

private int memberField;

public void memberMethod(int a) {
    int b;

    extracted(a);
}

private void extracted(int a) {
    int b;
    b = a + memberField;
}


Desired output
----------------------------------------

private int memberField;

public void memberMethod(int a) {
    int b;

    extracted(a, memberField);
}

private static void extracted(int a, int memberField) {
    int b;
    b = a + memberField;
}


Alternative desired output
----------------------------------------

private int memberField;

public void memberMethod(int a) {
    int b;

    extracted(a, this);
}

private static void extracted(int a, ScopeClass scopeClass) {
    int b;
    b = a + scopeClass.memberField;
}

----------------------------------------

Of course, the refactoring should also be made available in the quick fix selection.
Comment 1 Stephan Herrmann CLA 2014-11-11 10:27:44 EST
Passing to JDT/UI.

I understand this is besides the point, but I found your example confusing at first, because you're starting from a statement with no observable effect. Shouldn't we start by adding some statements that read b after the assignment? Or extract only the RHS of the assignment?
Comment 2 Lukas Eder CLA 2014-11-11 10:44:00 EST
Yes it's nonsense, you're right. It should be more like this:

Current output
----------------------------------------

private int memberField;

public void memberMethod(int a) {
    int b;

    b = extracted(a);
}

private int extracted(int a) {
    return a + memberField;
}


Desired output
----------------------------------------

private int memberField;

public void memberMethod(int a) {
    int b;

    b = extracted(a, memberField);
}

private static int extracted(int a, int memberField) {
    return a + memberField;
}


Alternative desired output
----------------------------------------

private int memberField;

public void memberMethod(int a) {
    int b;

    b = extracted(a, this);
}

private static int extracted(int a, ScopeClass scopeClass) {
    return a + scopeClass.memberField;
}
Comment 3 Noopur Gupta CLA 2014-11-12 05:12:28 EST

*** This bug has been marked as a duplicate of bug 318560 ***