blob: ae20733ffe0b5ca55944858db81ff68601c4576b [file] [log] [blame]
/*******************************************************************************
* 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());
}
}