package org.eclipse.jdt.internal.corext.dom;
import java.util.List;
import org.eclipse.text.edits.TextEditGroup;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
import org.eclipse.jdt.internal.core.manipulation.JavaManipulationPlugin;
import org.eclipse.jdt.internal.core.manipulation.MembersOrderPreferenceCacheCommon;
public class BodyDeclarationRewrite {
private ASTNode fTypeNode;
private ListRewrite fListRewrite;
public static BodyDeclarationRewrite create(ASTRewrite rewrite, ASTNode typeNode) {
return new BodyDeclarationRewrite(rewrite, typeNode);
}
private BodyDeclarationRewrite(ASTRewrite rewrite, ASTNode typeNode) {
ChildListPropertyDescriptor property= ASTNodes.getBodyDeclarationsProperty(typeNode);
fTypeNode= typeNode;
fListRewrite= rewrite.getListRewrite(typeNode, property);
}
public void insert(BodyDeclaration decl, TextEditGroup description) {
List<BodyDeclaration> container= ASTNodes.getBodyDeclarations(fTypeNode);
int index= getInsertionIndex(decl, container);
fListRewrite.insertAt(decl, index, description);
}
public static int getInsertionIndex(BodyDeclaration member, List<? extends BodyDeclaration> container) {
int containerSize= container.size();
MembersOrderPreferenceCacheCommon orderStore= JavaManipulationPlugin.getDefault().getMembersOrderPreferenceCacheCommon();
int orderIndex= getOrderPreference(member, orderStore);
int insertPos= containerSize;
int insertPosOrderIndex= -1;
for (int i= containerSize - 1; i >= 0; i--) {
int currOrderIndex= getOrderPreference(container.get(i), orderStore);
if (orderIndex == currOrderIndex) {
if (insertPosOrderIndex != orderIndex) {
insertPos= i + 1;
insertPosOrderIndex= orderIndex;
}
} else if (insertPosOrderIndex != orderIndex) {
if (currOrderIndex < orderIndex) {
if (insertPosOrderIndex == -1) {
insertPos= i + 1;
insertPosOrderIndex= currOrderIndex;
}
} else {
insertPos= i;
insertPosOrderIndex= currOrderIndex;
}
}
}
return insertPos;
}
private static int getOrderPreference(BodyDeclaration member, MembersOrderPreferenceCacheCommon store) {
int memberType= member.getNodeType();
int modifiers= member.getModifiers();
switch (memberType) {
case ASTNode.TYPE_DECLARATION:
case ASTNode.ENUM_DECLARATION :
case ASTNode.ANNOTATION_TYPE_DECLARATION :
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.TYPE_INDEX) * 2;
case ASTNode.FIELD_DECLARATION:
if (Modifier.isStatic(modifiers)) {
int index= store.getCategoryIndex(MembersOrderPreferenceCacheCommon.STATIC_FIELDS_INDEX) * 2;
if (Modifier.isFinal(modifiers)) {
return index;
}
return index + 1;
}
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.FIELDS_INDEX) * 2;
case ASTNode.INITIALIZER:
if (Modifier.isStatic(modifiers)) {
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.STATIC_INIT_INDEX) * 2;
}
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.INIT_INDEX) * 2;
case ASTNode.ANNOTATION_TYPE_MEMBER_DECLARATION:
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.METHOD_INDEX) * 2;
case ASTNode.METHOD_DECLARATION:
if (Modifier.isStatic(modifiers)) {
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.STATIC_METHODS_INDEX) * 2;
}
if (((MethodDeclaration) member).isConstructor()) {
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.CONSTRUCTORS_INDEX) * 2;
}
return store.getCategoryIndex(MembersOrderPreferenceCacheCommon.METHOD_INDEX) * 2;
default:
return 100;
}
}
}