Skip to content

Commit

Permalink
Merge pull request #2025 from matozoid/issue_1845_switch_arrow_3
Browse files Browse the repository at this point in the history
Switch arrow syntax
  • Loading branch information
matozoid committed Feb 1, 2019
2 parents 803766d + 38e53c3 commit a896097
Show file tree
Hide file tree
Showing 44 changed files with 370 additions and 326 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import com.github.javaparser.ast.body.EnumDeclaration;
import com.github.javaparser.ast.expr.IntegerLiteralExpr;
import com.github.javaparser.ast.stmt.ReturnStmt;
import com.github.javaparser.ast.stmt.SwitchEntryStmt;
import com.github.javaparser.ast.stmt.SwitchEntry;
import com.github.javaparser.ast.stmt.SwitchStmt;
import com.github.javaparser.generator.Generator;
import com.github.javaparser.utils.Log;
Expand Down Expand Up @@ -38,7 +38,7 @@ public void generate() {
annotateGenerated(kindEnum);

final SwitchStmt valueOfSwitch = kindEnum.findFirst(SwitchStmt.class).orElseThrow(() -> new AssertionError("Can't find valueOf switch."));
valueOfSwitch.findAll(SwitchEntryStmt.class).stream().filter(e -> e.getLabel().isPresent()).forEach(Node::remove);
valueOfSwitch.findAll(SwitchEntry.class).stream().filter(e -> e.getLabels().isNonEmpty()).forEach(Node::remove);

final CompilationUnit constantsCu = generatedJavaCcSourceRoot.parse("com.github.javaparser", "GeneratedJavaParserConstants.java");
final ClassOrInterfaceDeclaration constants = constantsCu.getInterfaceByName("GeneratedJavaParserConstants").orElseThrow(() -> new AssertionError("Can't find class in java file."));
Expand All @@ -59,7 +59,7 @@ public void generate() {
}

private void generateValueOfEntry(SwitchStmt valueOfSwitch, String name, IntegerLiteralExpr kind) {
final SwitchEntryStmt entry = new SwitchEntryStmt(kind, new NodeList<>(new ReturnStmt(name)));
final SwitchEntry entry = new SwitchEntry(new NodeList<>(kind), SwitchEntry.Type.STATEMENT_GROUP, new NodeList<>(new ReturnStmt(name)));
valueOfSwitch.getEntries().addFirst(entry);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public class MetaModelGenerator {
add(IfStmt.class);
add(LabeledStmt.class);
add(ReturnStmt.class);
add(SwitchEntryStmt.class);
add(SwitchEntry.class);
add(SwitchStmt.class);
add(SynchronizedStmt.class);
add(ThrowStmt.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ void everyTokenHasACategory() throws IOException {
Path tokenTypesPath = mavenModuleRoot(JavaParserTest.class).resolve("../javaparser-core/src/main/java/com/github/javaparser/TokenTypes.java");
CompilationUnit tokenTypesCu = JavaParser.parse(tokenTypesPath);
// -1 to take off the default: case.
int switchEntries = tokenTypesCu.findAll(SwitchEntryStmt.class).size() - 1;
int switchEntries = tokenTypesCu.findAll(SwitchEntry.class).size() - 1;
// The amount of "case XXX:" in TokenTypes.java should be equal to the amount of tokens JavaCC knows about:
assertEquals(tokenCount, switchEntries);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,42 @@
package com.github.javaparser.ast.expr;

import com.github.javaparser.JavaParser;
import org.junit.jupiter.api.Disabled;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.ast.stmt.SwitchEntry;
import org.junit.jupiter.api.Test;

class SwitchExprTest {
@Disabled("to be implemented")
@Test
void jep325Example1() {
JavaParser.parseStatement("switch (day) {\n" +
" case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);\n" +
" case TUESDAY -> System.out.println(7);\n" +
" case THURSDAY, SATURDAY -> System.out.println(8);\n" +
" case WEDNESDAY -> System.out.println(9);\n" +
"}};");
}
import static com.github.javaparser.JavaParser.*;
import static com.github.javaparser.ast.stmt.SwitchEntry.Type.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

@Disabled("to be implemented")
class SwitchExprTest {
@Test
void jep325Example2() {
JavaParser.parseStatement("int numLetters = switch (day) {\n" +
NodeList<Expression> entry2labels = parseStatement("int numLetters = switch (day) {\n" +
" case MONDAY, FRIDAY, SUNDAY -> 6;\n" +
" case TUESDAY -> 7;\n" +
" case THURSDAY, SATURDAY -> 8;\n" +
" case WEDNESDAY -> 9;\n" +
"};").findAll(SwitchEntry.class).get(0).getLabels();

assertEquals(3, entry2labels.size());
assertEquals("MONDAY", entry2labels.get(0).toString());
assertEquals("FRIDAY", entry2labels.get(1).toString());
assertEquals("SUNDAY", entry2labels.get(2).toString());
}

@Test
void funkyExpressions() {
parseStatement("int numLetters = switch (day) {\n" +
" case 1+1, 2+2 -> 6;\n" +
" case \"Henk\"-> 7;\n" +
" case ((3)+3)+3 -> 8;\n" +
"};");
}

@Disabled("to be implemented")
@Test
void jep325Example3() {
JavaParser.parseBodyDeclaration("static void howMany(int k) {\n" +
parseBodyDeclaration("static void howMany(int k) {\n" +
" switch (k) {\n" +
" case 1 -> System.out.println(\"one\");\n" +
" case 2 -> System.out.println(\"two\");\n" +
Expand All @@ -39,33 +45,46 @@ void jep325Example3() {
"}");
}

@Disabled("to be implemented")

@Test
void aThrowStatement() {
SwitchExpr switchExpr = parseExpression("switch (k) {\n" +
" case 1 -> throw new Exception(\"one\");\n" +
" }").findFirst(SwitchExpr.class).get();

assertEquals(THROWS_STATEMENT, switchExpr.getEntry(0).getType());
}

@Test
void jep325Example4() {
JavaParser.parseStatement("T result = switch (arg) {\n" +
SwitchExpr switchExpr = parseStatement("T result = switch (arg) {\n" +
" case L1 -> e1;\n" +
" case L2 -> e2;\n" +
" default -> e3;\n" +
"};");
"};").findFirst(SwitchExpr.class).get();

assertEquals(EXPRESSION, switchExpr.getEntry(0).getType());
}

@Disabled("to be implemented")
@Test
void jep325Example5() {
JavaParser.parseStatement("int j = switch (day) {\n" +
SwitchExpr switchExpr = parseStatement("int j = switch (day) {\n" +
" case MONDAY -> 0;\n" +
" case TUESDAY -> 1;\n" +
" default -> {\n" +
" int k = day.toString().length();\n" +
" int result = f(k);\n" +
" break result;\n" +
" }\n" +
"};");
"};").findFirst(SwitchExpr.class).get();

assertEquals(BLOCK, switchExpr.getEntry(2).getType());
assertEquals(BlockStmt.class, switchExpr.getEntry(2).getStatements().get(0).getClass());
}

@Test
void jep325Example6() {
JavaParser.parseStatement("int result = switch (s) {\n" +
parseStatement("int result = switch (s) {\n" +
" case \"Foo\": \n" +
" break 1;\n" +
" case \"Bar\":\n" +
Expand All @@ -75,12 +94,4 @@ void jep325Example6() {
" break 0;\n" +
"};");
}

@Test
void placeholderTest() {
JavaParser.parseStatement("int result = switch (s) {\n" +
" case \"Foo\": \n" +
" break;\n" +
"};");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.github.javaparser.ast.stmt;

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

import java.util.Optional;

import static com.github.javaparser.JavaParser.parseStatement;
import static com.github.javaparser.ast.stmt.SwitchEntry.Type.EXPRESSION;
import static com.github.javaparser.ast.stmt.SwitchEntry.Type.STATEMENT_GROUP;
import static org.junit.jupiter.api.Assertions.*;

class SwitchStmtTest {
@Test
void classicSwitch() {
SwitchStmt switchStmt = parseStatement("switch (day) {\n" +
" case TUESDAY: System.out.println(7); break;\n" +
" case FRIDAY: System.out.println(8); break;\n" +
" default: System.out.println(-1); \n" +
"}").asSwitchStmt();

assertEquals(STATEMENT_GROUP, switchStmt.getEntry(0).getType());
assertEquals(STATEMENT_GROUP, switchStmt.getEntry(1).getType());
assertEquals(STATEMENT_GROUP, switchStmt.getEntry(2).getType());
assertEquals(new NodeList<>(), switchStmt.getEntry(2).getLabels());
}
@Test
void jep325Example1() {
SwitchStmt switchStmt = parseStatement("switch (day) {\n" +
// " case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);\n" +
" case TUESDAY -> System.out.println(7);\n" +
// " case THURSDAY, SATURDAY -> System.out.println(8);\n" +
" case WEDNESDAY -> System.out.println(9);\n" +
"}").asSwitchStmt();

assertEquals(EXPRESSION, switchStmt.getEntry(0).getType());
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Java6ValidatorTest {
@Test
void noStringsInSwitch() {
ParseResult<Statement> result = javaParser.parse(STATEMENT, provider("switch(x){case \"abc\": ;}"));
assertProblems(result, "(line 1,col 16) Strings in switch statements are not supported.");
assertProblems(result, "(line 1,col 11) Strings in switch statements are not supported.");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ public void visit(SuperExpr n, Void arg) {
}

@Override
public void visit(SwitchEntryStmt n, Void arg) {
public void visit(SwitchEntry n, Void arg) {
assertParentIsSet(n);
super.visit(n, arg);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ public void visit(final SuperExpr n, final Object arg) {
}

@Override
public void visit(final SwitchEntryStmt n, final Object arg) {
public void visit(final SwitchEntry n, final Object arg) {
doTest(n);
super.visit(n, arg);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,14 @@
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.nodeTypes.SwitchNode;
import com.github.javaparser.ast.observer.ObservableProperty;
import com.github.javaparser.ast.stmt.SwitchEntryStmt;
import com.github.javaparser.ast.stmt.SwitchEntry;
import com.github.javaparser.ast.visitor.CloneVisitor;
import com.github.javaparser.ast.visitor.GenericVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor;
import com.github.javaparser.metamodel.JavaParserMetaModel;
import com.github.javaparser.metamodel.SwitchExprMetaModel;

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

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

/**
Expand All @@ -51,30 +49,30 @@
* <br/><code>int a = switch(x) { case 5,6: break 20; default: break 5+5; };</code>
*
* @author Julio Vilmar Gesser
* @see SwitchEntryStmt
* @see SwitchEntry
* @see com.github.javaparser.ast.stmt.SwitchStmt
* @see SwitchNode
*/
public final class SwitchExpr extends Expression implements SwitchNode {

private Expression selector;

private NodeList<SwitchEntryStmt> entries;
private NodeList<SwitchEntry> entries;

public SwitchExpr() {
this(null, new NameExpr(), new NodeList<>());
}

@AllFieldsConstructor
public SwitchExpr(final Expression selector, final NodeList<SwitchEntryStmt> entries) {
public SwitchExpr(final Expression selector, final NodeList<SwitchEntry> entries) {
this(null, selector, entries);
}

/**
* This constructor is used by the parser and is considered private.
*/
@Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
public SwitchExpr(TokenRange tokenRange, Expression selector, NodeList<SwitchEntryStmt> entries) {
public SwitchExpr(TokenRange tokenRange, Expression selector, NodeList<SwitchEntry> entries) {
super(tokenRange);
setSelector(selector);
setEntries(entries);
Expand All @@ -94,11 +92,11 @@ public <A> void accept(final VoidVisitor<A> v, final A arg) {
}

@Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public NodeList<SwitchEntryStmt> getEntries() {
public NodeList<SwitchEntry> getEntries() {
return entries;
}

public SwitchEntryStmt getEntry(int i) {
public SwitchEntry getEntry(int i) {
return getEntries().get(i);
}

Expand All @@ -108,7 +106,7 @@ public Expression getSelector() {
}

@Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public SwitchExpr setEntries(final NodeList<SwitchEntryStmt> entries) {
public SwitchExpr setEntries(final NodeList<SwitchEntry> entries) {
assertNotNull(entries);
if (entries == this.entries) {
return (SwitchExpr) this;
Expand All @@ -125,7 +123,7 @@ public SwitchExpr setEntries(final NodeList<SwitchEntryStmt> entries) {
* @deprecated use a method on getEntries instead
*/
@Deprecated
public SwitchExpr setEntry(int i, SwitchEntryStmt entry) {
public SwitchExpr setEntry(int i, SwitchEntry entry) {
getEntries().set(i, entry);
return this;
}
Expand All @@ -134,7 +132,7 @@ public SwitchExpr setEntry(int i, SwitchEntryStmt entry) {
* @deprecated use a method on getEntries instead
*/
@Deprecated
public SwitchExpr addEntry(SwitchEntryStmt entry) {
public SwitchExpr addEntry(SwitchEntry entry) {
getEntries().add(entry);
return this;
}
Expand Down Expand Up @@ -180,7 +178,7 @@ public boolean replace(Node node, Node replacementNode) {
return false;
for (int i = 0; i < entries.size(); i++) {
if (entries.get(i) == node) {
entries.set(i, (SwitchEntryStmt) replacementNode);
entries.set(i, (SwitchEntry) replacementNode);
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,21 @@
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.comments.Comment;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.stmt.SwitchEntryStmt;
import com.github.javaparser.ast.stmt.SwitchEntry;

import java.util.Optional;

/**
* The common interface of {@link com.github.javaparser.ast.expr.SwitchExpr} and {@link com.github.javaparser.ast.stmt.SwitchStmt}
*/
public interface SwitchNode {
NodeList<SwitchEntryStmt> getEntries();
NodeList<SwitchEntry> getEntries();

SwitchEntryStmt getEntry(int i);
SwitchEntry getEntry(int i);

Expression getSelector();

SwitchNode setEntries(NodeList<SwitchEntryStmt> entries);
SwitchNode setEntries(NodeList<SwitchEntry> entries);

SwitchNode setSelector(Expression selector);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ public enum ObservableProperty {
ITERABLE(Type.SINGLE_REFERENCE),
KEYWORD(Type.SINGLE_ATTRIBUTE),
LABEL(Type.SINGLE_REFERENCE),
LABELS(Type.MULTIPLE_REFERENCE),
LEFT(Type.SINGLE_REFERENCE),
LEVELS(Type.MULTIPLE_REFERENCE),
MEMBERS(Type.MULTIPLE_REFERENCE),
Expand Down

0 comments on commit a896097

Please sign in to comment.