KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > refactoring > reorg > ASTNodeDeleteUtil


1 /*******************************************************************************
2  * Copyright (c) 2000, 2005 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.corext.refactoring.reorg;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.HashSet JavaDoc;
15 import java.util.Iterator JavaDoc;
16 import java.util.List JavaDoc;
17 import java.util.Set JavaDoc;
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         // fields are different because you don't delete the whole declaration but only a fragment of it
41
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                 // we have to delete the TypeDeclarationStatement
62
nodes[0]= nodes[0].getParent();
63                 return nodes;
64             }
65         }
66         return ASTNodeSearchUtil.getDeclarationNodes(element, cuNode);
67     }
68
69     private static Set JavaDoc getRemovedNodes(final List JavaDoc removed, final CompilationUnitRewrite rewrite) {
70         final Set JavaDoc result= new HashSet JavaDoc();
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 JavaDoc removed= new ArrayList JavaDoc();
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 JavaDoc 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 JavaDoc removed, final CompilationUnitRewrite rewrite, final TextEditGroup group) {
103         Set JavaDoc removedNodes= getRemovedNodes(removed, rewrite);
104         for (Iterator JavaDoc 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