Bug 337977: [quick fix] Add quick fixes for null annotations
- Wording tweaks
- Code style
- Bug fixes
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java
index c24e171..056b0bc 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullAnnotationsCleanUp.java
@@ -83,6 +83,9 @@
 		// TODO(SH): might set depending on this.handledProblemID, not sure about the benefit
 		result.put(JavaCore.COMPILER_PB_NULL_SPECIFICATION_VIOLATION, JavaCore.WARNING);
 		result.put(JavaCore.COMPILER_PB_REDUNDANT_NULL_CHECK, JavaCore.WARNING);
+		result.put(JavaCore.COMPILER_PB_NULL_ANNOTATION_INFERENCE_CONFLICT, JavaCore.WARNING);
+		result.put(JavaCore.COMPILER_PB_NULL_UNCHECKED_CONVERSION, JavaCore.WARNING);
+		result.put(JavaCore.COMPILER_PB_MISSING_NONNULL_BY_DEFAULT_ANNOTATION, JavaCore.WARNING);
 		return result;
 	}
 
@@ -124,14 +127,12 @@
 	 */
 	public boolean canFix(ICompilationUnit compilationUnit, IProblemLocation problem) {
 		int id= problem.getProblemId();
-
 		if (id == this.handledProblemID) {
 			// FIXME search specifically: return param (which??)
 //			if (QuickFixes.hasExplicitNullnessAnnotation(compilationUnit, problem.getOffset()))
 //				return false;
 			return true;
 		}
-
 		return false;
 	}
 
@@ -142,7 +143,6 @@
 	@Override
 	public int computeNumberOfFixes(CompilationUnit compilationUnit) {
 		int result= 0;
-
 		IProblem[] problems= compilationUnit.getProblems();
 		for (int i= 0; i < problems.length; i++) {
 			int id= problems[i].getID();
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java
index 3fd05d4..75d4c0b 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.java
@@ -21,10 +21,10 @@
 	public static String NullAnnotationsCleanUp_add_nonnull_annotation;
 	
 	public static String QuickFixes_add_annotation_change_name;
-	public static String QuickFixes_declare_method_parameter_nullness;
-	public static String QuickFixes_declare_method_return_nullness;
-	public static String QuickFixes_declare_overridden_parameter_as_nonnull;
-	public static String QuickFixes_declare_overridden_return_as_nullable;
+	public static String QuickFixes_change_method_parameter_nullness;
+	public static String QuickFixes_change_method_return_nullness;
+	public static String QuickFixes_change_overridden_parameter_nullness;
+	public static String QuickFixes_change_overridden_return_nullness;
 
 	static {
 		// initialize resource bundle
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties
index 172c9cb..1e48568 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullFixMessages.properties
@@ -12,7 +12,7 @@
 NullAnnotationsCleanUp_add_nullable_annotation=Add missing @Nullable annotation
 NullAnnotationsCleanUp_add_nonnull_annotation=Add missing @NonNull annotation
 QuickFixes_add_annotation_change_name=Add Annotations
-QuickFixes_declare_method_parameter_nullness=Declare method parameter as @{0}
-QuickFixes_declare_method_return_nullness=Declare method return as @{0}
-QuickFixes_declare_overridden_parameter_as_nonnull=Adjust overridden method from {1}, mark parameter as @{0}
-QuickFixes_declare_overridden_return_as_nullable=Adjust overridden method from {1}, mark as returning @{0}
+QuickFixes_change_method_parameter_nullness=Change parameter type to ''@{0}''
+QuickFixes_change_method_return_nullness=Change return type of ''{0}(..)'' to ''@{1}''
+QuickFixes_change_overridden_parameter_nullness=Change parameter type in overridden ''{0}(..)'' to ''@{1}''
+QuickFixes_change_overridden_return_nullness=Change return type of overridden ''{0}(..)'' to ''@{1}''
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java
index 63dd01c..5770850 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java
@@ -112,9 +112,8 @@
 	}
 
 	public static boolean isComplainingAboutArgument(ASTNode selectedNode) {
-		if (!(selectedNode instanceof SimpleName)) {
+		if (!(selectedNode instanceof SimpleName))
 			return false;
-		}
 		SimpleName nameNode= (SimpleName) selectedNode;
 		IBinding binding= nameNode.resolveBinding();
 		if (binding.getKind() == IBinding.VARIABLE && ((IVariableBinding) binding).isParameter())
@@ -173,13 +172,11 @@
 
 	// Entry for NullAnnotationsCleanup:
 	public static ICleanUpFix createCleanUp(CompilationUnit compilationUnit, IProblemLocation[] locations, int problemID) {
-
 		ICompilationUnit cu= (ICompilationUnit) compilationUnit.getJavaElement();
 		if (!JavaModelUtil.is50OrHigher(cu.getJavaProject()))
 			return null;
 
 		List<CompilationUnitRewriteOperation> operations= new ArrayList<CompilationUnitRewriteOperation>();
-
 		if (locations == null) {
 			org.eclipse.jdt.core.compiler.IProblem[] problems= compilationUnit.getProblems();
 			locations= new IProblemLocation[problems.length];
@@ -190,10 +187,8 @@
 		}
 
 		createAddNullAnnotationOperations(compilationUnit, locations, operations);
-
 		if (operations.size() == 0)
 			return null;
-
 		CompilationUnitRewriteOperation[] operationsArray= operations.toArray(new CompilationUnitRewriteOperation[operations.size()]);
 		return new MyCURewriteOperationsFix(NullFixMessages.QuickFixes_add_annotation_change_name, compilationUnit, operationsArray);
 	}
@@ -215,7 +210,13 @@
 				case IProblem.IllegalReturnNullityRedefinition:
 					annotationToAdd= nonNullAnnotationName;
 					annotationToRemove= nullableAnnotationName;
-					// all others propose to add @Nullable
+					break;
+				case IProblem.RequiredNonNullButProvidedNull:
+				case IProblem.RequiredNonNullButProvidedPotentialNull:
+				case IProblem.RequiredNonNullButProvidedUnknown:
+					annotationToAdd= nonNullAnnotationName;
+					break;
+			// all others propose to add @Nullable
 			}
 			// when performing multiple changes we can only modify the one CU that the CleanUp infrastructure provides to the operation.
 			CompilationUnitRewriteOperation fix= NullRewriteOperations.createAddAnnotationOperation(compilationUnit, problem, annotationToAdd, annotationToRemove, handledPositions,
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java
index 7e6e473..99ac1d0 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java
@@ -58,15 +58,10 @@
 
 	static abstract class SignatureAnnotationRewriteOperation extends CompilationUnitRewriteOperation {
 		String fAnnotationToAdd;
-
 		String fAnnotationToRemove;
-
 		boolean fAllowRemove;
-
 		CompilationUnit fUnit;
-
 		protected String fKey;
-
 		protected String fMessage;
 
 		/* A globally unique key that identifies the position being annotated (for avoiding double annotations). */
@@ -78,7 +73,6 @@
 			return fUnit;
 		}
 
-
 		boolean checkExisting(List<IExtendedModifier> existingModifiers, ListRewrite listRewrite, TextEditGroup editGroup) {
 			for (Object mod : existingModifiers) {
 				if (mod instanceof MarkerAnnotation) {
@@ -211,12 +205,11 @@
 		ASTNode selectedNode= problem.getCoveringNode(compilationUnit);
 		if (selectedNode == null)
 			return null;
-
 		ASTNode declaringNode= getDeclaringNode(selectedNode);
 
 		switch (problem.getProblemId()) {
 			case IProblem.IllegalDefinitionToNonNullParameter:
-//		case IllegalRedefinitionToNonNullParameter:
+//			case IllegalRedefinitionToNonNullParameter:
 				// these affect another method
 				break;
 			case IProblem.IllegalReturnNullityRedefinition:
@@ -229,8 +222,6 @@
 					return null;
 		}
 
-		SignatureAnnotationRewriteOperation result= null;
-		String message= null;
 		String annotationNameLabel= annotationToAdd;
 		int lastDot= annotationToAdd.lastIndexOf('.');
 		if (lastDot != -1)
@@ -250,14 +241,11 @@
 			ASTNode methodDecl= compilationUnit.findDeclaringNode(methodBinding.getKey());
 			if (methodDecl == null)
 				return null;
-			message= Messages.format(NullFixMessages.QuickFixes_declare_method_parameter_nullness, annotationNameLabel);
-			result= new ParameterAnnotationRewriteOperation(compilationUnit, (MethodDeclaration) methodDecl, annotationToAdd, annotationToRemove, paramIdx, allowRemove, message);
+			String message= Messages.format(NullFixMessages.QuickFixes_change_method_parameter_nullness, annotationNameLabel);
+			return new ParameterAnnotationRewriteOperation(compilationUnit, (MethodDeclaration) methodDecl, annotationToAdd, annotationToRemove, paramIdx, allowRemove, message);
 		} else if (declaringNode instanceof MethodDeclaration) {
-
 			// complaint is in signature of this method
-
 			MethodDeclaration declaration= (MethodDeclaration) declaringNode;
-
 			switch (problem.getProblemId()) {
 				case IProblem.ParameterLackingNonNullAnnotation:
 				case IProblem.ParameterLackingNullableAnnotation:
@@ -269,8 +257,8 @@
 					if (declaration.getNodeType() == ASTNode.METHOD_DECLARATION) {
 						String paramName= findAffectedParameterName(selectedNode);
 						if (paramName != null) {
-							message= Messages.format(NullFixMessages.QuickFixes_declare_method_parameter_nullness, annotationNameLabel);
-							result= new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
+							String message= Messages.format(NullFixMessages.QuickFixes_change_method_parameter_nullness, annotationNameLabel);
+							return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
 						}
 					}
 					break;
@@ -283,26 +271,23 @@
 						if (declaration.getNodeType() == ASTNode.METHOD_DECLARATION) {
 							String paramName= findAffectedParameterName(selectedNode);
 							if (paramName != null) {
-								message= Messages.format(NullFixMessages.QuickFixes_declare_method_parameter_nullness, annotationNameLabel);
-								result= new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
+								String message= Messages.format(NullFixMessages.QuickFixes_change_method_parameter_nullness, annotationNameLabel);
+								return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
 							}
 						}
 						break;
 					}
 					//$FALL-THROUGH$
 				case IProblem.IllegalReturnNullityRedefinition:
-					message= Messages.format(NullFixMessages.QuickFixes_declare_method_return_nullness, annotationNameLabel);
-					result= new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
-					break;
+					String message= Messages.format(NullFixMessages.QuickFixes_change_method_return_nullness, new String[] { declaration.getName().getIdentifier(), annotationNameLabel });
+					return new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
 			}
-
 		}
-		return result;
+		return null;
 	}
 
 	private static SignatureAnnotationRewriteOperation createAddAnnotationToOverriddenOperation(CompilationUnit compilationUnit, IProblemLocation problem, String annotationToAdd,
-			String annotationToRemove,
-			Set<String> handledPositions, boolean thisUnitOnly, boolean allowRemove) {
+			String annotationToRemove, Set<String> handledPositions, boolean thisUnitOnly, boolean allowRemove) {
 		ICompilationUnit cu= (ICompilationUnit) compilationUnit.getJavaElement();
 		if (!JavaModelUtil.is50OrHigher(cu.getJavaProject()))
 			return null;
@@ -312,7 +297,6 @@
 			return null;
 
 		ASTNode declaringNode= getDeclaringNode(selectedNode);
-
 		switch (problem.getProblemId()) {
 			case IProblem.IllegalDefinitionToNonNullParameter:
 			case IProblem.IllegalRedefinitionToNonNullParameter:
@@ -332,11 +316,8 @@
 		annotationNameLabel= BasicElementLabels.getJavaElementName(annotationNameLabel);
 
 		if (declaringNode instanceof MethodDeclaration) {
-
 			// complaint is in signature of this method
-
 			MethodDeclaration declaration= (MethodDeclaration) declaringNode;
-
 			switch (problem.getProblemId()) {
 				case IProblem.IllegalDefinitionToNonNullParameter:
 				case IProblem.IllegalRedefinitionToNonNullParameter:
@@ -346,15 +327,12 @@
 						return createChangeOverriddenReturnOperation(compilationUnit, cu, declaration, allowRemove, annotationToAdd, annotationToRemove, annotationNameLabel);
 					}
 			}
-
 		}
 		return null;
 	}
 
 	private static SignatureAnnotationRewriteOperation createChangeOverriddenParameterOperation(CompilationUnit compilationUnit, ICompilationUnit cu, MethodDeclaration declaration,
 			ASTNode selectedNode, boolean allowRemove, String annotationToAdd, String annotationToRemove, String annotationNameLabel) {
-		SignatureAnnotationRewriteOperation result;
-		String message;
 		IMethodBinding methodDeclBinding= declaration.resolveBinding();
 		if (methodDeclBinding == null)
 			return null;
@@ -369,15 +347,13 @@
 		if (methodDecl == null)
 			return null;
 		declaration= (MethodDeclaration) methodDecl;
-		message= Messages.format(NullFixMessages.QuickFixes_declare_overridden_parameter_as_nonnull,
-				new String[] { annotationNameLabel, BasicElementLabels.getJavaElementName(overridden.getDeclaringClass().getName()) });
+		String message= Messages.format(NullFixMessages.QuickFixes_change_overridden_parameter_nullness, new String[] { overridden.getName(), annotationNameLabel });
 		String paramName= findAffectedParameterName(selectedNode);
-		result= new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
-		return result;
+		return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message);
 	}
 
 	private static String findAffectedParameterName(ASTNode selectedNode) {
-		VariableDeclaration argDecl= selectedNode instanceof VariableDeclaration ? (VariableDeclaration) selectedNode : (VariableDeclaration) ASTNodes.getParent(selectedNode,
+		VariableDeclaration argDecl= (selectedNode instanceof VariableDeclaration) ? (VariableDeclaration) selectedNode : (VariableDeclaration) ASTNodes.getParent(selectedNode,
 				VariableDeclaration.class);
 		if (argDecl != null)
 			return argDecl.getName().getIdentifier();
@@ -408,8 +384,6 @@
 
 	private static SignatureAnnotationRewriteOperation createChangeOverriddenReturnOperation(CompilationUnit compilationUnit, ICompilationUnit cu, MethodDeclaration declaration, boolean allowRemove,
 			String annotationToAdd, String annotationToRemove, String annotationNameLabel) {
-		SignatureAnnotationRewriteOperation result;
-		String message;
 		IMethodBinding methodDeclBinding= declaration.resolveBinding();
 		if (methodDeclBinding == null)
 			return null;
@@ -427,10 +401,8 @@
 // TODO(SH): decide whether we want to propose overwriting existing annotations in super
 //		if (hasNullAnnotation(declaration)) // if overridden has explicit declaration don't propose to change it
 //			return null;
-		message= Messages.format(NullFixMessages.QuickFixes_declare_overridden_return_as_nullable,
-				new String[] { annotationNameLabel, BasicElementLabels.getJavaElementName(overridden.getDeclaringClass().getName()) });
-		result= new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
-		return result;
+		String message= Messages.format(NullFixMessages.QuickFixes_change_overridden_return_nullness, new String[] { overridden.getName(), annotationNameLabel });
+		return new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message);
 	}
 
 	private static CompilationUnit findCUForMethod(CompilationUnit compilationUnit, ICompilationUnit cu, IMethodBinding methodBinding) {