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()) {