145bd1aca514c302176d01f7de7568ff32dc80c7
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / core / dom / CastExpression.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2008 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 net.sourceforge.phpdt.core.dom;
13
14 import java.util.ArrayList;
15 import java.util.List;
16
17 /**
18  * Cast expression AST node type.
19  *
20  * <pre>
21  * CastExpression:
22  *    <b>(</b> Type <b>)</b> Expression 
23  * </pre>
24  * 
25  * @since 2.0
26  * @noinstantiate This class is not intended to be instantiated by clients.
27  */
28 public class CastExpression extends Expression {
29
30         /**
31          * The "type" structural property of this node type.
32          * @since 3.0
33          */
34         public static final ChildPropertyDescriptor TYPE_PROPERTY = 
35                 new ChildPropertyDescriptor(CastExpression.class, "type", Type.class, MANDATORY, NO_CYCLE_RISK); //$NON-NLS-1$
36
37         /**
38          * The "expression" structural property of this node type.
39          * @since 3.0
40          */
41         public static final ChildPropertyDescriptor EXPRESSION_PROPERTY = 
42                 new ChildPropertyDescriptor(CastExpression.class, "expression", Expression.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
43
44         /**
45          * A list of property descriptors (element type: 
46          * {@link StructuralPropertyDescriptor}),
47          * or null if uninitialized.
48          */
49         private static final List PROPERTY_DESCRIPTORS;
50         
51         static {
52                 List properyList = new ArrayList(3);
53                 createPropertyList(CastExpression.class, properyList);
54                 addProperty(TYPE_PROPERTY, properyList);
55                 addProperty(EXPRESSION_PROPERTY, properyList);
56                 PROPERTY_DESCRIPTORS = reapPropertyList(properyList);
57         }
58
59         /**
60          * Returns a list of structural property descriptors for this node type.
61          * Clients must not modify the result.
62          * 
63          * @param apiLevel the API level; one of the
64          * <code>AST.JLS*</code> constants
65          * @return a list of property descriptors (element type: 
66          * {@link StructuralPropertyDescriptor})
67          * @since 3.0
68          */
69         public static List propertyDescriptors(int apiLevel) {
70                 return PROPERTY_DESCRIPTORS;
71         }
72                         
73         /**
74          * The type; lazily initialized; defaults to a unspecified,
75          * legal type.
76          */
77         private Type type = null;
78
79         /**
80          * The expression; lazily initialized; defaults to a unspecified, but legal,
81          * expression.
82          */
83         private Expression expression = null;
84
85         /**
86          * Creates a new AST node for a cast expression owned by the given 
87          * AST. By default, the type and expression are unspecified (but legal).
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         CastExpression(AST ast) {
95                 super(ast);
96         }
97
98         /* (omit javadoc for this method)
99          * Method declared on ASTNode.
100          */
101         final List 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 == EXPRESSION_PROPERTY) {
110                         if (get) {
111                                 return getExpression();
112                         } else {
113                                 setExpression((Expression) child);
114                                 return null;
115                         }
116                 }
117                 if (property == TYPE_PROPERTY) {
118                         if (get) {
119                                 return getType();
120                         } else {
121                                 setType((Type) 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 CAST_EXPRESSION;
134         }
135
136         /* (omit javadoc for this method)
137          * Method declared on ASTNode.
138          */
139         ASTNode clone0(AST target) {
140                 CastExpression result = new CastExpression(target);
141                 result.setSourceRange(this.getStartPosition(), this.getLength());
142                 result.setType((Type) getType().clone(target));
143                 result.setExpression((Expression) getExpression().clone(target));
144                 return result;
145         }
146
147         /* (omit javadoc for this method)
148          * Method declared on ASTNode.
149          */
150         final boolean subtreeMatch0(ASTMatcher matcher, Object other) {
151                 // dispatch to correct overloaded match method
152                 return matcher.match(this, other);
153         }
154
155         /* (omit javadoc for this method)
156          * Method declared on ASTNode.
157          */
158         void accept0(ASTVisitor visitor) {
159                 boolean visitChildren = visitor.visit(this);
160                 if (visitChildren) {
161                         // visit children in normal left to right reading order
162                         acceptChild(visitor, getType());
163                         acceptChild(visitor, getExpression());
164                 }
165                 visitor.endVisit(this);
166         }
167         
168         /**
169          * Returns the type in this cast expression.
170          * 
171          * @return the type
172          */ 
173         public Type getType() {
174                 if (this.type == null) {
175                         // lazy init must be thread-safe for readers
176                         synchronized (this) {
177                                 if (this.type == null) {
178                                         preLazyInit();
179                                         this.type = this.ast.newPrimitiveType(PrimitiveType.INT);
180                                         postLazyInit(this.type, TYPE_PROPERTY);
181                                 }
182                         }
183                 }
184                 return this.type;
185         }
186
187         /**
188          * Sets the type in this cast expression to the given type.
189          * 
190          * @param type the new type
191          * @exception IllegalArgumentException if:
192          * <ul>
193          * <li>the node belongs to a different AST</li>
194          * <li>the node already has a parent</li>
195          * </ul>
196          */ 
197         public void setType(Type type) {
198                 if (type == null) {
199                         throw new IllegalArgumentException();
200                 }
201                 ASTNode oldChild = this.type;
202                 preReplaceChild(oldChild, type, TYPE_PROPERTY);
203                 this.type = type;
204                 postReplaceChild(oldChild, type, TYPE_PROPERTY);
205         }
206         
207         /**
208          * Returns the expression of this cast expression.
209          * 
210          * @return the expression node
211          */ 
212         public Expression getExpression() {
213                 if (this.expression == null) {
214                         // lazy init must be thread-safe for readers
215                         synchronized (this) {
216                                 if (this.expression == null) {
217                                         preLazyInit();
218                                         this.expression = new SimpleName(this.ast);
219                                         postLazyInit(this.expression, EXPRESSION_PROPERTY);
220                                 }
221                         }
222                 }
223                 return this.expression;
224         }
225                 
226         /**
227          * Sets the expression of this cast expression.
228          * 
229          * @param expression the new expression node
230          * @exception IllegalArgumentException if:
231          * <ul>
232          * <li>the node belongs to a different AST</li>
233          * <li>the node already has a parent</li>
234          * <li>a cycle in would be created</li>
235          * </ul>
236          */ 
237         public void setExpression(Expression expression) {
238                 if (expression == null) {
239                         throw new IllegalArgumentException();
240                 }
241                 ASTNode oldChild = this.expression;
242                 preReplaceChild(oldChild, expression, EXPRESSION_PROPERTY);
243                 this.expression = expression;
244                 postReplaceChild(oldChild, expression, EXPRESSION_PROPERTY);
245         }
246
247         /* (omit javadoc for this method)
248          * Method declared on ASTNode.
249          */
250         int memSize() {
251                 // treat Code as free
252                 return BASE_NODE_SIZE + 2 * 4;
253         }
254         
255         /* (omit javadoc for this method)
256          * Method declared on ASTNode.
257          */
258         int treeSize() {
259                 return 
260                         memSize()
261                         + (this.expression == null ? 0 : getExpression().treeSize())
262                         + (this.type == null ? 0 : getType().treeSize());
263         }
264 }