KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > core > dom > CatchClause


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 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
12 package org.eclipse.jdt.core.dom;
13
14 import java.util.ArrayList JavaDoc;
15 import java.util.List JavaDoc;
16
17 /**
18  * Catch clause AST node type.
19  *
20  * <pre>
21  * CatchClause:
22  * <b>catch</b> <b>(</b> FormalParameter <b>)</b> Block
23  * </pre>
24  *
25  * @since 2.0
26  */

27 public class CatchClause extends ASTNode {
28     
29     /**
30      * The "exception" structural property of this node type.
31      * @since 3.0
32      */

33     public static final ChildPropertyDescriptor EXCEPTION_PROPERTY =
34         new ChildPropertyDescriptor(CatchClause.class, "exception", SingleVariableDeclaration.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
35

36     /**
37      * The "body" structural property of this node type.
38      * @since 3.0
39      */

40     public static final ChildPropertyDescriptor BODY_PROPERTY =
41         new ChildPropertyDescriptor(CatchClause.class, "body", Block.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
42

43     /**
44      * A list of property descriptors (element type:
45      * {@link StructuralPropertyDescriptor}),
46      * or null if uninitialized.
47      */

48     private static final List JavaDoc PROPERTY_DESCRIPTORS;
49     
50     static {
51         List JavaDoc properyList = new ArrayList JavaDoc(3);
52         createPropertyList(CatchClause.class, properyList);
53         addProperty(EXCEPTION_PROPERTY, properyList);
54         addProperty(BODY_PROPERTY, properyList);
55         PROPERTY_DESCRIPTORS = reapPropertyList(properyList);
56     }
57
58     /**
59      * Returns a list of structural property descriptors for this node type.
60      * Clients must not modify the result.
61      *
62      * @param apiLevel the API level; one of the
63      * <code>AST.JLS*</code> constants
64
65      * @return a list of property descriptors (element type:
66      * {@link StructuralPropertyDescriptor})
67      * @since 3.0
68      */

69     public static List JavaDoc propertyDescriptors(int apiLevel) {
70         return PROPERTY_DESCRIPTORS;
71     }
72             
73     /**
74      * The body; lazily initialized; defaults to an empty block.
75      */

76     private Block body = null;
77
78     /**
79      * The exception variable declaration; lazily initialized; defaults to a
80      * unspecified, but legal, variable declaration.
81      */

82     private SingleVariableDeclaration exceptionDecl = null;
83
84     /**
85      * Creates a new AST node for a catch clause owned by the given
86      * AST. By default, the catch clause declares an unspecified, but legal,
87      * exception declaration and has an empty block.
88      * <p>
89      * N.B. This constructor is package-private.
90      * </p>
91      *
92      * @param ast the AST that is to own this node
93      */

94     CatchClause(AST ast) {
95         super(ast);
96     }
97
98     /* (omit javadoc for this method)
99      * Method declared on ASTNode.
100      */

101     final List JavaDoc internalStructuralPropertiesForType(int apiLevel) {
102         return propertyDescriptors(apiLevel);
103     }
104     
105     /* (omit javadoc for this method)
106      * Method declared on ASTNode.
107      */

108     final ASTNode internalGetSetChildProperty(ChildPropertyDescriptor property, boolean get, ASTNode child) {
109         if (property == EXCEPTION_PROPERTY) {
110             if (get) {
111                 return getException();
112             } else {
113                 setException((SingleVariableDeclaration) child);
114                 return null;
115             }
116         }
117         if (property == BODY_PROPERTY) {
118             if (get) {
119                 return getBody();
120             } else {
121                 setBody((Block) child);
122                 return null;
123             }
124         }
125         // allow default implementation to flag the error
126
return super.internalGetSetChildProperty(property, get, child);
127     }
128     
129     /* (omit javadoc for this method)
130      * Method declared on ASTNode.
131      */

132     final int getNodeType0() {
133         return CATCH_CLAUSE;
134     }
135
136     /* (omit javadoc for this method)
137      * Method declared on ASTNode.
138      */

139     ASTNode clone0(AST target) {
140         CatchClause result = new CatchClause(target);
141         result.setSourceRange(this.getStartPosition(), this.getLength());
142         result.setBody((Block) getBody().clone(target));
143         result.setException(
144             (SingleVariableDeclaration) ASTNode.copySubtree(target, getException()));
145         return result;
146     }
147
148     /* (omit javadoc for this method)
149      * Method declared on ASTNode.
150      */

151     final boolean subtreeMatch0(ASTMatcher matcher, Object JavaDoc other) {
152         // dispatch to correct overloaded match method
153
return matcher.match(this, other);
154     }
155
156     /* (omit javadoc for this method)
157      * Method declared on ASTNode.
158      */

159     void accept0(ASTVisitor visitor) {
160         boolean visitChildren = visitor.visit(this);
161         if (visitChildren) {
162             // visit children in normal left to right reading order
163
acceptChild(visitor, getException());
164             acceptChild(visitor, getBody());
165         }
166         visitor.endVisit(this);
167     }
168     
169     /**
170      * Returns the exception variable declaration of this catch clause.
171      *
172      * @return the exception variable declaration node
173      */

174     public SingleVariableDeclaration getException() {
175         if (this.exceptionDecl == null) {
176             // lazy init must be thread-safe for readers
177
synchronized (this) {
178                 if (this.exceptionDecl == null) {
179                     preLazyInit();
180                     this.exceptionDecl = new SingleVariableDeclaration(this.ast);
181                     postLazyInit(this.exceptionDecl, EXCEPTION_PROPERTY);
182                 }
183             }
184         }
185         return this.exceptionDecl;
186     }
187         
188     /**
189      * Sets the variable declaration of this catch clause.
190      *
191      * @param exception the exception variable declaration node
192      * @exception IllegalArgumentException if:
193      * <ul>
194      * <li>the node belongs to a different AST</li>
195      * <li>the node already has a parent</li>
196      * <li>a cycle in would be created</li>
197      * </ul>
198      */

199     public void setException(SingleVariableDeclaration exception) {
200         if (exception == null) {
201             throw new IllegalArgumentException JavaDoc();
202         }
203         ASTNode oldChild = this.exceptionDecl;
204         preReplaceChild(oldChild, exception, EXCEPTION_PROPERTY);
205         this.exceptionDecl= exception;
206         postReplaceChild(oldChild, exception, EXCEPTION_PROPERTY);
207     }
208     
209     /**
210      * Returns the body of this catch clause.
211      *
212      * @return the catch clause body
213      */

214     public Block getBody() {
215         if (this.body == null) {
216             // lazy init must be thread-safe for readers
217
synchronized (this) {
218                 if (this.body == null) {
219                     preLazyInit();
220                     this.body = new Block(this.ast);
221                     postLazyInit(this.body, BODY_PROPERTY);
222                 }
223             }
224         }
225         return this.body;
226     }
227     
228     /**
229      * Sets the body of this catch clause.
230      *
231      * @param body the catch clause block node
232      * @exception IllegalArgumentException if:
233      * <ul>
234      * <li>the node belongs to a different AST</li>
235      * <li>the node already has a parent</li>
236      * <li>a cycle in would be created</li>
237      * </ul>
238      */

239     public void setBody(Block body) {
240         if (body == null) {
241             throw new IllegalArgumentException JavaDoc();
242         }
243         ASTNode oldChild = this.body;
244         preReplaceChild(oldChild, body, BODY_PROPERTY);
245         this.body = body;
246         postReplaceChild(oldChild, body, BODY_PROPERTY);
247     }
248
249     /* (omit javadoc for this method)
250      * Method declared on ASTNode.
251      */

252     int memSize() {
253         // treat Code as free
254
return BASE_NODE_SIZE + 2 * 4;
255     }
256     
257     /* (omit javadoc for this method)
258      * Method declared on ASTNode.
259      */

260     int treeSize() {
261         return
262             memSize()
263             + (this.exceptionDecl == null ? 0 : getException().treeSize())
264             + (this.body == null ? 0 : getBody().treeSize());
265     }
266 }
267
Popular Tags