Bug 567685 - Handle qualified field of type
Change-Id: If465437416e3511d897dd382ff6b07d21fdc4809
Signed-off-by: Fabrice Tiercelin <fabrice.tiercelin@yahoo.fr>
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
index 8d96077..72f753d 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
@@ -4503,11 +4503,11 @@
@Test
public void testUseArraysFill() throws Exception {
- IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
- String sample= "" //
+ IPackageFragment pack= fSourceFolder.createPackageFragment("test1", false, null);
+ String input= "" //
+ "package test1;\n" //
+ "\n" //
- + "public class E1 {\n" //
+ + "public class E {\n" //
+ " private static final boolean CONSTANT = true;\n" //
+ " private boolean[] booleanArray = new boolean[10];\n" //
+ "\n" //
@@ -4524,6 +4524,16 @@
+ " return array;\n" //
+ " }\n" //
+ "\n" //
+ + " public boolean[] refactorWithConstant() {\n" //
+ + " boolean[] array = new boolean[10];\n" //
+ + "\n" //
+ + " for (int i = 0; i < array.length; i++) {\n" //
+ + " array[i] = Boolean.TRUE;\n" //
+ + " }\n" //
+ + "\n" //
+ + " return array;\n" //
+ + " }\n" //
+ + "\n" //
+ " public int[] refactorNumberArray() {\n" //
+ " int[] array = new int[10];\n" //
+ "\n" //
@@ -4610,16 +4620,16 @@
+ " }\n" //
+ " }\n" //
+ "}\n";
- ICompilationUnit cu1= pack1.createCompilationUnit("E1.java", sample, false, null);
+ ICompilationUnit cu1= pack.createCompilationUnit("E.java", input, false, null);
enable(CleanUpConstants.ARRAYS_FILL);
- sample= "" //
+ String output= "" //
+ "package test1;\n" //
+ "\n" //
+ "import java.util.Arrays;\n" //
+ "\n" //
- + "public class E1 {\n" //
+ + "public class E {\n" //
+ " private static final boolean CONSTANT = true;\n" //
+ " private boolean[] booleanArray = new boolean[10];\n" //
+ "\n" //
@@ -4632,6 +4642,14 @@
+ " return array;\n" //
+ " }\n" //
+ "\n" //
+ + " public boolean[] refactorWithConstant() {\n" //
+ + " boolean[] array = new boolean[10];\n" //
+ + "\n" //
+ + " Arrays.fill(array, Boolean.TRUE);\n" //
+ + "\n" //
+ + " return array;\n" //
+ + " }\n" //
+ + "\n" //
+ " public int[] refactorNumberArray() {\n" //
+ " int[] array = new int[10];\n" //
+ "\n" //
@@ -4693,7 +4711,7 @@
+ " }\n" //
+ "}\n";
- assertRefactoringResultAsExpected(new ICompilationUnit[] { cu1 }, new String[] { sample });
+ assertRefactoringResultAsExpected(new ICompilationUnit[] { cu1 }, new String[] { output });
}
@Test
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/ArraysFillCleanUp.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/ArraysFillCleanUp.java
index f4be2fe..b174323 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/ArraysFillCleanUp.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/ArraysFillCleanUp.java
@@ -37,8 +37,8 @@
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
import org.eclipse.jdt.core.dom.MethodInvocation;
+import org.eclipse.jdt.core.dom.QualifiedName;
import org.eclipse.jdt.core.dom.SimpleName;
-import org.eclipse.jdt.core.dom.VariableDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
@@ -58,7 +58,11 @@
import org.eclipse.jdt.ui.text.java.IProblemLocation;
/**
- * A fix that uses Arrays.fill() when possible.
+ * A fix that uses Arrays.fill() when possible:
+ * <ul>
+ * <li>Check that we iterate on the whole array.</li>
+ * <li>Check that we always set the same value.</li>
+ * </ul>
*/
public class ArraysFillCleanUp extends AbstractMultiFix {
public ArraysFillCleanUp() {
@@ -129,28 +133,42 @@
}
private boolean isUnchangedValue(final ForStatement node, final Expression expression) {
- if (ASTNodes.isHardCoded(expression)) {
- return true;
- }
-
if (!ASTNodes.isPassive(expression)) {
return false;
}
- if (expression instanceof SimpleName) {
- SimpleName name= (SimpleName) expression;
- IBinding binding= name.resolveBinding();
+ if (ASTNodes.isHardCoded(expression)) {
+ return true;
+ }
+
+ SimpleName simpleName= null;
+
+ if (expression instanceof QualifiedName) {
+ QualifiedName name= (QualifiedName) expression;
+ IBinding binding= name.getQualifier().resolveBinding();
+
+ if (binding.getKind() == IBinding.TYPE) {
+ simpleName= name.getName();
+ }
+ } else if (expression instanceof SimpleName) {
+ simpleName= (SimpleName) expression;
+ }
+
+ if (simpleName != null) {
+ IBinding binding= simpleName.resolveBinding();
if (binding instanceof IVariableBinding) {
IVariableBinding varBinding= (IVariableBinding) binding;
- ASTNode declaration= ASTNodes.findDeclaration(binding, expression.getRoot());
- if (varBinding.isField()
- && declaration instanceof VariableDeclaration
- && ((VariableDeclaration) declaration).getInitializer() != null) {
+ if (varBinding.isField()) {
return Modifier.isFinal(varBinding.getModifiers());
}
+ if (varBinding.isEffectivelyFinal()) {
+ return true;
+ }
+
+ ASTNode declaration= ASTNodes.findDeclaration(binding, expression.getRoot());
return declaration != null && !ASTNodes.isParent(declaration, node);
}
}