Bug 513132: [quick fix] RemoveRedundantAnnotationRewriteOperation may
create a null change

Change-Id: Icfe3eff24224e55f3155a854517b5a66a6daf900
Signed-off-by: Stephan Herrmann <stephan.herrmann@berlin.de>
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java
index 4083ed5..06bdfc3 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest18.java
@@ -39,6 +39,7 @@
 import org.eclipse.jdt.ui.text.java.correction.CUCorrectionProposal;
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.text.correction.AssistContext;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -1491,4 +1492,39 @@
 		buf.append("}\n");
 		assertEqualString(preview, buf.toString());
 	}
+	
+	// remove redundant @NonNull on field type
+	public void testRemoveRedundantNonNull() throws Exception {
+		Hashtable<String, String> options= JavaCore.getOptions();
+		options.put(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED);
+		JavaCore.setOptions(options);
+
+		JavaProjectHelper.addLibrary(fJProject1, new Path(Java18ProjectTestSetup.getJdtAnnotations20Path()));
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
+		StringBuffer buf= new StringBuffer();
+		buf.append("package test1;\n");
+		buf.append("import org.eclipse.jdt.annotation.*;\n");
+		buf.append("@NonNullByDefault\n");
+		buf.append("public class E {\n");
+		buf.append("    @NonNull Object f=new Object();\n");
+		buf.append("}\n");
+		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		int offset= buf.indexOf("Object f");
+		AssistContext context= new AssistContext(cu, offset, 0);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1, context);
+		assertNumberOfProposals(proposals, 3);
+		CUCorrectionProposal proposal= (CUCorrectionProposal)proposals.get(0);
+		String preview= getPreviewContent(proposal);
+
+		buf= new StringBuffer();
+		buf.append("package test1;\n");
+		buf.append("import org.eclipse.jdt.annotation.*;\n");
+		buf.append("@NonNullByDefault\n");
+		buf.append("public class E {\n");
+		buf.append("    Object f=new Object();\n");
+		buf.append("}\n");
+		assertEqualString(preview, buf.toString());
+	}
 }
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsRewriteOperations.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsRewriteOperations.java
index 1c8cb1f..eb9e6eb 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsRewriteOperations.java
+++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsRewriteOperations.java
@@ -33,6 +33,7 @@
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.Annotation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.FieldDeclaration;
 import org.eclipse.jdt.core.dom.IAnnotationBinding;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.IExtendedModifier;
@@ -371,6 +372,9 @@
 				if (selectedNode instanceof SingleVariableDeclaration) {
 					SingleVariableDeclaration singleVariableDeclaration= (SingleVariableDeclaration) selectedNode;
 					modifiers= singleVariableDeclaration.modifiers();
+				} else if (selectedNode instanceof FieldDeclaration) {
+					FieldDeclaration fieldDeclaration= (FieldDeclaration) selectedNode;
+					modifiers= fieldDeclaration.modifiers();
 				} else if (selectedNode instanceof MethodDeclaration) {
 					MethodDeclaration methodDeclaration= (MethodDeclaration) selectedNode;
 					modifiers= methodDeclaration.modifiers();