Skip to content

Commit

Permalink
Create break with value
Browse files Browse the repository at this point in the history
  • Loading branch information
matozoid committed Jan 7, 2019
1 parent ce73fea commit 133c81b
Show file tree
Hide file tree
Showing 19 changed files with 142 additions and 63 deletions.
Expand Up @@ -63,7 +63,6 @@ void jep325Example5() {
"};"); "};");
} }


@Disabled("to be implemented")
@Test @Test
void jep325Example6() { void jep325Example6() {
JavaParser.parseStatement("int result = switch (s) {\n" + JavaParser.parseStatement("int result = switch (s) {\n" +
Expand Down
@@ -0,0 +1,29 @@
package com.github.javaparser.ast.stmt;

import com.github.javaparser.ast.expr.BinaryExpr;
import org.junit.jupiter.api.Test;

import static com.github.javaparser.JavaParser.parseStatement;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;

class BreakStmtTest {
@Test
void simpleBreak() {
BreakStmt statement = parseStatement("break;").asBreakStmt();
assertFalse(statement.getValue().isPresent());
}

@Test
void breakWithLabel() {
BreakStmt statement = parseStatement("break hond;").asBreakStmt();
assertEquals("hond", statement.getValue().get().asNameExpr().getName().asString());

}

@Test
void breakWithExpression() {
BreakStmt statement = parseStatement("break 12*12;").asBreakStmt();
assertEquals(BinaryExpr.class, statement.getValue().get().getClass());
}
}
Expand Up @@ -27,22 +27,28 @@
import com.github.javaparser.ast.NodeList; import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.nodeTypes.SwitchNode; import com.github.javaparser.ast.nodeTypes.SwitchNode;
import com.github.javaparser.ast.observer.ObservableProperty; import com.github.javaparser.ast.observer.ObservableProperty;
import com.github.javaparser.ast.stmt.Statement;
import com.github.javaparser.ast.stmt.SwitchEntryStmt; import com.github.javaparser.ast.stmt.SwitchEntryStmt;
import com.github.javaparser.ast.visitor.CloneVisitor; import com.github.javaparser.ast.visitor.CloneVisitor;
import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.GenericVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor; import com.github.javaparser.ast.visitor.VoidVisitor;
import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel;
import com.github.javaparser.metamodel.SwitchStmtMetaModel; import com.github.javaparser.metamodel.SwitchExprMetaModel;

import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;

import static com.github.javaparser.utils.Utils.assertNotNull; import static com.github.javaparser.utils.Utils.assertNotNull;
import com.github.javaparser.metamodel.SwitchExprMetaModel;


/** /**
* A switch expression. * <h1>The switch expression</h1>
* <br/>In <code>switch(a) { ... }</code> the selector is "a", * <h2>Java 1.0-11</h2>
* and the contents of the { ... } are the entries. * Not available.
* <h2>Java 12-</h2>
* Like {@link com.github.javaparser.ast.stmt.SwitchStmt},
* but can also be used as an expression.
* <br/>
* <br/><code>int a = switch(x) { case 5,6 -> 20; case 9 -> 30; default -> 40; };</code>
* <br/><code>int a = switch(x) { case 5,6: break 20; default: break 5+5; };</code>
* *
* @author Julio Vilmar Gesser * @author Julio Vilmar Gesser
* @see SwitchEntryStmt * @see SwitchEntryStmt
Expand Down
Expand Up @@ -20,52 +20,64 @@
*/ */
package com.github.javaparser.ast.stmt; package com.github.javaparser.ast.stmt;


import com.github.javaparser.TokenRange;
import com.github.javaparser.ast.AllFieldsConstructor; import com.github.javaparser.ast.AllFieldsConstructor;
import com.github.javaparser.ast.expr.SimpleName; import com.github.javaparser.ast.Generated;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.ast.observer.ObservableProperty; import com.github.javaparser.ast.observer.ObservableProperty;
import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.GenericVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor; import com.github.javaparser.ast.visitor.VoidVisitor;
import com.github.javaparser.metamodel.OptionalProperty;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer;
import com.github.javaparser.ast.Node; import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.visitor.CloneVisitor; import com.github.javaparser.ast.visitor.CloneVisitor;
import com.github.javaparser.metamodel.BreakStmtMetaModel; import com.github.javaparser.metamodel.BreakStmtMetaModel;
import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel;
import com.github.javaparser.TokenRange;
import com.github.javaparser.metamodel.OptionalProperty;
import java.util.function.Consumer;
import com.github.javaparser.ast.Generated;


/** /**
* A usage of the break keyword. * <h1>The break statement</h1>
* <br/>In <code>break abc;</code> the label is abc. * <h2>Java 1.0-11</h2>
* Break has an optional label:
* <br/><code>break;</code>
* <br/><code>break somewhere;</code>
* <br/>The label is in the "value" property as a NameExpr.
* <h2>Java 12</h2>
* Break can now also have any expression,
* to be used in the switch-expression:
* <br/><code>break 123+456;</code>
* <br/><code>break "more or less";</code>
* <br/>The expression will be in the "value" property.
* *
* @author Julio Vilmar Gesser * @author Julio Vilmar Gesser
* @see com.github.javaparser.ast.expr.SwitchExpr
*/ */
public final class BreakStmt extends Statement { public final class BreakStmt extends Statement {


@OptionalProperty @OptionalProperty
private SimpleName label; private Expression value;


public BreakStmt() { public BreakStmt() {
this(null, new SimpleName()); this(null, new NameExpr());
} }


public BreakStmt(final String label) { public BreakStmt(final String label) {
this(null, new SimpleName(label)); this(null, new NameExpr(label));
} }


@AllFieldsConstructor @AllFieldsConstructor
public BreakStmt(final SimpleName label) { public BreakStmt(final Expression value) {
this(null, label); this(null, value);
} }


/** /**
* This constructor is used by the parser and is considered private. * This constructor is used by the parser and is considered private.
*/ */
@Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator") @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
public BreakStmt(TokenRange tokenRange, SimpleName label) { public BreakStmt(TokenRange tokenRange, Expression value) {
super(tokenRange); super(tokenRange);
setLabel(label); setValue(value);
customInitialization(); customInitialization();
} }


Expand All @@ -82,26 +94,26 @@ public <A> void accept(final VoidVisitor<A> v, final A arg) {
} }


@Generated("com.github.javaparser.generator.core.node.PropertyGenerator") @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public Optional<SimpleName> getLabel() { public Optional<Expression> getValue() {
return Optional.ofNullable(label); return Optional.ofNullable(value);
} }


/** /**
* Sets the label * Sets the label
* *
* @param label the label, can be null * @param value the label or the expression, can be null
* @return this, the BreakStmt * @return this, the BreakStmt
*/ */
@Generated("com.github.javaparser.generator.core.node.PropertyGenerator") @Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public BreakStmt setLabel(final SimpleName label) { public BreakStmt setValue(final Expression value) {
if (label == this.label) { if (value == this.value) {
return (BreakStmt) this; return (BreakStmt) this;
} }
notifyPropertyChange(ObservableProperty.LABEL, this.label, label); notifyPropertyChange(ObservableProperty.VALUE, this.value, value);
if (this.label != null) if (this.value != null)
this.label.setParentNode(null); this.value.setParentNode(null);
this.label = label; this.value = value;
setAsParentNodeOf(label); setAsParentNodeOf(value);
return this; return this;
} }


Expand All @@ -110,18 +122,18 @@ public BreakStmt setLabel(final SimpleName label) {
public boolean remove(Node node) { public boolean remove(Node node) {
if (node == null) if (node == null)
return false; return false;
if (label != null) { if (value != null) {
if (node == label) { if (node == value) {
removeLabel(); removeValue();
return true; return true;
} }
} }
return super.remove(node); return super.remove(node);
} }


@Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator")
public BreakStmt removeLabel() { public BreakStmt removeValue() {
return setLabel((SimpleName) null); return setValue((Expression) null);
} }


@Override @Override
Expand All @@ -141,9 +153,9 @@ public BreakStmtMetaModel getMetaModel() {
public boolean replace(Node node, Node replacementNode) { public boolean replace(Node node, Node replacementNode) {
if (node == null) if (node == null)
return false; return false;
if (label != null) { if (value != null) {
if (node == label) { if (node == value) {
setLabel((SimpleName) replacementNode); setValue((Expression) replacementNode);
return true; return true;
} }
} }
Expand Down
Expand Up @@ -28,21 +28,47 @@
import com.github.javaparser.ast.observer.ObservableProperty; import com.github.javaparser.ast.observer.ObservableProperty;
import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.GenericVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor; import com.github.javaparser.ast.visitor.VoidVisitor;

import static com.github.javaparser.utils.Utils.assertNotNull; import static com.github.javaparser.utils.Utils.assertNotNull;

import com.github.javaparser.ast.Node; import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.visitor.CloneVisitor; import com.github.javaparser.ast.visitor.CloneVisitor;
import com.github.javaparser.metamodel.SwitchStmtMetaModel; import com.github.javaparser.metamodel.SwitchStmtMetaModel;
import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.metamodel.JavaParserMetaModel;
import com.github.javaparser.TokenRange; import com.github.javaparser.TokenRange;

import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.Optional; import java.util.Optional;

import com.github.javaparser.ast.Generated; import com.github.javaparser.ast.Generated;


/** /**
* A switch statement. * <h1>The switch statement</h1>
*
* <h2>Java 1.0-1.4</h2>
* The basic C-like switch statement.
* It can switch only on integers.
* <br/><code>switch(x) { case 5: case 6: a=100; break; case 9: a=33; break; default: throw new IllegalStateException(); };</code>
* <br/>In <code>switch(a) { ... }</code> the selector is "a", * <br/>In <code>switch(a) { ... }</code> the selector is "a",
* and the contents of the { ... } are the entries. * and the contents of the { ... } are the entries.
* *
* <h2>Java 5-6</h2>
* Switching can now also be done on enum constants.
*
* <h2>Java 7-11</h2>
* Switching can now also be done on strings.
*
* <h2>Java 12-</h2>
* In preparation for pattern matching, lots of changes are made:
* <ul>
* <li>multiple labels per case
* <li>a -> syntax that does not fall through.
* <li>break can take any expression (usable in the {@link com.github.javaparser.ast.expr.SwitchExpr})
* <li>switch can be used as an expression (it becomes a {@link com.github.javaparser.ast.expr.SwitchExpr})
* </ul>
* <code>switch(x) { case BANANA,PEAR: b=10; break; default: b=5; };</code>
* <br/><code>switch(x) { case 5,6 -> println("uhuh"); default -> println("nope"); };</code>
*
* @author Julio Vilmar Gesser * @author Julio Vilmar Gesser
* @see SwitchEntryStmt * @see SwitchEntryStmt
* @see com.github.javaparser.ast.expr.SwitchExpr * @see com.github.javaparser.ast.expr.SwitchExpr
Expand Down
Expand Up @@ -22,11 +22,15 @@


import com.github.javaparser.ast.*; import com.github.javaparser.ast.*;
import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.body.*;
import com.github.javaparser.ast.comments.*; import com.github.javaparser.ast.comments.BlockComment;
import com.github.javaparser.ast.comments.Comment;
import com.github.javaparser.ast.comments.JavadocComment;
import com.github.javaparser.ast.comments.LineComment;
import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.expr.*;
import com.github.javaparser.ast.modules.*; import com.github.javaparser.ast.modules.*;
import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.stmt.*;
import com.github.javaparser.ast.type.*; import com.github.javaparser.ast.type.*;

import java.util.Optional; import java.util.Optional;


/** /**
Expand Down Expand Up @@ -709,9 +713,9 @@ public Visitable visit(final SwitchEntryStmt n, final Object arg) {


@Override @Override
public Visitable visit(final BreakStmt n, final Object arg) { public Visitable visit(final BreakStmt n, final Object arg) {
SimpleName label = cloneNode(n.getLabel(), arg); Expression value = cloneNode(n.getValue(), arg);
Comment comment = cloneNode(n.getComment(), arg); Comment comment = cloneNode(n.getComment(), arg);
BreakStmt r = new BreakStmt(n.getTokenRange().orElse(null), label); BreakStmt r = new BreakStmt(n.getTokenRange().orElse(null), value);
r.setComment(comment); r.setComment(comment);
return r; return r;
} }
Expand Down
Expand Up @@ -986,7 +986,7 @@ public Boolean visit(final SwitchEntryStmt n, final Visitable arg) {
@Override @Override
public Boolean visit(final BreakStmt n, final Visitable arg) { public Boolean visit(final BreakStmt n, final Visitable arg) {
final BreakStmt n2 = (BreakStmt) arg; final BreakStmt n2 = (BreakStmt) arg;
if (!nodeEquals(n.getLabel(), n2.getLabel())) if (!nodeEquals(n.getValue(), n2.getValue()))
return false; return false;
if (!nodeEquals(n.getComment(), n2.getComment())) if (!nodeEquals(n.getComment(), n2.getComment()))
return false; return false;
Expand Down
Expand Up @@ -319,8 +319,8 @@ public List<R> visit(final BooleanLiteralExpr n, final A arg) {
public List<R> visit(final BreakStmt n, final A arg) { public List<R> visit(final BreakStmt n, final A arg) {
List<R> result = new ArrayList<>(); List<R> result = new ArrayList<>();
List<R> tmp; List<R> tmp;
if (n.getLabel().isPresent()) { if (n.getValue().isPresent()) {
tmp = n.getLabel().get().accept(this, arg); tmp = n.getValue().get().accept(this, arg);
if (tmp != null) if (tmp != null)
result.addAll(tmp); result.addAll(tmp);
} }
Expand Down
Expand Up @@ -262,8 +262,8 @@ public R visit(final BooleanLiteralExpr n, final A arg) {
@Override @Override
public R visit(final BreakStmt n, final A arg) { public R visit(final BreakStmt n, final A arg) {
R result; R result;
if (n.getLabel().isPresent()) { if (n.getValue().isPresent()) {
result = n.getLabel().get().accept(this, arg); result = n.getValue().get().accept(this, arg);
if (result != null) if (result != null)
return result; return result;
} }
Expand Down
Expand Up @@ -99,7 +99,7 @@ public Integer visit(final BooleanLiteralExpr n, final Void arg) {
} }


public Integer visit(final BreakStmt n, final Void arg) { public Integer visit(final BreakStmt n, final Void arg) {
return (n.getLabel().isPresent() ? n.getLabel().get().accept(this, arg) : 0) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0); return (n.getValue().isPresent() ? n.getValue().get().accept(this, arg) : 0) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0);
} }


public Integer visit(final CastExpr n, final Void arg) { public Integer visit(final CastExpr n, final Void arg) {
Expand Down
Expand Up @@ -180,9 +180,9 @@ public Visitable visit(final BooleanLiteralExpr n, final A arg) {


@Override @Override
public Visitable visit(final BreakStmt n, final A arg) { public Visitable visit(final BreakStmt n, final A arg) {
SimpleName label = n.getLabel().map(s -> (SimpleName) s.accept(this, arg)).orElse(null); Expression value = n.getValue().map(s -> (Expression) s.accept(this, arg)).orElse(null);
Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null); Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null);
n.setLabel(label); n.setValue(value);
n.setComment(comment); n.setComment(comment);
return n; return n;
} }
Expand Down
Expand Up @@ -802,7 +802,7 @@ public Boolean visit(final SwitchEntryStmt n, final Visitable arg) {
@Override @Override
public Boolean visit(final BreakStmt n, final Visitable arg) { public Boolean visit(final BreakStmt n, final Visitable arg) {
final BreakStmt n2 = (BreakStmt) arg; final BreakStmt n2 = (BreakStmt) arg;
if (!nodeEquals(n.getLabel(), n2.getLabel())) if (!nodeEquals(n.getValue(), n2.getValue()))
return false; return false;
return true; return true;
} }
Expand Down
Expand Up @@ -91,7 +91,7 @@ public Integer visit(final BooleanLiteralExpr n, final Void arg) {
} }


public Integer visit(final BreakStmt n, final Void arg) { public Integer visit(final BreakStmt n, final Void arg) {
return (n.getLabel().isPresent() ? n.getLabel().get().accept(this, arg) : 0); return (n.getValue().isPresent() ? n.getValue().get().accept(this, arg) : 0);
} }


public Integer visit(final CastExpr n, final Void arg) { public Integer visit(final CastExpr n, final Void arg) {
Expand Down
Expand Up @@ -117,7 +117,7 @@ public void visit(final BooleanLiteralExpr n, final A arg) {


@Override @Override
public void visit(final BreakStmt n, final A arg) { public void visit(final BreakStmt n, final A arg) {
n.getLabel().ifPresent(l -> l.accept(this, arg)); n.getValue().ifPresent(l -> l.accept(this, arg));
n.getComment().ifPresent(l -> l.accept(this, arg)); n.getComment().ifPresent(l -> l.accept(this, arg));
} }


Expand Down
Expand Up @@ -8,5 +8,5 @@ public class BreakStmtMetaModel extends StatementMetaModel {
super(superBaseNodeMetaModel, com.github.javaparser.ast.stmt.BreakStmt.class, "BreakStmt", "com.github.javaparser.ast.stmt", false, false); super(superBaseNodeMetaModel, com.github.javaparser.ast.stmt.BreakStmt.class, "BreakStmt", "com.github.javaparser.ast.stmt", false, false);
} }


public PropertyMetaModel labelPropertyMetaModel; public PropertyMetaModel valuePropertyMetaModel;
} }

0 comments on commit 133c81b

Please sign in to comment.