Bug 384513 - [quick fix] Create method in supertype should add @Override
- Add @Override rewrite to source method
Change-Id: I7bd33c923c9922f6340a41af6852dd6330c01c8d
Signed-off-by: Kenneth Styrberg <kenneth@kean.nu>
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java
index 98c0dae..0d51989 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewDefiningMethodProposal.java
@@ -16,13 +16,26 @@
import java.util.List;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.TextEdit;
import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+
+import org.eclipse.ui.IEditorPart;
+
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.AST;
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.IExtendedModifier;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
@@ -37,9 +50,12 @@
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation;
+import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration;
import org.eclipse.jdt.internal.core.manipulation.StubUtility;
+import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving;
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
+import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
@@ -47,6 +63,7 @@
public class NewDefiningMethodProposal extends AbstractMethodCorrectionProposal {
private final IMethodBinding fMethod;
+
private final String[] fParamNames;
public NewDefiningMethodProposal(String label, ICompilationUnit targetCU, ASTNode invocationNode, ITypeBinding binding, IMethodBinding method, String[] paramNames, int relevance) {
@@ -64,6 +81,43 @@
}
@Override
+ protected void performChange(IEditorPart part, IDocument document) throws CoreException {
+ addOverrideAnnotation(document);
+ super.performChange(part, document);
+ }
+
+ private void addOverrideAnnotation(IDocument document) throws CoreException {
+ MethodDeclaration oldMethodDeclaration= (MethodDeclaration) ASTNodes.findDeclaration(fMethod, getInvocationNode());
+ CompilationUnit findParentCompilationUnit= ASTResolving.findParentCompilationUnit(oldMethodDeclaration);
+ IJavaProject javaProject= findParentCompilationUnit.getJavaElement().getJavaProject();
+ String version= javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
+ if (JavaModelUtil.isVersionLessThan(version, JavaCore.VERSION_1_5)) {
+ return;
+ }
+ IType type= javaProject.findType(fMethod.getDeclaringClass().getQualifiedName());
+ ICompilationUnit compilationUnit= type.getCompilationUnit();
+ ImportRewrite importRewrite= CodeStyleConfiguration.createImportRewrite(compilationUnit, true);
+
+ AST ast= oldMethodDeclaration.getAST();
+ ASTRewrite astRewrite= ASTRewrite.create(ast);
+ Annotation marker= ast.newMarkerAnnotation();
+ marker.setTypeName(ast.newName(importRewrite.addImport("java.lang.Override", null))); //$NON-NLS-1$
+ astRewrite.getListRewrite(oldMethodDeclaration, MethodDeclaration.MODIFIERS2_PROPERTY).insertFirst(marker, null);
+
+ try {
+ TextEdit importEdits= importRewrite.rewriteImports(new NullProgressMonitor());
+ TextEdit edits= astRewrite.rewriteAST();
+ importEdits.addChild(edits);
+
+ importEdits.apply(document);
+ compilationUnit.getBuffer().setContents(document.get());
+ compilationUnit.save(new NullProgressMonitor(), true);
+ } catch (MalformedTreeException | BadLocationException e) {
+ JavaPlugin.log(e);
+ }
+ }
+
+ @Override
protected void addNewParameters(ASTRewrite rewrite, List<String> takenNames, List<SingleVariableDeclaration> params, ImportRewriteContext context) throws CoreException {
AST ast= rewrite.getAST();
ImportRewrite importRewrite= getImportRewrite();