1 11 package org.eclipse.jdt.internal.corext.refactoring.reorg; 12 13 import java.util.ArrayList ; 14 import java.util.HashSet ; 15 import java.util.Iterator ; 16 import java.util.List ; 17 import java.util.Set ; 18 19 import org.eclipse.text.edits.TextEditGroup; 20 21 import org.eclipse.jdt.core.IField; 22 import org.eclipse.jdt.core.IJavaElement; 23 import org.eclipse.jdt.core.ISourceRange; 24 import org.eclipse.jdt.core.IType; 25 import org.eclipse.jdt.core.JavaModelException; 26 import org.eclipse.jdt.core.dom.ASTNode; 27 import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; 28 import org.eclipse.jdt.core.dom.CompilationUnit; 29 import org.eclipse.jdt.core.dom.FieldDeclaration; 30 import org.eclipse.jdt.core.dom.VariableDeclarationFragment; 31 32 import org.eclipse.jdt.internal.corext.dom.GenericVisitor; 33 import org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil; 34 import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite; 35 import org.eclipse.jdt.internal.corext.util.JdtFlags; 36 37 public class ASTNodeDeleteUtil { 38 39 private static ASTNode[] getNodesToDelete(IJavaElement element, CompilationUnit cuNode) throws JavaModelException { 40 if (element.getElementType() == IJavaElement.FIELD) { 42 if (JdtFlags.isEnum((IField) element)) 43 return new ASTNode[] { ASTNodeSearchUtil.getEnumConstantDeclaration((IField) element, cuNode)}; 44 else 45 return new ASTNode[] { ASTNodeSearchUtil.getFieldDeclarationFragmentNode((IField) element, cuNode)}; 46 } 47 if (element.getElementType() == IJavaElement.TYPE && ((IType) element).isLocal()) { 48 IType type= (IType) element; 49 if (type.isAnonymous()) { 50 if (type.getParent().getElementType() == IJavaElement.FIELD) { 51 final ISourceRange range= type.getSourceRange(); 52 if (range != null) { 53 final ASTNode node= ASTNodeSearchUtil.getAstNode(cuNode, range.getOffset(), range.getLength()); 54 if (node instanceof AnonymousClassDeclaration) 55 return new ASTNode[] { node}; 56 } 57 } 58 return new ASTNode[] { ASTNodeSearchUtil.getClassInstanceCreationNode(type, cuNode)}; 59 } else { 60 ASTNode[] nodes= ASTNodeSearchUtil.getDeclarationNodes(element, cuNode); 61 nodes[0]= nodes[0].getParent(); 63 return nodes; 64 } 65 } 66 return ASTNodeSearchUtil.getDeclarationNodes(element, cuNode); 67 } 68 69 private static Set getRemovedNodes(final List removed, final CompilationUnitRewrite rewrite) { 70 final Set result= new HashSet (); 71 rewrite.getRoot().accept(new GenericVisitor(true) { 72 73 protected boolean visitNode(ASTNode node) { 74 if (removed.contains(node)) 75 result.add(node); 76 return true; 77 } 78 }); 79 return result; 80 } 81 82 public static void markAsDeleted(IJavaElement[] javaElements, CompilationUnitRewrite rewrite, TextEditGroup group) throws JavaModelException { 83 final List removed= new ArrayList (); 84 for (int i= 0; i < javaElements.length; i++) { 85 markAsDeleted(removed, javaElements[i], rewrite, group); 86 } 87 propagateFieldDeclarationNodeDeletions(removed, rewrite, group); 88 } 89 90 private static void markAsDeleted(List list, IJavaElement element, CompilationUnitRewrite rewrite, TextEditGroup group) throws JavaModelException { 91 ASTNode[] declarationNodes= getNodesToDelete(element, rewrite.getRoot()); 92 for (int i= 0; i < declarationNodes.length; i++) { 93 ASTNode node= declarationNodes[i]; 94 if (node != null) { 95 list.add(node); 96 rewrite.getASTRewrite().remove(node, group); 97 rewrite.getImportRemover().registerRemovedNode(node); 98 } 99 } 100 } 101 102 private static void propagateFieldDeclarationNodeDeletions(final List removed, final CompilationUnitRewrite rewrite, final TextEditGroup group) { 103 Set removedNodes= getRemovedNodes(removed, rewrite); 104 for (Iterator iter= removedNodes.iterator(); iter.hasNext();) { 105 ASTNode node= (ASTNode) iter.next(); 106 if (node instanceof VariableDeclarationFragment) { 107 if (node.getParent() instanceof FieldDeclaration) { 108 FieldDeclaration fd= (FieldDeclaration) node.getParent(); 109 if (!removed.contains(fd) && removedNodes.containsAll(fd.fragments())) 110 rewrite.getASTRewrite().remove(fd, group); 111 rewrite.getImportRemover().registerRemovedNode(fd); 112 } 113 } 114 } 115 } 116 117 private ASTNodeDeleteUtil() { 118 } 119 } 120 | Popular Tags |