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