From 10821018fbff0e58e96dcd173b0d1730bd922480 Mon Sep 17 00:00:00 2001 From: Danny van Bruggen Date: Fri, 25 Jan 2019 21:52:37 +0100 Subject: [PATCH] Support multiple "case" labels --- .../core/other/TokenKindGenerator.java | 4 +- .../javaparser/ast/expr/SwitchExprTest.java | 4 +- .../javaparser/ast/stmt/SwitchStmtTest.java | 3 +- .../ast/validator/Java6ValidatorTest.java | 2 +- .../ast/observer/ObservableProperty.java | 1 + .../javaparser/ast/stmt/SwitchEntry.java | 88 ++++++++----------- .../ast/validator/Java1_0Validator.java | 4 +- .../javaparser/ast/visitor/CloneVisitor.java | 4 +- .../javaparser/ast/visitor/EqualsVisitor.java | 2 +- .../visitor/GenericListVisitorAdapter.java | 4 +- .../ast/visitor/GenericVisitorAdapter.java | 4 +- .../ast/visitor/HashCodeVisitor.java | 2 +- .../ast/visitor/ModifierVisitor.java | 4 +- .../ast/visitor/NoCommentEqualsVisitor.java | 2 +- .../ast/visitor/NoCommentHashCodeVisitor.java | 2 +- .../ast/visitor/VoidVisitorAdapter.java | 2 +- .../metamodel/JavaParserMetaModel.java | 6 +- .../metamodel/SwitchEntryMetaModel.java | 2 +- .../printer/ConcreteSyntaxModel.java | 4 +- .../printer/PrettyPrintVisitor.java | 21 +++-- javaparser-core/src/main/javacc/java.jj | 14 +-- .../resolution/EnumResolutionTest.java | 2 +- 22 files changed, 90 insertions(+), 91 deletions(-) diff --git a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java index 0acb02f229..5d5da891d1 100644 --- a/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java +++ b/javaparser-core-generators/src/main/java/com/github/javaparser/generator/core/other/TokenKindGenerator.java @@ -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(SwitchEntry.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.")); @@ -59,7 +59,7 @@ public void generate() { } private void generateValueOfEntry(SwitchStmt valueOfSwitch, String name, IntegerLiteralExpr kind) { - final SwitchEntry entry = new SwitchEntry(kind, SwitchEntry.Type.STATEMENT_GROUP, 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); } diff --git a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/expr/SwitchExprTest.java b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/expr/SwitchExprTest.java index de84f827ad..ec764210f0 100644 --- a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/expr/SwitchExprTest.java +++ b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/expr/SwitchExprTest.java @@ -11,9 +11,9 @@ class SwitchExprTest { @Test void jep325Example2() { parseStatement("int numLetters = switch (day) {\n" + -// " case MONDAY, FRIDAY, SUNDAY -> 6;\n" + + " case MONDAY, FRIDAY, SUNDAY -> 6;\n" + " case TUESDAY -> 7;\n" + -// " case THURSDAY, SATURDAY -> 8;\n" + + " case THURSDAY, SATURDAY -> 8;\n" + " case WEDNESDAY -> 9;\n" + "};"); } diff --git a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/stmt/SwitchStmtTest.java b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/stmt/SwitchStmtTest.java index ec83ab9e44..5b0f071fd6 100644 --- a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/stmt/SwitchStmtTest.java +++ b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/stmt/SwitchStmtTest.java @@ -1,5 +1,6 @@ package com.github.javaparser.ast.stmt; +import com.github.javaparser.ast.NodeList; import org.junit.jupiter.api.Test; import java.util.Optional; @@ -21,7 +22,7 @@ void classicSwitch() { assertEquals(STATEMENT_GROUP, switchStmt.getEntry(0).getType()); assertEquals(STATEMENT_GROUP, switchStmt.getEntry(1).getType()); assertEquals(STATEMENT_GROUP, switchStmt.getEntry(2).getType()); - assertEquals(Optional.empty(), switchStmt.getEntry(2).getLabel()); + assertEquals(new NodeList<>(), switchStmt.getEntry(2).getLabels()); } @Test void jep325Example1() { diff --git a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/validator/Java6ValidatorTest.java b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/validator/Java6ValidatorTest.java index 685c392160..8df235d834 100644 --- a/javaparser-core-testing/src/test/java/com/github/javaparser/ast/validator/Java6ValidatorTest.java +++ b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/validator/Java6ValidatorTest.java @@ -19,7 +19,7 @@ class Java6ValidatorTest { @Test void noStringsInSwitch() { ParseResult 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 diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/observer/ObservableProperty.java b/javaparser-core/src/main/java/com/github/javaparser/ast/observer/ObservableProperty.java index 866df82f1f..c708a65520 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/observer/ObservableProperty.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/observer/ObservableProperty.java @@ -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), diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchEntry.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchEntry.java index 4cea181cc2..fe359db473 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchEntry.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchEntry.java @@ -32,11 +32,7 @@ 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.OptionalProperty; import com.github.javaparser.metamodel.SwitchEntryMetaModel; - -import java.util.Optional; - import static com.github.javaparser.utils.Utils.assertNotNull; /** @@ -80,29 +76,28 @@ public enum Type { STATEMENT_GROUP, EXPRESSION, BLOCK, THROWS_STATEMENT } - @OptionalProperty - private Expression label; + private NodeList labels; private NodeList statements; private Type type; public SwitchEntry() { - this(null, null, new NodeList<>()); + this(null, new NodeList(), Type.STATEMENT_GROUP, new NodeList<>()); } @AllFieldsConstructor - public SwitchEntry(final Expression label, final Type type, final NodeList statements) { - this(null, label, type, statements); + public SwitchEntry(final NodeList labels, final Type type, final NodeList statements) { + this(null, labels, type, statements); } /** * This constructor is used by the parser and is considered private. */ @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator") - public SwitchEntry(TokenRange tokenRange, Expression label, Type type, NodeList statements) { + public SwitchEntry(TokenRange tokenRange, NodeList labels, Type type, NodeList statements) { super(tokenRange); - setLabel(label); + setLabels(labels); setType(type); setStatements(statements); customInitialization(); @@ -121,8 +116,8 @@ public void accept(final VoidVisitor v, final A arg) { } @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") - public Optional getLabel() { - return Optional.ofNullable(label); + public NodeList getLabels() { + return labels; } @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") @@ -133,19 +128,20 @@ public NodeList getStatements() { /** * Sets the label * - * @param label the label, can be null + * @param labels the label, can be null * @return this, the SwitchEntry */ @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") - public SwitchEntry setLabel(final Expression label) { - if (label == this.label) { + public SwitchEntry setLabels(final NodeList labels) { + assertNotNull(labels); + if (labels == this.labels) { return (SwitchEntry) this; } - notifyPropertyChange(ObservableProperty.LABEL, this.label, label); - if (this.label != null) - this.label.setParentNode(null); - this.label = label; - setAsParentNodeOf(label); + notifyPropertyChange(ObservableProperty.LABELS, this.labels, labels); + if (this.labels != null) + this.labels.setParentNode(null); + this.labels = labels; + setAsParentNodeOf(labels); return this; } @@ -168,9 +164,9 @@ public SwitchEntry setStatements(final NodeList statements) { public boolean remove(Node node) { if (node == null) return false; - if (label != null) { - if (node == label) { - removeLabel(); + for (int i = 0; i < labels.size(); i++) { + if (labels.get(i) == node) { + labels.remove(i); return true; } } @@ -183,11 +179,6 @@ public boolean remove(Node node) { return super.remove(node); } - @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") - public SwitchEntry removeLabel() { - return setLabel((Expression) null); - } - @Override @Generated("com.github.javaparser.generator.core.node.CloneGenerator") public SwitchEntry clone() { @@ -200,26 +191,6 @@ public SwitchEntryMetaModel getMetaModel() { return JavaParserMetaModel.switchEntryMetaModel; } - @Override - @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") - public boolean replace(Node node, Node replacementNode) { - if (node == null) - return false; - if (label != null) { - if (node == label) { - setLabel((Expression) replacementNode); - return true; - } - } - for (int i = 0; i < statements.size(); i++) { - if (statements.get(i) == node) { - statements.set(i, (Statement) replacementNode); - return true; - } - } - return super.replace(node, replacementNode); - } - @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") public Type getType() { return type; @@ -235,4 +206,23 @@ public SwitchEntry setType(final Type type) { this.type = type; return this; } + + @Override + public boolean replace(Node node, Node replacementNode) { + if (node == null) + return false; + for (int i = 0; i < labels.size(); i++) { + if (labels.get(i) == node) { + labels.set(i, (Expression) replacementNode); + return true; + } + } + for (int i = 0; i < statements.size(); i++) { + if (statements.get(i) == node) { + statements.set(i, (Statement) replacementNode); + return true; + } + } + return super.replace(node, replacementNode); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java1_0Validator.java b/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java1_0Validator.java index efb2ddaa36..485ce3f8be 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java1_0Validator.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/validator/Java1_0Validator.java @@ -80,8 +80,8 @@ public class Java1_0Validator extends Validators { (n, reporter) -> reporter.report(n, "Static imports are not supported.") ); protected final Validator noStringsInSwitch = new SimpleValidator<>(SwitchEntry.class, - n -> n.getLabel().map(l -> l instanceof StringLiteralExpr).orElse(false), - (n, reporter) -> reporter.report(n.getLabel().get(), "Strings in switch statements are not supported.") + n -> n.getLabels().stream().anyMatch(l -> l instanceof StringLiteralExpr), + (n, reporter) -> reporter.report(n.getLabels().getParentNode().get(), "Strings in switch statements are not supported.") ); protected final Validator noBinaryIntegerLiterals = new NoBinaryIntegerLiteralsValidator(); protected final Validator noUnderscoresInIntegerLiterals = new NoUnderscoresInIntegerLiteralsValidator(); diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java index 4208ab06dd..722d7b0520 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/CloneVisitor.java @@ -702,10 +702,10 @@ public Visitable visit(final SwitchStmt n, final Object arg) { @Override public Visitable visit(final SwitchEntry n, final Object arg) { - Expression label = cloneNode(n.getLabel(), arg); + NodeList labels = cloneList(n.getLabels(), arg); NodeList statements = cloneList(n.getStatements(), arg); Comment comment = cloneNode(n.getComment(), arg); - SwitchEntry r = new SwitchEntry(n.getTokenRange().orElse(null), label, n.getType(), statements); + SwitchEntry r = new SwitchEntry(n.getTokenRange().orElse(null), labels, n.getType(), statements); r.setComment(comment); return r; } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java index b2e2249e85..f010605ade 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/EqualsVisitor.java @@ -974,7 +974,7 @@ public Boolean visit(final SwitchStmt n, final Visitable arg) { @Override public Boolean visit(final SwitchEntry n, final Visitable arg) { final SwitchEntry n2 = (SwitchEntry) arg; - if (!nodeEquals(n.getLabel(), n2.getLabel())) + if (!nodesEquals(n.getLabels(), n2.getLabels())) return false; if (!nodesEquals(n.getStatements(), n2.getStatements())) return false; diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java index 24761041a6..6efacfa0c3 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericListVisitorAdapter.java @@ -1487,8 +1487,8 @@ public List visit(final SuperExpr n, final A arg) { public List visit(final SwitchEntry n, final A arg) { List result = new ArrayList<>(); List tmp; - if (n.getLabel().isPresent()) { - tmp = n.getLabel().get().accept(this, arg); + { + tmp = n.getLabels().accept(this, arg); if (tmp != null) result.addAll(tmp); } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java index 9fb5d3d4f0..28f137a01a 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorAdapter.java @@ -1408,8 +1408,8 @@ public R visit(final SuperExpr n, final A arg) { @Override public R visit(final SwitchEntry n, final A arg) { R result; - if (n.getLabel().isPresent()) { - result = n.getLabel().get().accept(this, arg); + { + result = n.getLabels().accept(this, arg); if (result != null) return result; } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java index 73b680ad64..d8b1e1ab56 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/HashCodeVisitor.java @@ -319,7 +319,7 @@ public Integer visit(final SuperExpr n, final Void arg) { } public Integer visit(final SwitchEntry n, final Void arg) { - return (n.getLabel().isPresent() ? n.getLabel().get().accept(this, arg) : 0) * 31 + (n.getStatements().accept(this, arg)) * 31 + (n.getType().hashCode()) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0); + return (n.getLabels().accept(this, arg)) * 31 + (n.getStatements().accept(this, arg)) * 31 + (n.getType().hashCode()) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0); } public Integer visit(final SwitchStmt n, final Void arg) { diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java index 5b413045a1..47ff0710f4 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ModifierVisitor.java @@ -837,10 +837,10 @@ public Visitable visit(final SuperExpr n, final A arg) { @Override public Visitable visit(final SwitchEntry n, final A arg) { - Expression label = n.getLabel().map(s -> (Expression) s.accept(this, arg)).orElse(null); + NodeList labels = modifyList(n.getLabels(), arg); NodeList statements = modifyList(n.getStatements(), arg); Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null); - n.setLabel(label); + n.setLabels(labels); n.setStatements(statements); n.setComment(comment); return n; diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java index 60e4f1bf26..17cddfe145 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentEqualsVisitor.java @@ -792,7 +792,7 @@ public Boolean visit(final SwitchStmt n, final Visitable arg) { @Override public Boolean visit(final SwitchEntry n, final Visitable arg) { final SwitchEntry n2 = (SwitchEntry) arg; - if (!nodeEquals(n.getLabel(), n2.getLabel())) + if (!nodesEquals(n.getLabels(), n2.getLabels())) return false; if (!nodesEquals(n.getStatements(), n2.getStatements())) return false; diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java index 76e206e9b4..7ef7f3c421 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/NoCommentHashCodeVisitor.java @@ -311,7 +311,7 @@ public Integer visit(final SuperExpr n, final Void arg) { } public Integer visit(final SwitchEntry n, final Void arg) { - return (n.getLabel().isPresent() ? n.getLabel().get().accept(this, arg) : 0) * 31 + (n.getStatements().accept(this, arg)) * 31 + (n.getType().hashCode()); + return (n.getLabels().accept(this, arg)) * 31 + (n.getStatements().accept(this, arg)) * 31 + (n.getType().hashCode()); } public Integer visit(final SwitchStmt n, final Void arg) { diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java index 88005bab73..2e2d354468 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorAdapter.java @@ -494,7 +494,7 @@ public void visit(final SuperExpr n, final A arg) { @Override public void visit(final SwitchEntry n, final A arg) { - n.getLabel().ifPresent(l -> l.accept(this, arg)); + n.getLabels().forEach(p -> p.accept(this, arg)); n.getStatements().forEach(p -> p.accept(this, arg)); n.getComment().ifPresent(l -> l.accept(this, arg)); } diff --git a/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java b/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java index bb6ce113f7..07294dc975 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java +++ b/javaparser-core/src/main/java/com/github/javaparser/metamodel/JavaParserMetaModel.java @@ -202,7 +202,7 @@ private static void initializeConstructorParameters() { labeledStmtMetaModel.getConstructorParameters().add(labeledStmtMetaModel.labelPropertyMetaModel); labeledStmtMetaModel.getConstructorParameters().add(labeledStmtMetaModel.statementPropertyMetaModel); returnStmtMetaModel.getConstructorParameters().add(returnStmtMetaModel.expressionPropertyMetaModel); - switchEntryMetaModel.getConstructorParameters().add(switchEntryMetaModel.labelPropertyMetaModel); + switchEntryMetaModel.getConstructorParameters().add(switchEntryMetaModel.labelsPropertyMetaModel); switchEntryMetaModel.getConstructorParameters().add(switchEntryMetaModel.typePropertyMetaModel); switchEntryMetaModel.getConstructorParameters().add(switchEntryMetaModel.statementsPropertyMetaModel); switchStmtMetaModel.getConstructorParameters().add(switchStmtMetaModel.selectorPropertyMetaModel); @@ -683,8 +683,8 @@ private static void initializePropertyMetaModels() { labeledStmtMetaModel.getDeclaredPropertyMetaModels().add(labeledStmtMetaModel.statementPropertyMetaModel); returnStmtMetaModel.expressionPropertyMetaModel = new PropertyMetaModel(returnStmtMetaModel, "expression", com.github.javaparser.ast.expr.Expression.class, Optional.of(expressionMetaModel), true, false, false, false); returnStmtMetaModel.getDeclaredPropertyMetaModels().add(returnStmtMetaModel.expressionPropertyMetaModel); - switchEntryMetaModel.labelPropertyMetaModel = new PropertyMetaModel(switchEntryMetaModel, "label", com.github.javaparser.ast.expr.Expression.class, Optional.of(expressionMetaModel), true, false, false, false); - switchEntryMetaModel.getDeclaredPropertyMetaModels().add(switchEntryMetaModel.labelPropertyMetaModel); + switchEntryMetaModel.labelsPropertyMetaModel = new PropertyMetaModel(switchEntryMetaModel, "labels", com.github.javaparser.ast.expr.Expression.class, Optional.of(expressionMetaModel), false, false, true, false); + switchEntryMetaModel.getDeclaredPropertyMetaModels().add(switchEntryMetaModel.labelsPropertyMetaModel); switchEntryMetaModel.statementsPropertyMetaModel = new PropertyMetaModel(switchEntryMetaModel, "statements", com.github.javaparser.ast.stmt.Statement.class, Optional.of(statementMetaModel), false, false, true, false); switchEntryMetaModel.getDeclaredPropertyMetaModels().add(switchEntryMetaModel.statementsPropertyMetaModel); switchEntryMetaModel.typePropertyMetaModel = new PropertyMetaModel(switchEntryMetaModel, "type", com.github.javaparser.ast.stmt.SwitchEntry.Type.class, Optional.empty(), false, false, false, false); diff --git a/javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchEntryMetaModel.java b/javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchEntryMetaModel.java index 5f939e3c72..27eb8826df 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchEntryMetaModel.java +++ b/javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchEntryMetaModel.java @@ -8,7 +8,7 @@ public class SwitchEntryMetaModel extends NodeMetaModel { super(superBaseNodeMetaModel, com.github.javaparser.ast.stmt.SwitchEntry.class, "SwitchEntry", "com.github.javaparser.ast.stmt", false, false); } - public PropertyMetaModel labelPropertyMetaModel; + public PropertyMetaModel labelsPropertyMetaModel; public PropertyMetaModel statementsPropertyMetaModel; diff --git a/javaparser-core/src/main/java/com/github/javaparser/printer/ConcreteSyntaxModel.java b/javaparser-core/src/main/java/com/github/javaparser/printer/ConcreteSyntaxModel.java index d06fd93ebc..9866f589f2 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/printer/ConcreteSyntaxModel.java +++ b/javaparser-core/src/main/java/com/github/javaparser/printer/ConcreteSyntaxModel.java @@ -674,8 +674,8 @@ private static CsmElement typeArguments() { concreteSyntaxModelByClass.put(SwitchEntry.class, sequence( comment(), - conditional(ObservableProperty.LABEL, IS_PRESENT, - sequence(token(GeneratedJavaParserConstants.CASE), space(), child(ObservableProperty.LABEL), token(GeneratedJavaParserConstants.COLON)), + conditional(ObservableProperty.LABELS, IS_NOT_EMPTY, + sequence(token(GeneratedJavaParserConstants.CASE), space(), list(ObservableProperty.LABELS), token(GeneratedJavaParserConstants.COLON)), sequence(token(GeneratedJavaParserConstants._DEFAULT), token(GeneratedJavaParserConstants.COLON))), newline(), indent(), diff --git a/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java index ccc4c218c8..9738b4054b 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/printer/PrettyPrintVisitor.java @@ -1101,12 +1101,19 @@ private void printSwitchNode(SwitchNode n, Void arg) { @Override public void visit(final SwitchEntry n, final Void arg) { printComment(n.getComment(), arg); - if (n.getLabel().isPresent()) { + + if (isNullOrEmpty(n.getLabels())) { + printer.print("default:"); + } else { printer.print("case "); - n.getLabel().get().accept(this, arg); + for (final Iterator i = n.getLabels().iterator(); i.hasNext(); ) { + final Expression label = i.next(); + label.accept(this, arg); + if (i.hasNext()) { + printer.print(", "); + } + } printer.print(":"); - } else { - printer.print("default:"); } printer.println(); printer.indent(); @@ -1642,8 +1649,7 @@ private void printOrphanCommentsBeforeThisChildNode(final Node node) { Node parent = node.getParentNode().orElse(null); if (parent == null) return; - List everything = new LinkedList<>(); - everything.addAll(parent.getChildNodes()); + List everything = new LinkedList<>(parent.getChildNodes()); sortByBeginPosition(everything); int positionOfTheChild = -1; for (int i = 0; i < everything.size(); i++) { @@ -1669,8 +1675,7 @@ private void printOrphanCommentsBeforeThisChildNode(final Node node) { private void printOrphanCommentsEnding(final Node node) { if (configuration.isIgnoreComments()) return; - List everything = new LinkedList<>(); - everything.addAll(node.getChildNodes()); + List everything = new ArrayList<>(node.getChildNodes()); sortByBeginPosition(everything); if (everything.isEmpty()) { return; diff --git a/javaparser-core/src/main/javacc/java.jj b/javaparser-core/src/main/javacc/java.jj index 589b7e1f94..92a4d0cc48 100644 --- a/javaparser-core/src/main/javacc/java.jj +++ b/javaparser-core/src/main/javacc/java.jj @@ -2248,7 +2248,8 @@ SwitchExpr SwitchExpression(): SwitchEntry SwitchEntry(): { Expression label = null; - NodeList stmts = new NodeList(); + NodeList labels = emptyList(); + NodeList stmts = emptyList(); JavaToken begin; SwitchEntry ret; Expression expression = null; @@ -2256,31 +2257,32 @@ SwitchEntry SwitchEntry(): } { ( - "case" {begin=token();} label = ConditionalExpression() + "case" {begin=token();} label = ConditionalExpression() { labels = add(labels, label); } + ( "," label = ConditionalExpression() { labels = add(labels, label); } )* | "default" {begin=token();} ) ( - ":" stmts = Statements() { ret = new SwitchEntry(range(begin, token()), label, STATEMENT_GROUP, stmts); } + ":" stmts = Statements() { ret = new SwitchEntry(range(begin, token()), labels, STATEMENT_GROUP, stmts); } | "->" ( expression = Expression() ";" { TokenRange r=range(begin, token()); stmts.add(new ExpressionStmt(r, expression)); - ret = new SwitchEntry(r, label, EXPRESSION, stmts); + ret = new SwitchEntry(r, labels, EXPRESSION, stmts); } | stmt = Block() { TokenRange r=range(begin, token()); stmts.add(stmt); - ret = new SwitchEntry(r, label, BLOCK, stmts); + ret = new SwitchEntry(r, labels, BLOCK, stmts); } | stmt = ThrowStatement() { TokenRange r=range(begin, token()); stmts.add(stmt); - ret = new SwitchEntry(r, label, THROWS_STATEMENT, stmts); + ret = new SwitchEntry(r, labels, THROWS_STATEMENT, stmts); } ) ) diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java index d88faf0422..cf22f8641f 100644 --- a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/EnumResolutionTest.java @@ -46,7 +46,7 @@ void switchOnEnum() { com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "SwitchOnEnum"); MethodDeclaration method = Navigator.demandMethod(clazz, "foo"); SwitchStmt switchStmt = Navigator.findSwitch(method); - Expression expression = switchStmt.getEntries().get(0).getLabel().get(); + Expression expression = switchStmt.getEntries().get(0).getLabels().get(0); SymbolReference ref = JavaParserFacade.get(new ReflectionTypeSolver()).solve(expression); assertTrue(ref.isSolved());