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