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);
 					}
 				}