/******************************************************************************* | |
* Copyright (c) 2009 Shane Clarke. | |
* 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: | |
* Shane Clarke - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.jst.ws.internal.jaxws.ui.annotations.correction; | |
import java.util.List; | |
import java.util.ListIterator; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.jdt.core.dom.AST; | |
import org.eclipse.jdt.core.dom.ASTNode; | |
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; | |
import org.eclipse.jdt.core.dom.Block; | |
import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor; | |
import org.eclipse.jdt.core.dom.CompilationUnit; | |
import org.eclipse.jdt.core.dom.ITypeBinding; | |
import org.eclipse.jdt.core.dom.MethodDeclaration; | |
import org.eclipse.jdt.core.dom.Modifier; | |
import org.eclipse.jdt.core.dom.SimpleName; | |
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; | |
import org.eclipse.jdt.core.dom.rewrite.ListRewrite; | |
import org.eclipse.jdt.ui.CodeGeneration; | |
import org.eclipse.jdt.ui.text.java.IInvocationContext; | |
import org.eclipse.ltk.core.refactoring.TextFileChange; | |
import org.eclipse.swt.graphics.Image; | |
public class NewDefaultConstructorCorrectionProposal extends AbstractJavaCorrectionPropsoal { | |
private ITypeBinding typeBinding; | |
public NewDefaultConstructorCorrectionProposal( | |
IInvocationContext invocationContext, ITypeBinding typeBinding, String displayString, | |
int relevance, Image image) { | |
super(invocationContext, displayString, relevance, image); | |
this.typeBinding = typeBinding; | |
} | |
@Override | |
@SuppressWarnings("unchecked") | |
public void addEdits(TextFileChange textChange) throws CoreException { | |
CompilationUnit astRoot = invocationContext.getASTRoot(); | |
AST ast = astRoot.getAST(); | |
ASTRewrite rewriter = ASTRewrite.create(ast); | |
ASTNode typeDeclaration = astRoot.findDeclaringNode(typeBinding); | |
MethodDeclaration methodDeclaration = ast.newMethodDeclaration(); | |
SimpleName newNameNode = ast.newSimpleName(typeBinding.getName()); | |
methodDeclaration.setConstructor(true); | |
methodDeclaration.modifiers().addAll(ast.newModifiers(Modifier.PUBLIC)); | |
methodDeclaration.setName(newNameNode); | |
Block body = ast.newBlock(); | |
String placeHolder = CodeGeneration.getMethodBodyContent(invocationContext.getCompilationUnit(), | |
typeBinding.getName(), newNameNode.getIdentifier(), true, "", String.valueOf('\n')); | |
if (placeHolder != null) { | |
ASTNode todoNode = rewriter.createStringPlaceholder(placeHolder, ASTNode.RETURN_STATEMENT); | |
body.statements().add(todoNode); | |
} | |
methodDeclaration.setBody(body); | |
ChildListPropertyDescriptor property = ((AbstractTypeDeclaration) typeDeclaration).getBodyDeclarationsProperty(); | |
List<ASTNode> members = (List<ASTNode>) typeDeclaration.getStructuralProperty(property); | |
ListIterator<ASTNode> membersIterator = members.listIterator(); | |
int insertAt = 0; | |
while (membersIterator.hasPrevious()) { | |
ASTNode astNode = (ASTNode) membersIterator.previous(); | |
if (astNode instanceof MethodDeclaration && ((MethodDeclaration) astNode).isConstructor()) { | |
insertAt = membersIterator.previousIndex() + 1; | |
} | |
} | |
ListRewrite listRewriter= rewriter.getListRewrite(typeDeclaration, property); | |
listRewriter.insertAt(methodDeclaration, insertAt, null); | |
textChange.addEdit(rewriter.rewriteAST()); | |
} | |
} |