Skip to content

Commit 5f271d3

Browse files
authored
Fix add final for fields cleanup for generic class and lambda (#2493)
- fix VariableDeclarationFixCore.fieldCanBeFinal() method to add call to IVariableBinding.getVariableDeclaration() in lambda visitor because reference to the field in lambda will be ParameterizedFieldBinding and will not be equal to original generic field binding - add new test to CleanUpTest - fixes #2492
1 parent c49c85f commit 5f271d3

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/VariableDeclarationFixCore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ public boolean visit(LambdaExpression lambda) {
300300
@Override
301301
public boolean visit(SimpleName name) {
302302
IBinding nameBinding= name.resolveBinding();
303-
if (nameBinding == null || (nameBinding instanceof IVariableBinding varBinding && varBinding.isEqualTo(binding))) {
303+
if (nameBinding == null || (nameBinding instanceof IVariableBinding varBinding && varBinding.getVariableDeclaration().isEqualTo(binding))) {
304304
throw new SearchException();
305305
}
306306
return false;

org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28046,6 +28046,52 @@ public void foo() {
2804628046
assertRefactoringHasNoChangeEventWithError(new ICompilationUnit[] {cu1});
2804728047
}
2804828048

28049+
@Test
28050+
public void testAddFinalIssue2492() throws Exception {
28051+
IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
28052+
String sample= """
28053+
package test;
28054+
public class E<R> {
28055+
interface K {
28056+
void run();
28057+
}
28058+
private R key;
28059+
28060+
private K k = () -> {
28061+
System.out.println(key);
28062+
};
28063+
28064+
public FinalIssue(R key) {
28065+
this.key= key;
28066+
}
28067+
}
28068+
""";
28069+
ICompilationUnit cu1= pack1.createCompilationUnit("E.java", sample, false, null);
28070+
28071+
enable(CleanUpConstants.VARIABLE_DECLARATIONS_USE_FINAL);
28072+
enable(CleanUpConstants.VARIABLE_DECLARATIONS_USE_FINAL_PRIVATE_FIELDS);
28073+
28074+
String expected= """
28075+
package test;
28076+
public class E<R> {
28077+
interface K {
28078+
void run();
28079+
}
28080+
private R key;
28081+
28082+
private final K k = () -> {
28083+
System.out.println(key);
28084+
};
28085+
28086+
public FinalIssue(R key) {
28087+
this.key= key;
28088+
}
28089+
}
28090+
""";
28091+
28092+
assertRefactoringResultAsExpected(new ICompilationUnit[] {cu1}, new String[] {expected}, null);
28093+
}
28094+
2804928095
@Test
2805028096
public void testAddFinalBug129807() throws Exception {
2805128097
IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);

0 commit comments

Comments
 (0)