001: /*******************************************************************************
002: * Copyright (c) 2000, 2005 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.corext.refactoring.reorg;
011:
012: import java.util.ArrayList;
013: import java.util.HashSet;
014: import java.util.Iterator;
015: import java.util.List;
016: import java.util.Set;
017:
018: import org.eclipse.text.edits.TextEditGroup;
019:
020: import org.eclipse.jdt.core.IField;
021: import org.eclipse.jdt.core.IJavaElement;
022: import org.eclipse.jdt.core.ISourceRange;
023: import org.eclipse.jdt.core.IType;
024: import org.eclipse.jdt.core.JavaModelException;
025: import org.eclipse.jdt.core.dom.ASTNode;
026: import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
027: import org.eclipse.jdt.core.dom.CompilationUnit;
028: import org.eclipse.jdt.core.dom.FieldDeclaration;
029: import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
030:
031: import org.eclipse.jdt.internal.corext.dom.GenericVisitor;
032: import org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil;
033: import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite;
034: import org.eclipse.jdt.internal.corext.util.JdtFlags;
035:
036: public class ASTNodeDeleteUtil {
037:
038: private static ASTNode[] getNodesToDelete(IJavaElement element,
039: CompilationUnit cuNode) throws JavaModelException {
040: // fields are different because you don't delete the whole declaration but only a fragment of it
041: if (element.getElementType() == IJavaElement.FIELD) {
042: if (JdtFlags.isEnum((IField) element))
043: return new ASTNode[] { ASTNodeSearchUtil
044: .getEnumConstantDeclaration((IField) element,
045: cuNode) };
046: else
047: return new ASTNode[] { ASTNodeSearchUtil
048: .getFieldDeclarationFragmentNode(
049: (IField) element, cuNode) };
050: }
051: if (element.getElementType() == IJavaElement.TYPE
052: && ((IType) element).isLocal()) {
053: IType type = (IType) element;
054: if (type.isAnonymous()) {
055: if (type.getParent().getElementType() == IJavaElement.FIELD) {
056: final ISourceRange range = type.getSourceRange();
057: if (range != null) {
058: final ASTNode node = ASTNodeSearchUtil
059: .getAstNode(cuNode, range.getOffset(),
060: range.getLength());
061: if (node instanceof AnonymousClassDeclaration)
062: return new ASTNode[] { node };
063: }
064: }
065: return new ASTNode[] { ASTNodeSearchUtil
066: .getClassInstanceCreationNode(type, cuNode) };
067: } else {
068: ASTNode[] nodes = ASTNodeSearchUtil
069: .getDeclarationNodes(element, cuNode);
070: // we have to delete the TypeDeclarationStatement
071: nodes[0] = nodes[0].getParent();
072: return nodes;
073: }
074: }
075: return ASTNodeSearchUtil.getDeclarationNodes(element, cuNode);
076: }
077:
078: private static Set getRemovedNodes(final List removed,
079: final CompilationUnitRewrite rewrite) {
080: final Set result = new HashSet();
081: rewrite.getRoot().accept(new GenericVisitor(true) {
082:
083: protected boolean visitNode(ASTNode node) {
084: if (removed.contains(node))
085: result.add(node);
086: return true;
087: }
088: });
089: return result;
090: }
091:
092: public static void markAsDeleted(IJavaElement[] javaElements,
093: CompilationUnitRewrite rewrite, TextEditGroup group)
094: throws JavaModelException {
095: final List removed = new ArrayList();
096: for (int i = 0; i < javaElements.length; i++) {
097: markAsDeleted(removed, javaElements[i], rewrite, group);
098: }
099: propagateFieldDeclarationNodeDeletions(removed, rewrite, group);
100: }
101:
102: private static void markAsDeleted(List list, IJavaElement element,
103: CompilationUnitRewrite rewrite, TextEditGroup group)
104: throws JavaModelException {
105: ASTNode[] declarationNodes = getNodesToDelete(element, rewrite
106: .getRoot());
107: for (int i = 0; i < declarationNodes.length; i++) {
108: ASTNode node = declarationNodes[i];
109: if (node != null) {
110: list.add(node);
111: rewrite.getASTRewrite().remove(node, group);
112: rewrite.getImportRemover().registerRemovedNode(node);
113: }
114: }
115: }
116:
117: private static void propagateFieldDeclarationNodeDeletions(
118: final List removed, final CompilationUnitRewrite rewrite,
119: final TextEditGroup group) {
120: Set removedNodes = getRemovedNodes(removed, rewrite);
121: for (Iterator iter = removedNodes.iterator(); iter.hasNext();) {
122: ASTNode node = (ASTNode) iter.next();
123: if (node instanceof VariableDeclarationFragment) {
124: if (node.getParent() instanceof FieldDeclaration) {
125: FieldDeclaration fd = (FieldDeclaration) node
126: .getParent();
127: if (!removed.contains(fd)
128: && removedNodes.containsAll(fd.fragments()))
129: rewrite.getASTRewrite().remove(fd, group);
130: rewrite.getImportRemover().registerRemovedNode(fd);
131: }
132: }
133: }
134: }
135:
136: private ASTNodeDeleteUtil() {
137: }
138: }
|