• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
3  * Copyright (C) 2011, 2013-2016 The JavaParser Team.
4  *
5  * This file is part of JavaParser.
6  *
7  * JavaParser can be used either under the terms of
8  * a) the GNU Lesser General Public License as published by
9  *     the Free Software Foundation, either version 3 of the License, or
10  *     (at your option) any later version.
11  * b) the terms of the Apache License
12  *
13  * You should have received a copy of both licenses in LICENCE.LGPL and
14  * LICENCE.APACHE. Please refer to those files for details.
15  *
16  * JavaParser is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU Lesser General Public License for more details.
20  */
21 package com.github.javaparser.ast.stmt;
22 
23 import com.github.javaparser.TokenRange;
24 import com.github.javaparser.ast.AllFieldsConstructor;
25 import com.github.javaparser.ast.Generated;
26 import com.github.javaparser.ast.Node;
27 import com.github.javaparser.ast.NodeList;
28 import com.github.javaparser.ast.expr.Expression;
29 import com.github.javaparser.ast.nodeTypes.NodeWithStatements;
30 import com.github.javaparser.ast.observer.ObservableProperty;
31 import com.github.javaparser.ast.visitor.CloneVisitor;
32 import com.github.javaparser.ast.visitor.GenericVisitor;
33 import com.github.javaparser.ast.visitor.VoidVisitor;
34 import com.github.javaparser.metamodel.JavaParserMetaModel;
35 import com.github.javaparser.metamodel.SwitchEntryMetaModel;
36 import static com.github.javaparser.utils.Utils.assertNotNull;
37 
38 /**
39  * <h1>One case in a switch statement</h1>
40  * The main Javadoc is in {@link SwitchStmt}
41  * <h2>Java 1.0-11</h2>
42  * <pre>
43  * switch (i) {
44  *   case 1:
45  *   case 2:
46  *     System.out.println(444);
47  *     break;
48  *   default:
49  *     System.out.println(0);
50  * }
51  * </pre>
52  * This contains three SwitchEntrys.
53  * <br/>The first one has label 1 and no statements.
54  * <br/>The second has label 2 and two statements (the println and the break).
55  * <br/>The third, the default, has no label and one statement.
56  * <br/>All of them are of type STATEMENT_GROUP.
57  * <h2>Java 12-</h2>
58  * <pre>
59  *     case 1 -> 15*15;
60  *     case 2 -> { a++; b++; }
61  *     case 3 -> throw new Exception();
62  * </pre>
63  * These are three new variants.
64  * <br/>The first one is of type EXPRESSION and stores its {@link Expression} in an {@link ExpressionStmt}
65  * which is stored as the first and only statement in statements.
66  * <br/>The second one is of type BLOCK and stores its {@link BlockStmt} as the first and only statement in statements.
67  * <br/>The third one is of type THROWS_STATEMENT and stores its {@link ThrowStmt} as the first and only statement in statements.
68  * <pre>
69  *     case MONDAY, FRIDAY, SUNDAY -> 6;
70  * </pre>
71  * Multiple case labels are now allowed.
72  * <pre>
73  *     case 16*16, 10+10 -> 6;
74  * </pre>
75  * Many kinds of expressions are now allowed.
76  *
77  * @author Julio Vilmar Gesser
78  * @see SwitchStmt
79  * @see com.github.javaparser.ast.expr.SwitchExpr
80  */
81 public class SwitchEntry extends Node implements NodeWithStatements<SwitchEntry> {
82 
83     public enum Type {
84 
85         STATEMENT_GROUP, EXPRESSION, BLOCK, THROWS_STATEMENT
86     }
87 
88     private NodeList<Expression> labels;
89 
90     private NodeList<Statement> statements;
91 
92     private Type type;
93 
SwitchEntry()94     public SwitchEntry() {
95         this(null, new NodeList<Expression>(), Type.STATEMENT_GROUP, new NodeList<>());
96     }
97 
98     @AllFieldsConstructor
SwitchEntry(final NodeList<Expression> labels, final Type type, final NodeList<Statement> statements)99     public SwitchEntry(final NodeList<Expression> labels, final Type type, final NodeList<Statement> statements) {
100         this(null, labels, type, statements);
101     }
102 
103     /**
104      * This constructor is used by the parser and is considered private.
105      */
106     @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
SwitchEntry(TokenRange tokenRange, NodeList<Expression> labels, Type type, NodeList<Statement> statements)107     public SwitchEntry(TokenRange tokenRange, NodeList<Expression> labels, Type type, NodeList<Statement> statements) {
108         super(tokenRange);
109         setLabels(labels);
110         setType(type);
111         setStatements(statements);
112         customInitialization();
113     }
114 
115     @Override
116     @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
accept(final GenericVisitor<R, A> v, final A arg)117     public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) {
118         return v.visit(this, arg);
119     }
120 
121     @Override
122     @Generated("com.github.javaparser.generator.core.node.AcceptGenerator")
accept(final VoidVisitor<A> v, final A arg)123     public <A> void accept(final VoidVisitor<A> v, final A arg) {
124         v.visit(this, arg);
125     }
126 
127     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
getLabels()128     public NodeList<Expression> getLabels() {
129         return labels;
130     }
131 
132     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
getStatements()133     public NodeList<Statement> getStatements() {
134         return statements;
135     }
136 
137     /**
138      * Sets the label
139      *
140      * @param labels the label, can be null
141      * @return this, the SwitchEntry
142      */
143     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
setLabels(final NodeList<Expression> labels)144     public SwitchEntry setLabels(final NodeList<Expression> labels) {
145         assertNotNull(labels);
146         if (labels == this.labels) {
147             return (SwitchEntry) this;
148         }
149         notifyPropertyChange(ObservableProperty.LABELS, this.labels, labels);
150         if (this.labels != null)
151             this.labels.setParentNode(null);
152         this.labels = labels;
153         setAsParentNodeOf(labels);
154         return this;
155     }
156 
157     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
setStatements(final NodeList<Statement> statements)158     public SwitchEntry setStatements(final NodeList<Statement> statements) {
159         assertNotNull(statements);
160         if (statements == this.statements) {
161             return (SwitchEntry) this;
162         }
163         notifyPropertyChange(ObservableProperty.STATEMENTS, this.statements, statements);
164         if (this.statements != null)
165             this.statements.setParentNode(null);
166         this.statements = statements;
167         setAsParentNodeOf(statements);
168         return this;
169     }
170 
171     @Override
172     @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
remove(Node node)173     public boolean remove(Node node) {
174         if (node == null)
175             return false;
176         for (int i = 0; i < labels.size(); i++) {
177             if (labels.get(i) == node) {
178                 labels.remove(i);
179                 return true;
180             }
181         }
182         for (int i = 0; i < statements.size(); i++) {
183             if (statements.get(i) == node) {
184                 statements.remove(i);
185                 return true;
186             }
187         }
188         return super.remove(node);
189     }
190 
191     @Override
192     @Generated("com.github.javaparser.generator.core.node.CloneGenerator")
clone()193     public SwitchEntry clone() {
194         return (SwitchEntry) accept(new CloneVisitor(), null);
195     }
196 
197     @Override
198     @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
getMetaModel()199     public SwitchEntryMetaModel getMetaModel() {
200         return JavaParserMetaModel.switchEntryMetaModel;
201     }
202 
203     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
getType()204     public Type getType() {
205         return type;
206     }
207 
208     @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
setType(final Type type)209     public SwitchEntry setType(final Type type) {
210         assertNotNull(type);
211         if (type == this.type) {
212             return (SwitchEntry) this;
213         }
214         notifyPropertyChange(ObservableProperty.TYPE, this.type, type);
215         this.type = type;
216         return this;
217     }
218 
219     @Override
220     @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator")
replace(Node node, Node replacementNode)221     public boolean replace(Node node, Node replacementNode) {
222         if (node == null)
223             return false;
224         for (int i = 0; i < labels.size(); i++) {
225             if (labels.get(i) == node) {
226                 labels.set(i, (Expression) replacementNode);
227                 return true;
228             }
229         }
230         for (int i = 0; i < statements.size(); i++) {
231             if (statements.get(i) == node) {
232                 statements.set(i, (Statement) replacementNode);
233                 return true;
234             }
235         }
236         return super.replace(node, replacementNode);
237     }
238 }
239