EclipseJDT Source Viewer

Home|eclipse_jdt/src/org/eclipse/jdt/core/dom/BreakStatement.java
1/*******************************************************************************
2 * Copyright (c) 2000, 2019 IBM Corporation and others.
3 *
4 * This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License 2.0
6 * which accompanies this distribution, and is available at
7 * https://www.eclipse.org/legal/epl-2.0/
8 *
9 * SPDX-License-Identifier: EPL-2.0
10 *
11 * Contributors:
12 *     IBM Corporation - initial API and implementation
13 *******************************************************************************/
14
15package org.eclipse.jdt.core.dom;
16
17import java.util.ArrayList;
18import java.util.List;
19
20/**
21 * Break statement AST node type.
22 *
23 * <pre>
24 * BreakStatement:
25 *    <b>break</b> [ Identifier ] <b>;</b>
26 *
27 *    Break statement allows expression as part of Java 12 preview feature (JEP 325)
28 *        <b>break</b> <b>{ Identifier | Expression }</b>
29 * </pre>
30 *
31 * @since 2.0
32 * @noinstantiate This class is not intended to be instantiated by clients.
33 */
34@SuppressWarnings("rawtypes")
35public class BreakStatement extends Statement {
36
37    /**
38     * The "label" structural property of this node type (child type: {@link SimpleName}).
39     * @since 3.0
40     */
41    public static final ChildPropertyDescriptor LABEL_PROPERTY =
42        new ChildPropertyDescriptor(BreakStatement.class"label"SimpleName.classOPTIONALNO_CYCLE_RISK); //$NON-NLS-1$
43
44    /**
45     * The "expression" structural property of this node type (child type: {@link Expression}). (added in JEP 325).
46     * @noreference This property is not intended to be referenced by clients as it is a part of Java preview feature.
47     * @deprecated
48     * @since 3.18
49     */
50    public static final ChildPropertyDescriptor EXPRESSION_PROPERTY =
51            new ChildPropertyDescriptor(BreakStatement.class"expression"Expression.classOPTIONALNO_CYCLE_RISK); //$NON-NLS-1$);
52
53    /**
54     * A list of property descriptors (element type:
55     * {@link StructuralPropertyDescriptor}),
56     * or null if uninitialized.
57     */
58    private static final List PROPERTY_DESCRIPTORS;
59
60    /**
61     * <code>true</code> indicates implicit and <code>false</code> indicates not implicit.
62     */
63    private boolean isImplicit = false;
64
65    static {
66        List properyList = new ArrayList(2);
67        createPropertyList(BreakStatement.classproperyList);
68        addProperty(LABEL_PROPERTYproperyList);
69        PROPERTY_DESCRIPTORS = reapPropertyList(properyList);
70    }
71
72    /**
73     * Returns a list of structural property descriptors for this node type.
74     * Clients must not modify the result.
75     *
76     * @param apiLevel the API level; one of the
77     * <code>AST.JLS*</code> constants
78
79     * @return a list of property descriptors (element type:
80     * {@link StructuralPropertyDescriptor})
81     * @since 3.0
82     */
83    public static List propertyDescriptors(int apiLevel) {
84        return PROPERTY_DESCRIPTORS;
85    }
86
87    /**
88     * Returns a list of structural property descriptors for this node type.
89     * Clients must not modify the result.
90     *
91     * @param apiLevel the API level; one of the
92     * <code>AST.JLS*</code> constants
93     * @param previewEnabled the previewEnabled flag
94
95     * @return a list of property descriptors (element type:
96     * {@link StructuralPropertyDescriptor})
97     * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature.
98     * @deprecated
99     * @since 3.20
100     */
101    public static List propertyDescriptors(int apiLevelboolean previewEnabled) {
102        return PROPERTY_DESCRIPTORS;
103    }
104
105    /**
106     * The label, or <code>null</code> if none; none by default.
107     */
108    private SimpleName optionalLabel = null;
109
110    /**
111     * The expression; <code>null</code> for none
112     */
113    private Expression optionalExpression = null;
114
115    /**
116     * Creates a new unparented break statement node owned by the given
117     * AST. By default, the break statement has no label/identifier/expression and is not implicit.
118     * <p>
119     * N.B. This constructor is package-private.
120     * </p>
121     *
122     * @param ast the AST that is to own this node
123     */
124    BreakStatement(AST ast) {
125        super(ast);
126    }
127
128    @Override
129    final List internalStructuralPropertiesForType(int apiLevel) {
130        return propertyDescriptors(apiLevel);
131    }
132
133    @Override
134    final ASTNode internalGetSetChildProperty(ChildPropertyDescriptor propertyboolean getASTNode child) {
135        if (property == LABEL_PROPERTY) {
136            if (get) {
137                return getLabel();
138            } else {
139                setLabel((SimpleNamechild);
140                return null;
141            }
142        }
143        if (property == EXPRESSION_PROPERTY) {
144            if (get) {
145                return getExpression();
146            } else {
147                setExpression((Expressionchild);
148                return null;
149            }
150        }
151        // allow default implementation to flag the error
152        return super.internalGetSetChildProperty(propertygetchild);
153    }
154
155    @Override
156    final int getNodeType0() {
157        return BREAK_STATEMENT;
158    }
159
160    @Override
161    ASTNode clone0(AST target) {
162        BreakStatement result = new BreakStatement(target);
163        result.setSourceRange(getStartPosition(), getLength());
164        result.copyLeadingComment(this);
165        result.setLabel((SimpleNameASTNode.copySubtree(targetgetLabel()));
166        return result;
167    }
168
169    @Override
170    final boolean subtreeMatch0(ASTMatcher matcherObject other) {
171        // dispatch to correct overloaded match method
172        return matcher.match(this, other);
173    }
174
175    @Override
176    void accept0(ASTVisitor visitor) {
177        boolean visitChildren = visitor.visit(this);
178        if (visitChildren) {
179            acceptChild(visitorgetLabel());
180        }
181        visitor.endVisit(this);
182    }
183
184    /**
185     * Returns the label of this break statement, or <code>null</code> if
186     * there is none.
187     *
188     * @return the label, or <code>null</code> if there is none
189     */
190    public SimpleName getLabel() {
191        return this.optionalLabel;
192    }
193
194    /**
195     * Sets or clears the label of this break statement.
196     *
197     * @param label the label, or <code>null</code> if
198     *    there is none
199     * @exception IllegalArgumentException if:
200     * <ul>
201     * <li>the node belongs to a different AST</li>
202     * <li>the node already has a parent</li>
203     * </ul>
204     */
205    public void setLabel(SimpleName label) {
206        ASTNode oldChild = this.optionalLabel;
207        preReplaceChild(oldChildlabelLABEL_PROPERTY);
208        this.optionalLabel = label;
209        postReplaceChild(oldChildlabelLABEL_PROPERTY);
210    }
211
212    /**
213     * Returns the expression of this break statement, or <code>null</code> if
214     * there is none.
215     *
216     * @return the expression, or <code>null</code> if there is none
217     * @exception UnsupportedOperationException if this operation is used other than JLS12
218     * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature.
219     * @nooverride This method is not intended to be re-implemented or extended by clients as it is a part of Java preview feature.
220     * @deprecated
221     * @since 3.18
222     */
223    public Expression getExpression() {
224        // optionalExpression can be null
225        supportedOnlyIn12();
226        return this.optionalExpression;
227    }
228
229    /**
230     * Sets or clears the expression of this break statement.
231     *
232     * @param expression the expression, or <code>null</code> if
233     *    there is none
234     * @exception IllegalArgumentException if:
235     * <ul>
236     * <li>the node belongs to a different AST</li>
237     * <li>the node already has a parent</li>
238     * </ul>
239     * @exception UnsupportedOperationException if this operation is used other than JLS12
240     * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature.
241     * @nooverride This method is not intended to be re-implemented or extended by clients as it is a part of Java preview feature.
242     * @deprecated
243     * @since 3.18
244     */
245    public void setExpression(Expression expression) {
246        supportedOnlyIn12();
247        ASTNode oldChild = this.optionalExpression;
248        preReplaceChild(oldChildexpressionEXPRESSION_PROPERTY);
249        this.optionalExpression = expression;
250        postReplaceChild(oldChildexpressionEXPRESSION_PROPERTY);
251    }
252
253    /**
254     * Gets the isImplicit of this break statement as <code>true</code> or <code>false</code>.
255     *<code>true</code> indicates implicit and <code>false</code> indicates not implicit.
256     *
257     * @return isImplicit <code>true</code> or <code>false</code>
258     * @exception UnsupportedOperationException if this operation is used other than JLS12
259     * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature.
260     * @nooverride This method is not intended to be re-implemented or extended by clients as it is a part of Java preview feature.
261     * @deprecated
262     * @since 3.18
263     */
264    public boolean isImplicit() {
265        supportedOnlyIn12();
266        return this.isImplicit;
267    }
268
269    /**
270     * Sets the isImplicit of this break statement as <code>true</code> or <code>false</code>.
271     * <code>true</code> indicates implicit and <code>false</code> indicates not implicit. This flag is
272     * generated by compiler and is not expected to be set by client.
273
274     * @param isImplicit <code>true</code> or <code>false</code>
275     * @exception UnsupportedOperationException if this operation is used other than JLS12
276     * @deprecated
277     * @since 3.18
278     */
279    void setImplicit(boolean isImplicit) {
280        supportedOnlyIn12();
281        this.isImplicit = isImplicit;
282    }
283
284    @Override
285    int memSize() {
286        return super.memSize() + 2 * 4;
287    }
288
289    @Override
290    int treeSize() {
291        return
292            memSize()
293            + (this.optionalLabel == null ? 0 : getLabel().treeSize())
294            + (this.optionalExpression == null ? 0 : getExpression().treeSize());
295    }
296}
297
298
MembersX
BreakStatement:setLabel:Block:oldChild
BreakStatement:getNodeType0
BreakStatement:EXPRESSION_PROPERTY
BreakStatement:getLabel
BreakStatement:setExpression
BreakStatement:propertyDescriptors
BreakStatement:setExpression:Block:oldChild
BreakStatement:memSize
BreakStatement:internalStructuralPropertiesForType
BreakStatement:optionalLabel
BreakStatement:PROPERTY_DESCRIPTORS
BreakStatement:LABEL_PROPERTY
BreakStatement:accept0:Block:visitChildren
BreakStatement:setLabel
BreakStatement:getExpression
BreakStatement:clone0:Block:result
BreakStatement:treeSize
BreakStatement:Block:properyList
BreakStatement:subtreeMatch0
BreakStatement:accept0
BreakStatement:internalGetSetChildProperty
BreakStatement:BreakStatement
BreakStatement:clone0
BreakStatement:optionalExpression
BreakStatement:isImplicit
BreakStatement:setImplicit
Members
X