Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 394031

Summary: [encapsulate field] Encapsulating a field when set method exist does not update return value which yields a compilation error
Product: [Eclipse Project] JDT Reporter: Milos Gligoric <milos.gligoric>
Component: UIAssignee: JDT-UI-Inbox <jdt-ui-inbox>
Status: CLOSED WONTFIX QA Contact:
Severity: normal    
Priority: P3 CC: kenneth, manju656
Version: 4.2.1   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard: stalebug

Description Milos Gligoric CLA 2012-11-10 09:22:49 EST
Steps to reproduce:
1. Invoke "Encapsulate Field" refactoring on "n" field in the code below.
2. The resulting code does not compile ("Type mismatch: cannot convert from void to int"). The problem is that there is an existing "setN" method and neither the return value is updated nor a warning is given to the user.

public class EncapsulateFieldBug {
    // Invoke "Encapsulate Field" on "n"
    int m, n;

    void setN(int n) {
        this.n = n;
    }

    void f() {
        m = n = 0;
    }
}

(Thanks to Yilong Li for helping with the bug report.)
Comment 1 Martin Mathew CLA 2012-12-14 06:41:01 EST
Issue is reproducible using I20121210-0800. The code refactoring results in compiler error.
Comment 2 Eclipse Genie CLA 2020-01-06 13:23:50 EST
This bug hasn't had any activity in quite some time. Maybe the problem got resolved, was a duplicate of something else, or became less pressing for some reason - or maybe it's still relevant but just hasn't been looked at yet.

If you have further information on the current state of the bug, please add it. The information can be, for example, that the problem still occurs, that you still want the feature, that more information is needed, or that the bug is (for whatever reason) no longer relevant.

--
The automated Eclipse Genie.
Comment 3 Kenneth Styrberg CLA 2020-01-07 14:46:46 EST
tested with I20200107-0600 build

The refactor works for the reported bug.

However when replacing field access with getter and setter the code is malformed as:

void f() {
   m = n = 0;
}

becomes:

void f() {
   m = setN(0);
}

I'm looking into it.
Comment 4 Kenneth Styrberg CLA 2020-01-07 15:18:47 EST
After encapsulating and replacing with getter/setter. There is a chain of quickfixes available to fix the bad code.

"Change return type to int..." and second is "Add return statement..."

Propose to close.