Bug 573672 - [cleanup & saveaction] "Unnecessary array creation" rule
makes NPE on default package

"Unnecessary array creation" cleanup rule makes a null pointer when the
class is in the default package.

Given:
public class A {
    public class B {
        public void foo(Object elementsOrTreePaths, Integer obj, Integer
obj2) {
            return;
        }
    }

    public class C extends B {
        public void foo(Object... elementsOrTreePaths) {
            return;
        }

        public void foo(Object elementsOrTreePaths, Integer obj) {
            foo(new Object[] {elementsOrTreePaths, obj});
            foo(new Object[] {elementsOrTreePaths,
elementsOrTreePaths});
            foo(new Object[] {elementsOrTreePaths, obj, obj});
            foo(new Object[] {elementsOrTreePaths, obj,
elementsOrTreePaths});
        }
    }
}

When:
Applying "Unnecessary array creation" rule...

Expected:
public class A {
    public class B {
        public void foo(Object elementsOrTreePaths, Integer obj, Integer
obj2) {
            return;
        }
    }

    public class C extends B {
        public void foo(Object... elementsOrTreePaths) {
            return;
        }

        public void foo(Object elementsOrTreePaths, Integer obj) {
            foo(elementsOrTreePaths, obj);
            foo(elementsOrTreePaths, elementsOrTreePaths);
            foo(elementsOrTreePaths, obj, obj);
            foo(elementsOrTreePaths, obj, elementsOrTreePaths);
        }
    }
}

Actual:
NPE

Change-Id: I821543924ea6437a3386b449b31199e2715b9d0c
Signed-off-by: Fabrice Tiercelin <fabrice.tiercelin@yahoo.fr>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/180819
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Reviewed-by: Noopur Gupta <noopur_gupta@in.ibm.com>
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
index 35b1434..bda9c3b 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
@@ -14,7 +14,10 @@
 package org.eclipse.jdt.ui.tests.quickfix;
 
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.Arrays;
 import java.util.HashSet;
 
@@ -2858,6 +2861,71 @@
 	}
 
 	@Test
+	public void testUnnecessaryArray_default_package() throws Exception {
+		try {
+			// Given
+			IPackageFragment pack1= fSourceFolder.createPackageFragment("", false, null);
+			String given= "" //
+					+ "public class A {\n" //
+					+ "    public class B {\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj, Integer obj2) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "\n" //
+					+ "    public class C extends B {\n" //
+					+ "        public void foo(Object... elementsOrTreePaths) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj) {\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj});\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, elementsOrTreePaths});\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj, obj});\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj, elementsOrTreePaths});\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "}\n";
+
+			String expected= "" //
+					+ "public class A {\n" //
+					+ "    public class B {\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj, Integer obj2) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "\n" //
+					+ "    public class C extends B {\n" //
+					+ "        public void foo(Object... elementsOrTreePaths) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj) {\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj});\n" //
+					+ "            foo(elementsOrTreePaths, elementsOrTreePaths);\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj, obj});\n" //
+					+ "            foo(elementsOrTreePaths, obj, elementsOrTreePaths);\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "}\n";
+
+			// When
+			ICompilationUnit cu= pack1.createCompilationUnit("A.java", given, false, null);
+			enable(CleanUpConstants.REMOVE_UNNECESSARY_ARRAY_CREATION);
+
+			// Then
+			assertNotEquals("The class must be changed", given, expected);
+			assertRefactoringResultAsExpected(new ICompilationUnit[] { cu }, new String[] { expected },
+					new HashSet<>(Arrays.asList(FixMessages.UnusedCodeFix_RemoveUnnecessaryArrayCreation_description)));
+		} catch (Exception e) {
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            e.printStackTrace(pw);
+            fail(sw.toString());
+		}
+	}
+
+	@Test
 	public void testUnnecessaryEmptyArray() throws Exception {
 		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
 		String sample= "" //
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java
index c61ea19..b8b68d5 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java
+++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java
@@ -163,7 +163,11 @@
 					if (root instanceof CompilationUnit) {
 						CompilationUnit compilationUnit= (CompilationUnit) root;
 						List<ImportDeclaration> imports= compilationUnit.imports();
-						String localPackage= compilationUnit.getPackage().getName().getFullyQualifiedName();
+						String localPackage= null;
+
+						if (compilationUnit.getPackage() != null && compilationUnit.getPackage().getName() != null) {
+							localPackage= compilationUnit.getPackage().getName().getFullyQualifiedName();
+						}
 
 						for (ImportDeclaration oneImport : imports) {
 							if (oneImport.isStatic()
@@ -173,11 +177,16 @@
 								String methodIdentifier= methodName.getName().getIdentifier();
 								ITypeBinding conflictingType= methodName.getQualifier().resolveTypeBinding();
 
-								if (conflictingType == null || conflictingType.getPackage() == null) {
+								if (conflictingType == null) {
 									return true; // Error on side of caution
 								}
 
-								String importPackage= conflictingType.getPackage().getName();
+								String importPackage= null;
+
+								if (conflictingType.getPackage() != null) {
+									importPackage= conflictingType.getPackage().getName();
+								}
+
 								boolean inSamePackage= Objects.equals(localPackage, importPackage);
 
 								for (IMethodBinding declaredMethod : conflictingType.getDeclaredMethods()) {