package com.farata.cleardatabuilder.extjs.validation.correction.proposals;
import java.util.*;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.*;
import org.eclipse.jdt.core.dom.rewrite.*;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.text.correction.CorrectionMessages;
import org.eclipse.jdt.internal.ui.text.correction.proposals.MissingAnnotationAttributesProposal;
import org.eclipse.text.edits.TextEdit;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.jface.text.contentassist.ICompletionProposal ;
// Referenced classes of package org.eclipse.jdt.internal.ui.text.correction.proposals:
// LinkedCorrectionProposal
public class AddTransferInfoProposal extends
MissingAnnotationAttributesProposal {
public AddTransferInfoProposal(ICompilationUnit cu, Annotation annotation,
int relevance) {
super(cu, annotation, relevance);
fAnnotation = annotation;
}
protected ASTRewrite getRewrite() throws CoreException {
AST ast = fAnnotation.getAST();
ASTRewrite rewrite = ASTRewrite.create(ast);
createImportRewrite((CompilationUnit) fAnnotation.getRoot());
ListRewrite listRewrite;
if (fAnnotation instanceof NormalAnnotation) {
listRewrite = rewrite.getListRewrite(fAnnotation,
NormalAnnotation.VALUES_PROPERTY);
} else {
NormalAnnotation newAnnotation = ast.newNormalAnnotation();
newAnnotation.setTypeName((Name) rewrite
.createMoveTarget(fAnnotation.getTypeName()));
rewrite.replace(fAnnotation, newAnnotation, null);
listRewrite = rewrite.getListRewrite(newAnnotation,
NormalAnnotation.VALUES_PROPERTY);
}
addMissingAtributes(fAnnotation.resolveTypeBinding(), listRewrite);
return rewrite;
}
private void addMissingAtributes(ITypeBinding binding,
ListRewrite listRewriter) {
Set implementedAttribs = new HashSet();
if (fAnnotation instanceof NormalAnnotation) {
List list = ((NormalAnnotation) fAnnotation).values();
for (int i = 0; i < list.size(); i++) {
MemberValuePair curr = (MemberValuePair) list.get(i);
implementedAttribs.add(curr.getName().getIdentifier());
}
} else if (fAnnotation instanceof SingleMemberAnnotation) {
implementedAttribs.add("value");
}
ASTRewrite rewriter = listRewriter.getASTRewrite();
AST ast = rewriter.getAST();
IMethodBinding declaredMethods[] = binding.getDeclaredMethods();
for (int i = 0; i < declaredMethods.length; i++) {
IMethodBinding curr = declaredMethods[i];
if (!implementedAttribs.contains(curr.getName()) && curr.getName().equals("transferInfo")) {
MemberValuePair pair = ast.newMemberValuePair();
pair.setName(ast.newSimpleName(curr.getName()));
pair.setValue(newDefaultExpression(ast, curr.getReturnType()));
listRewriter.insertLast(pair, null);
addLinkedPosition(rewriter.track(pair.getName()), false,
"val_name_" + i);
addLinkedPosition(rewriter.track(pair.getValue()), false,
"val_type_" + i);
}
}
}
private Expression newDefaultExpression(AST ast, ITypeBinding type) {
if (type.isPrimitive()) {
String name = type.getName();
if ("boolean".equals(name))
return ast.newBooleanLiteral(false);
else
return ast.newNumberLiteral("0");
}
if (type == ast.resolveWellKnownType("java.lang.String"))
return ast.newStringLiteral();
if (type.isArray()) {
ArrayInitializer initializer = ast.newArrayInitializer();
initializer.expressions().add(
newDefaultExpression(ast, type.getElementType()));
return initializer;
}
if (type.isAnnotation()) {
MarkerAnnotation annotation = ast.newMarkerAnnotation();
annotation.setTypeName(ast.newName(getImportRewrite().addImport(
type)));
return annotation;
} else {
return ast.newNullLiteral();
}
}
private Annotation fAnnotation;
}