diff options
author | Deepak Azad | 2012-07-20 06:21:39 +0000 |
---|---|---|
committer | Deepak Azad | 2012-07-20 06:21:39 +0000 |
commit | a70adae0e222ad35b0a5dc6f3c5fb8df188f15a6 (patch) | |
tree | 2cf5685799ce4c75720830b5a8556fbda4260de3 | |
parent | b5df3f3ea070137fe77b53c4230959ac339f87cd (diff) | |
download | eclipse.jdt.ui-a70adae0e222ad35b0a5dc6f3c5fb8df188f15a6.tar.gz eclipse.jdt.ui-a70adae0e222ad35b0a5dc6f3c5fb8df188f15a6.tar.xz eclipse.jdt.ui-a70adae0e222ad35b0a5dc6f3c5fb8df188f15a6.zip |
Bug 337977: [quick fix] Add quick fixes for null annotations
- Refactor/Move code around to fit existing patterns
9 files changed, 136 insertions, 114 deletions
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java index 8a5a4d10af..f75d620617 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.java @@ -117,6 +117,12 @@ public final class FixMessages extends NLS { public static String VariableDeclarationFix_changeModifierOfUnknownToFinal_description; public static String VariableDeclarationFix_ChangeMidifiersToFinalWherPossible_description; + public static String NullAnnotationsFix_add_annotation_change_name; + public static String NullAnnotationsRewriteOperations_change_method_parameter_nullness; + public static String NullAnnotationsRewriteOperations_change_method_return_nullness; + public static String NullAnnotationsRewriteOperations_change_overridden_parameter_nullness; + public static String NullAnnotationsRewriteOperations_change_overridden_return_nullness; + static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, FixMessages.class); diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties index 864cbe88ff..3795284575 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/FixMessages.properties @@ -102,3 +102,10 @@ CodeStyleFix_change_name=Code Style Clean Up ControlStatementsFix_change_name=Control Statements Clean Up SortMembersFix_Change_description=Sort Members SortMembersFix_Fix_description=Sort Members + +NullAnnotationsFix_add_annotation_change_name=Add Annotations +NullAnnotationsRewriteOperations_change_method_parameter_nullness=Change parameter type to ''@{0}'' +NullAnnotationsRewriteOperations_change_method_return_nullness=Change return type of ''{0}(..)'' to ''@{1}'' +NullAnnotationsRewriteOperations_change_overridden_parameter_nullness=Change parameter type in overridden ''{0}(..)'' to ''@{1}'' +NullAnnotationsRewriteOperations_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/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsFix.java index 8d007f9e21..a7513ba448 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullQuickFixes.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsFix.java @@ -9,18 +9,13 @@ * Stephan Herrmann <stephan@cs.tu-berlin.de> - [quick fix] Add quick fixes for null annotations - https://bugs.eclipse.org/337977 * IBM Corporation - bug fixes *******************************************************************************/ -package org.eclipse.jdt.internal.ui.fix; +package org.eclipse.jdt.internal.corext.fix; import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; -import java.util.Hashtable; import java.util.List; -import java.util.Map; import java.util.Set; -import org.eclipse.swt.graphics.Image; - import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.JavaCore; @@ -33,84 +28,24 @@ import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.VariableDeclaration; import org.eclipse.jdt.internal.corext.dom.ASTNodes; -import org.eclipse.jdt.internal.corext.fix.CompilationUnitRewriteOperationsFix; -import org.eclipse.jdt.internal.corext.fix.CompilationUnitRewriteOperationsFix.CompilationUnitRewriteOperation; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.ui.cleanup.ICleanUpFix; -import org.eclipse.jdt.ui.text.java.IInvocationContext; import org.eclipse.jdt.ui.text.java.IProblemLocation; -import org.eclipse.jdt.ui.text.java.correction.ICommandAccess; -import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation; -import org.eclipse.jdt.internal.ui.text.correction.proposals.FixCorrectionProposal; - -/** - * Quick Fixes for null-annotation related problems. - */ -public class NullQuickFixes { - - /** Small adaptation just to make available the 'compilationUnit' passed at instantiation time. */ - private static class MyCURewriteOperationsFix extends CompilationUnitRewriteOperationsFix { - CompilationUnit cu; - public MyCURewriteOperationsFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation[] operations) { - super(name, compilationUnit, operations); - this.cu= compilationUnit; - } - } +public class NullAnnotationsFix extends CompilationUnitRewriteOperationsFix { - public static void addReturnAndArgumentTypeProposal(IInvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) { - CompilationUnit astRoot= context.getASTRoot(); - ASTNode selectedNode= problem.getCoveringNode(astRoot); + private CompilationUnit cu; - boolean isArgumentProblem= isComplainingAboutArgument(selectedNode); - if (isArgumentProblem || isComplainingAboutReturn(selectedNode)) - addNullAnnotationInSignatureProposal(context, problem, proposals, false, isArgumentProblem); + public NullAnnotationsFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperation[] operations) { + super(name, compilationUnit, operations); + this.cu= compilationUnit; } - public static void addNullAnnotationInSignatureProposal(IInvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals, boolean modifyOverridden, - boolean isArgumentProblem) { - MyCURewriteOperationsFix fix= createNullAnnotationInSignatureFix(context.getASTRoot(), problem, modifyOverridden, isArgumentProblem); - - if (fix != null) { - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - Map<String, String> options= new Hashtable<String, String>(); - if (fix.cu != context.getASTRoot()) { - // workaround: adjust the unit to operate on, depending on the findings of RewriteOperations.createAddAnnotationOperation(..) - final CompilationUnit cu= fix.cu; - final IInvocationContext originalContext= context; - context= new IInvocationContext() { - public int getSelectionOffset() { - return originalContext.getSelectionOffset(); - } - - public int getSelectionLength() { - return originalContext.getSelectionLength(); - } - - public ASTNode getCoveringNode() { - return originalContext.getCoveringNode(); - } - - public ASTNode getCoveredNode() { - return originalContext.getCoveredNode(); - } - - public ICompilationUnit getCompilationUnit() { - return (ICompilationUnit) cu.getJavaElement(); - } - - public CompilationUnit getASTRoot() { - return cu; - } - }; - } - int relevance= modifyOverridden ? 9 : 10; //raise local change above change in overridden method - FixCorrectionProposal proposal= new FixCorrectionProposal(fix, new NullAnnotationsCleanUp(options, problem.getProblemId()), relevance, image, context); - proposals.add(proposal); - } + public CompilationUnit getCu() { + return cu; } public static boolean isComplainingAboutArgument(ASTNode selectedNode) { @@ -132,7 +67,7 @@ public class NullQuickFixes { return selectedNode.getParent().getNodeType() == ASTNode.RETURN_STATEMENT; } - private static MyCURewriteOperationsFix createNullAnnotationInSignatureFix(CompilationUnit compilationUnit, IProblemLocation problem, boolean modifyOverridden, boolean isArgumentProblem) { + public static NullAnnotationsFix createNullAnnotationInSignatureFix(CompilationUnit compilationUnit, IProblemLocation problem, boolean modifyOverridden, boolean isArgumentProblem) { String nullableAnnotationName= getNullableAnnotationName(compilationUnit.getJavaElement(), false); String nonNullAnnotationName= getNonNullAnnotationName(compilationUnit.getJavaElement(), false); String annotationToAdd= nullableAnnotationName; @@ -167,13 +102,13 @@ public class NullQuickFixes { } // when performing one change at a time we can actually modify another CU than the current one: - NullRewriteOperations.SignatureAnnotationRewriteOperation operation= NullRewriteOperations.createAddAnnotationOperation(compilationUnit, problem, annotationToAdd, annotationToRemove, null, + NullAnnotationsRewriteOperations.SignatureAnnotationRewriteOperation operation= NullAnnotationsRewriteOperations.createAddAnnotationOperation(compilationUnit, problem, annotationToAdd, annotationToRemove, null, false/*thisUnitOnly*/, true/*allowRemove*/, modifyOverridden); if (operation == null) return null; - return new MyCURewriteOperationsFix(operation.getMessage(), operation.getCompilationUnit(), // note that this uses the findings from createAddAnnotationOperation(..) - new NullRewriteOperations.SignatureAnnotationRewriteOperation[] { operation }); + return new NullAnnotationsFix(operation.getMessage(), operation.getCompilationUnit(), // note that this uses the findings from createAddAnnotationOperation(..) + new NullAnnotationsRewriteOperations.SignatureAnnotationRewriteOperation[] { operation }); } // Entry for NullAnnotationsCleanup: @@ -196,7 +131,7 @@ public class NullQuickFixes { if (operations.size() == 0) return null; CompilationUnitRewriteOperation[] operationsArray= operations.toArray(new CompilationUnitRewriteOperation[operations.size()]); - return new MyCURewriteOperationsFix(MultiFixMessages.NullQuickFixes_add_annotation_change_name, compilationUnit, operationsArray); + return new NullAnnotationsFix(FixMessages.NullAnnotationsFix_add_annotation_change_name, compilationUnit, operationsArray); } private static void createAddNullAnnotationOperations(CompilationUnit compilationUnit, IProblemLocation[] locations, List<CompilationUnitRewriteOperation> result) { @@ -230,7 +165,7 @@ public class NullQuickFixes { // 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, + CompilationUnitRewriteOperation fix= NullAnnotationsRewriteOperations.createAddAnnotationOperation(compilationUnit, problem, annotationToAdd, annotationToRemove, handledPositions, true/*thisUnitOnly*/, false/*allowRemove*/, false/*modifyOverridden*/); if (fix != null) result.add(fix); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsRewriteOperations.java index 546b3cbb97..88cb3a64d2 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/NullRewriteOperations.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/NullAnnotationsRewriteOperations.java @@ -9,7 +9,7 @@ * Stephan Herrmann <stephan@cs.tu-berlin.de> - [quick fix] Add quick fixes for null annotations - https://bugs.eclipse.org/337977 * IBM Corporation - bug fixes *******************************************************************************/ -package org.eclipse.jdt.internal.ui.fix; +package org.eclipse.jdt.internal.corext.fix; import java.util.List; import java.util.Set; @@ -44,7 +44,6 @@ import org.eclipse.jdt.core.dom.rewrite.ListRewrite; import org.eclipse.jdt.internal.corext.dom.ASTNodes; import org.eclipse.jdt.internal.corext.dom.Bindings; import org.eclipse.jdt.internal.corext.fix.CompilationUnitRewriteOperationsFix.CompilationUnitRewriteOperation; -import org.eclipse.jdt.internal.corext.fix.LinkedProposalModel; import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.internal.corext.util.Messages; @@ -54,7 +53,7 @@ import org.eclipse.jdt.ui.text.java.IProblemLocation; import org.eclipse.jdt.internal.ui.text.correction.ASTResolving; import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; -public class NullRewriteOperations { +public class NullAnnotationsRewriteOperations { static abstract class SignatureAnnotationRewriteOperation extends CompilationUnitRewriteOperation { String fAnnotationToAdd; @@ -218,7 +217,7 @@ public class NullRewriteOperations { break; // do propose changes even if we already have an annotation default: // if this method has annotations, don't change'em - if (NullQuickFixes.hasExplicitNullAnnotation(cu, problem.getOffset())) + if (NullAnnotationsFix.hasExplicitNullAnnotation(cu, problem.getOffset())) return null; } @@ -241,7 +240,7 @@ public class NullRewriteOperations { ASTNode methodDecl= compilationUnit.findDeclaringNode(methodBinding.getKey()); if (methodDecl == null) return null; - String message= Messages.format(MultiFixMessages.NullRewriteOperations_change_method_parameter_nullness, annotationNameLabel); + String message= Messages.format(FixMessages.NullAnnotationsRewriteOperations_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 @@ -257,7 +256,7 @@ public class NullRewriteOperations { if (declaration.getNodeType() == ASTNode.METHOD_DECLARATION) { String paramName= findAffectedParameterName(selectedNode); if (paramName != null) { - String message= Messages.format(MultiFixMessages.NullRewriteOperations_change_method_parameter_nullness, annotationNameLabel); + String message= Messages.format(FixMessages.NullAnnotationsRewriteOperations_change_method_parameter_nullness, annotationNameLabel); return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message); } } @@ -266,13 +265,13 @@ public class NullRewriteOperations { case IProblem.RequiredNonNullButProvidedPotentialNull: case IProblem.RequiredNonNullButProvidedSpecdNullable: case IProblem.RequiredNonNullButProvidedUnknown: - if (NullQuickFixes.isComplainingAboutArgument(selectedNode)) { + if (NullAnnotationsFix.isComplainingAboutArgument(selectedNode)) { //TODO: duplication // statements suggest changing parameters: if (declaration.getNodeType() == ASTNode.METHOD_DECLARATION) { String paramName= findAffectedParameterName(selectedNode); if (paramName != null) { - String message= Messages.format(MultiFixMessages.NullRewriteOperations_change_method_parameter_nullness, annotationNameLabel); + String message= Messages.format(FixMessages.NullAnnotationsRewriteOperations_change_method_parameter_nullness, annotationNameLabel); return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message); } } @@ -280,7 +279,7 @@ public class NullRewriteOperations { } //$FALL-THROUGH$ case IProblem.IllegalReturnNullityRedefinition: - String message= Messages.format(MultiFixMessages.NullRewriteOperations_change_method_return_nullness, new String[] { declaration.getName().getIdentifier(), annotationNameLabel }); + String message= Messages.format(FixMessages.NullAnnotationsRewriteOperations_change_method_return_nullness, new String[] { declaration.getName().getIdentifier(), annotationNameLabel }); return new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message); } } @@ -348,7 +347,7 @@ public class NullRewriteOperations { if (methodDecl == null) return null; declaration= (MethodDeclaration) methodDecl; - String message= Messages.format(MultiFixMessages.NullRewriteOperations_change_overridden_parameter_nullness, new String[] { overridden.getName(), annotationNameLabel }); + String message= Messages.format(FixMessages.NullAnnotationsRewriteOperations_change_overridden_parameter_nullness, new String[] { overridden.getName(), annotationNameLabel }); String paramName= findAffectedParameterName(selectedNode); return new ParameterAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, paramName, allowRemove, message); } @@ -368,8 +367,8 @@ public class NullRewriteOperations { private static boolean hasNullAnnotation(MethodDeclaration decl) { List<IExtendedModifier> modifiers= decl.modifiers(); - String nonnull= NullQuickFixes.getNonNullAnnotationName(decl.resolveBinding().getJavaElement(), false); - String nullable= NullQuickFixes.getNullableAnnotationName(decl.resolveBinding().getJavaElement(), false); + String nonnull= NullAnnotationsFix.getNonNullAnnotationName(decl.resolveBinding().getJavaElement(), false); + String nullable= NullAnnotationsFix.getNullableAnnotationName(decl.resolveBinding().getJavaElement(), false); for (Object mod : modifiers) { if (mod instanceof Annotation) { Name annotationName= ((Annotation) mod).getTypeName(); @@ -402,7 +401,7 @@ public class NullRewriteOperations { // 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; - String message= Messages.format(MultiFixMessages.NullRewriteOperations_change_overridden_return_nullness, new String[] { overridden.getName(), annotationNameLabel }); + String message= Messages.format(FixMessages.NullAnnotationsRewriteOperations_change_overridden_return_nullness, new String[] { overridden.getName(), annotationNameLabel }); return new ReturnAnnotationRewriteOperation(compilationUnit, declaration, annotationToAdd, annotationToRemove, allowRemove, message); } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java index 212e693994..8e79452aa3 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.java @@ -96,19 +96,8 @@ public class MultiFixMessages extends NLS { public static String CodeFormatFix_description; public static String NullAnnotationsCleanUp_add_nullable_annotation; - public static String NullAnnotationsCleanUp_add_nonnull_annotation; - public static String NullQuickFixes_add_annotation_change_name; - - public static String NullRewriteOperations_change_method_parameter_nullness; - - public static String NullRewriteOperations_change_method_return_nullness; - - public static String NullRewriteOperations_change_overridden_parameter_nullness; - - public static String NullRewriteOperations_change_overridden_return_nullness; - static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, MultiFixMessages.class); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties index 85d52f6235..84a77cd5ea 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/MultiFixMessages.properties @@ -83,9 +83,4 @@ SortMembersCleanUp_Excluding_description=Sort members excluding fields, enum con SortMembersCleanUp_RemoveMarkersWarning0=The file ''{0}'' in project ''{1}'' contains markers which may be removed by Sort Members NullAnnotationsCleanUp_add_nullable_annotation=Add missing @Nullable annotation -NullAnnotationsCleanUp_add_nonnull_annotation=Add missing @NonNull annotation -NullQuickFixes_add_annotation_change_name=Add Annotations -NullRewriteOperations_change_method_parameter_nullness=Change parameter type to ''@{0}'' -NullRewriteOperations_change_method_return_nullness=Change return type of ''{0}(..)'' to ''@{1}'' -NullRewriteOperations_change_overridden_parameter_nullness=Change parameter type in overridden ''{0}(..)'' to ''@{1}'' -NullRewriteOperations_change_overridden_return_nullness=Change return type of overridden ''{0}(..)'' to ''@{1}'' +NullAnnotationsCleanUp_add_nonnull_annotation=Add missing @NonNull annotation
\ No newline at end of file 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 3922086365..fe8072ff9e 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 @@ -23,6 +23,8 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.internal.corext.fix.NullAnnotationsFix; + import org.eclipse.jdt.ui.cleanup.CleanUpRequirements; import org.eclipse.jdt.ui.cleanup.ICleanUpFix; import org.eclipse.jdt.ui.text.java.IProblemLocation; @@ -75,7 +77,7 @@ public class NullAnnotationsCleanUp extends AbstractMultiFix { } locations= filteredLocations.toArray(new IProblemLocation[filteredLocations.size()]); } - return NullQuickFixes.createCleanUp(compilationUnit, locations, this.handledProblemID); + return NullAnnotationsFix.createCleanUp(compilationUnit, locations, this.handledProblemID); } private Map<String, String> getRequiredOptions() { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/NullAnnotationsCorrectionProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/NullAnnotationsCorrectionProcessor.java new file mode 100644 index 0000000000..0694b4b9d2 --- /dev/null +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/NullAnnotationsCorrectionProcessor.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2011, 2012 GK Software AG and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Stephan Herrmann <stephan@cs.tu-berlin.de> - [quick fix] Add quick fixes for null annotations - https://bugs.eclipse.org/337977 + * IBM Corporation - bug fixes + *******************************************************************************/ +package org.eclipse.jdt.internal.ui.text.correction; + +import java.util.Collection; +import java.util.Hashtable; +import java.util.Map; + +import org.eclipse.swt.graphics.Image; + +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.CompilationUnit; + +import org.eclipse.jdt.internal.corext.fix.NullAnnotationsFix; + +import org.eclipse.jdt.ui.text.java.IInvocationContext; +import org.eclipse.jdt.ui.text.java.IProblemLocation; +import org.eclipse.jdt.ui.text.java.correction.ICommandAccess; + +import org.eclipse.jdt.internal.ui.JavaPluginImages; +import org.eclipse.jdt.internal.ui.fix.NullAnnotationsCleanUp; +import org.eclipse.jdt.internal.ui.text.correction.proposals.FixCorrectionProposal; + +/** + * Quick Fixes for null-annotation related problems. + */ +public class NullAnnotationsCorrectionProcessor { + + public static void addReturnAndArgumentTypeProposal(IInvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) { + CompilationUnit astRoot= context.getASTRoot(); + ASTNode selectedNode= problem.getCoveringNode(astRoot); + + boolean isArgumentProblem= NullAnnotationsFix.isComplainingAboutArgument(selectedNode); + if (isArgumentProblem || NullAnnotationsFix.isComplainingAboutReturn(selectedNode)) + addNullAnnotationInSignatureProposal(context, problem, proposals, false, isArgumentProblem); + } + + public static void addNullAnnotationInSignatureProposal(IInvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals, boolean modifyOverridden, + boolean isArgumentProblem) { + NullAnnotationsFix fix= NullAnnotationsFix.createNullAnnotationInSignatureFix(context.getASTRoot(), problem, modifyOverridden, isArgumentProblem); + + if (fix != null) { + Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); + Map<String, String> options= new Hashtable<String, String>(); + if (fix.getCu() != context.getASTRoot()) { + // workaround: adjust the unit to operate on, depending on the findings of RewriteOperations.createAddAnnotationOperation(..) + final CompilationUnit cu= fix.getCu(); + final IInvocationContext originalContext= context; + context= new IInvocationContext() { + public int getSelectionOffset() { + return originalContext.getSelectionOffset(); + } + + public int getSelectionLength() { + return originalContext.getSelectionLength(); + } + + public ASTNode getCoveringNode() { + return originalContext.getCoveringNode(); + } + + public ASTNode getCoveredNode() { + return originalContext.getCoveredNode(); + } + + public ICompilationUnit getCompilationUnit() { + return (ICompilationUnit) cu.getJavaElement(); + } + + public CompilationUnit getASTRoot() { + return cu; + } + }; + } + int relevance= modifyOverridden ? 9 : 10; //raise local change above change in overridden method + FixCorrectionProposal proposal= new FixCorrectionProposal(fix, new NullAnnotationsCleanUp(options, problem.getProblemId()), relevance, image, context); + proposals.add(proposal); + } + } +} diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java index 5d9bee6bf8..223adbb3a9 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java @@ -31,7 +31,6 @@ import org.eclipse.jdt.ui.text.java.IProblemLocation; import org.eclipse.jdt.ui.text.java.IQuickFixProcessor; import org.eclipse.jdt.ui.text.java.correction.ICommandAccess; -import org.eclipse.jdt.internal.ui.fix.NullQuickFixes; import org.eclipse.jdt.internal.ui.text.correction.proposals.ReplaceCorrectionProposal; import org.eclipse.jdt.internal.ui.text.correction.proposals.TaskMarkerProposal; @@ -682,8 +681,8 @@ public class QuickFixProcessor implements IQuickFixProcessor { case IProblem.IllegalReturnNullityRedefinition: case IProblem.IllegalDefinitionToNonNullParameter: case IProblem.IllegalRedefinitionToNonNullParameter: - NullQuickFixes.addNullAnnotationInSignatureProposal(context, problem, proposals, false, true); - NullQuickFixes.addNullAnnotationInSignatureProposal(context, problem, proposals, true, true); + NullAnnotationsCorrectionProcessor.addNullAnnotationInSignatureProposal(context, problem, proposals, false, true); + NullAnnotationsCorrectionProcessor.addNullAnnotationInSignatureProposal(context, problem, proposals, true, true); break; case IProblem.RequiredNonNullButProvidedNull: case IProblem.RequiredNonNullButProvidedPotentialNull: @@ -693,7 +692,7 @@ public class QuickFixProcessor implements IQuickFixProcessor { case IProblem.NonNullLocalVariableComparisonYieldsFalse: case IProblem.RedundantNullCheckOnNonNullLocalVariable: case IProblem.RequiredNonNullButProvidedSpecdNullable: - NullQuickFixes.addReturnAndArgumentTypeProposal(context, problem, proposals); + NullAnnotationsCorrectionProcessor.addReturnAndArgumentTypeProposal(context, problem, proposals); break; default: } |