e5f817828ce07df1637810907cf53d4bda4f8698
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / core / dom / ExpressionStatement.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  * Expression statement AST node type.
19  * <p>
20  * This kind of node is used to convert an expression (<code>Expression</code>)
21  * into a statement (<code>Statement</code>) by wrapping it.
22  * </p>
23  * <pre>
24  * ExpressionStatement:
25  *    StatementExpression <b>;</b>
26  * </pre>
27  * 
28  * @since 2.0
29  * @noinstantiate This class is not intended to be instantiated by clients.
30  */
31 public class ExpressionStatement extends Statement {
32         
33         /**
34          * The "expression" structural property of this node type.
35          * @since 3.0
36          */
37         public static final ChildPropertyDescriptor EXPRESSION_PROPERTY = 
38                 new ChildPropertyDescriptor(ExpressionStatement.class, "expression", Expression.class, MANDATORY, CYCLE_RISK); //$NON-NLS-1$
39
40         /**
41          * A list of property descriptors (element type: 
42          * {@link StructuralPropertyDescriptor}),
43          * or null if uninitialized.
44          */
45         private static final List PROPERTY_DESCRIPTORS;
46         
47         static {
48                 List properyList = new ArrayList(2);
49                 createPropertyList(ExpressionStatement.class, properyList);
50                 addProperty(EXPRESSION_PROPERTY, properyList);
51                 PROPERTY_DESCRIPTORS = reapPropertyList(properyList);
52         }
53
54         /**
55          * Returns a list of structural property descriptors for this node type.
56          * Clients must not modify the result.
57          * 
58          * @param apiLevel the API level; one of the
59          * <code>AST.JLS*</code> constants
60
61          * @return a list of property descriptors (element type: 
62          * {@link StructuralPropertyDescriptor})
63          * @since 3.0
64          */
65         public static List propertyDescriptors(int apiLevel) {
66                 return PROPERTY_DESCRIPTORS;
67         }
68                         
69         /**
70          * The expression; lazily initialized; defaults to a unspecified, but legal,
71          * expression.
72          */
73         private Expression expression = null;
74
75         /**
76          * Creates a new unparented expression statement node owned by the given 
77          * AST. By default, the expression statement is unspecified, but legal,
78          * method invocation expression.
79          * <p>
80          * N.B. This constructor is package-private.
81          * </p>
82          * 
83          * @param ast the AST that is to own this node
84          */
85         ExpressionStatement(AST ast) {
86                 super(ast);
87         }
88
89         /* (omit javadoc for this method)
90          * Method declared on ASTNode.
91          */
92         final List internalStructuralPropertiesForType(int apiLevel) {
93                 return propertyDescriptors(apiLevel);
94         }
95         
96         /* (omit javadoc for this method)
97          * Method declared on ASTNode.
98          */
99         final ASTNode internalGetSetChildProperty(ChildPropertyDescriptor property, boolean get, ASTNode child) {
100                 if (property == EXPRESSION_PROPERTY) {
101                         if (get) {
102                                 return getExpression();
103                         } else {
104                                 setExpression((Expression) child);
105                                 return null;
106                         }
107                 }
108                 // allow default implementation to flag the error
109                 return super.internalGetSetChildProperty(property, get, child);
110         }
111
112         /* (omit javadoc for this method)
113          * Method declared on ASTNode.
114          */
115         final int getNodeType0() {
116                 return EXPRESSION_STATEMENT;
117         }
118
119         /* (omit javadoc for this method)
120          * Method declared on ASTNode.
121          */
122         ASTNode clone0(AST target) {
123                 ExpressionStatement result = new ExpressionStatement(target);
124                 result.setSourceRange(this.getStartPosition(), this.getLength());
125                 result.copyLeadingComment(this);
126                 result.setExpression((Expression) getExpression().clone(target));
127                 return result;
128         }
129         
130         /* (omit javadoc for this method)
131          * Method declared on ASTNode.
132          */
133         final boolean subtreeMatch0(ASTMatcher matcher, Object other) {
134                 // dispatch to correct overloaded match method
135                 return matcher.match(this, other);
136         }
137
138         /* (omit javadoc for this method)
139          * Method declared on ASTNode.
140          */
141         void accept0(ASTVisitor visitor) {
142                 boolean visitChildren = visitor.visit(this);
143                 if (visitChildren) {
144                         acceptChild(visitor, getExpression());
145                 }
146                 visitor.endVisit(this);
147         }
148         
149         /**
150          * Returns the expression of this expression statement.
151          * 
152          * @return the expression node
153          */ 
154         public Expression getExpression() {
155                 if (this.expression == null) {
156                         // lazy init must be thread-safe for readers
157                         synchronized (this) {
158                                 if (this.expression == null) {
159                                         preLazyInit();
160                                         this.expression = new MethodInvocation(this.ast);
161                                         postLazyInit(this.expression, EXPRESSION_PROPERTY);
162                                 }
163                         }
164                 }
165                 return this.expression;
166         }
167                 
168         /**
169          * Sets the expression of this expression statement.
170          * 
171          * @param expression the new expression node
172          * @exception IllegalArgumentException if:
173          * <ul>
174          * <li>the node belongs to a different AST</li>
175          * <li>the node already has a parent</li>
176          * <li>a cycle in would be created</li>
177          * </ul>
178          */ 
179         public void setExpression(Expression expression) {
180                 if (expression == null) {
181                         throw new IllegalArgumentException();
182                 }
183                 ASTNode oldChild = this.expression;
184                 preReplaceChild(oldChild, expression, EXPRESSION_PROPERTY);
185                 this.expression = expression;
186                 postReplaceChild(oldChild, expression, EXPRESSION_PROPERTY);
187         }
188         
189         /* (omit javadoc for this method)
190          * Method declared on ASTNode.
191          */
192         int memSize() {
193                 return super.memSize() + 1 * 4;
194         }
195         
196         /* (omit javadoc for this method)
197          * Method declared on ASTNode.
198          */
199         int treeSize() {
200                 return
201                         memSize()
202                         + (this.expression == null ? 0 : getExpression().treeSize());
203         }
204 }
205