From f43d066490283dd54a0d816d8153711866c8f647 Mon Sep 17 00:00:00 2001 From: Danny van Bruggen Date: Fri, 4 Jan 2019 22:35:58 +0100 Subject: [PATCH] Add SwitchExpr --- .../metamodel/MetaModelGenerator.java | 1 + .../javaparser/ast/expr/SwitchExprTest.java | 87 ++++++++ .../javaparser/ast/expr/Expression.java | 15 ++ .../javaparser/ast/expr/LambdaExpr.java | 3 - .../javaparser/ast/expr/SwitchExpr.java | 211 ++++++++++++++++++ .../javaparser/ast/nodeTypes/SwitchNode.java | 35 +++ .../javaparser/ast/stmt/SwitchStmt.java | 5 +- .../javaparser/ast/visitor/CloneVisitor.java | 10 + .../javaparser/ast/visitor/EqualsVisitor.java | 12 + .../visitor/GenericListVisitorAdapter.java | 22 ++ .../ast/visitor/GenericVisitor.java | 2 + .../ast/visitor/GenericVisitorAdapter.java | 21 ++ .../visitor/GenericVisitorWithDefaults.java | 5 + .../ast/visitor/HashCodeVisitor.java | 5 + .../ast/visitor/ModifierVisitor.java | 13 ++ .../ast/visitor/NoCommentEqualsVisitor.java | 10 + .../ast/visitor/NoCommentHashCodeVisitor.java | 5 + .../visitor/ObjectIdentityEqualsVisitor.java | 5 + .../ObjectIdentityHashCodeVisitor.java | 5 + .../javaparser/ast/visitor/VoidVisitor.java | 2 + .../ast/visitor/VoidVisitorAdapter.java | 7 + .../ast/visitor/VoidVisitorWithDefaults.java | 5 + .../metamodel/JavaParserMetaModel.java | 9 + .../metamodel/SwitchExprMetaModel.java | 14 ++ .../printer/ConcreteSyntaxModel.java | 13 ++ .../printer/PrettyPrintVisitor.java | 14 +- javaparser-core/src/main/javacc/java.jj | 39 +++- .../DefaultVisitorAdapter.java | 5 + 28 files changed, 561 insertions(+), 19 deletions(-) create mode 100644 javaparser-core-testing/src/test/java/com/github/javaparser/ast/expr/SwitchExprTest.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/expr/SwitchExpr.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/SwitchNode.java create mode 100644 javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchExprMetaModel.java diff --git a/javaparser-core-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java b/javaparser-core-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java index b6093df91d..ceb94508cd 100644 --- a/javaparser-core-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java +++ b/javaparser-core-metamodel-generator/src/main/java/com/github/javaparser/generator/metamodel/MetaModelGenerator.java @@ -107,6 +107,7 @@ public class MetaModelGenerator { add(TypeExpr.class); add(UnaryExpr.class); add(VariableDeclarationExpr.class); + add(SwitchExpr.class); add(ImportDeclaration.class); 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 new file mode 100644 index 0000000000..fbc4460c71 --- /dev/null +++ b/javaparser-core-testing/src/test/java/com/github/javaparser/ast/expr/SwitchExprTest.java @@ -0,0 +1,87 @@ +package com.github.javaparser.ast.expr; + +import com.github.javaparser.JavaParser; +import org.junit.jupiter.api.Disabled; +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" + + "}};"); + } + + @Disabled("to be implemented") + @Test + void jep325Example2() { + JavaParser.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" + + "};"); + } + + @Disabled("to be implemented") + @Test + void jep325Example3() { + JavaParser.parseBodyDeclaration("static void howMany(int k) {\n" + + " switch (k) {\n" + + " case 1 -> System.out.println(\"one\");\n" + + " case 2 -> System.out.println(\"two\");\n" + + " case 3 -> System.out.println(\"many\");\n" + + " }\n" + + "}"); + } + + @Disabled("to be implemented") + @Test + void jep325Example4() { + JavaParser.parseStatement("T result = switch (arg) {\n" + + " case L1 -> e1;\n" + + " case L2 -> e2;\n" + + " default -> e3;\n" + + "};"); + } + + @Disabled("to be implemented") + @Test + void jep325Example5() { + JavaParser.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" + + "};"); + } + + @Disabled("to be implemented") + @Test + void jep325Example6() { + JavaParser.parseStatement("int result = switch (s) {\n" + + " case \"Foo\": \n" + + " break 1;\n" + + " case \"Bar\":\n" + + " break 2;\n" + + " default:\n" + + " System.out.println(\"Neither Foo nor Bar, hmmm...\");\n" + + " break 0;\n" + + "};"); + } + + @Test + void placeholderTest() { + JavaParser.parseStatement("int result = switch (s) {\n" + + " case \"Foo\": \n" + + " break;\n" + + "};"); + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/Expression.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/Expression.java index c4cae6a80e..ac50dd6dc2 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/Expression.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/Expression.java @@ -733,4 +733,19 @@ public Optional toUnaryExpr() { public Optional toVariableDeclarationExpr() { return Optional.empty(); } + + public boolean isSwitchExpr() { + return false; + } + + public SwitchExpr asSwitchExpr() { + throw new IllegalStateException(f("%s is not an SwitchExpr", this)); + } + + public Optional toSwitchExpr() { + return Optional.empty(); + } + + public void ifSwitchExpr(Consumer action) { + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java index f2e77d8d8c..f211a832a7 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LambdaExpr.java @@ -38,10 +38,8 @@ import com.github.javaparser.metamodel.DerivedProperty; import com.github.javaparser.metamodel.JavaParserMetaModel; import com.github.javaparser.metamodel.LambdaExprMetaModel; - import java.util.Optional; import java.util.function.Consumer; - import static com.github.javaparser.utils.Utils.assertNotNull; /** @@ -86,7 +84,6 @@ public LambdaExpr(NodeList parameters, BlockStmt body) { this(null, parameters, body, true); } - /** * Creates a single parameter lambda expression. */ diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/SwitchExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/SwitchExpr.java new file mode 100644 index 0000000000..e004ac09c5 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/SwitchExpr.java @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser. + * Copyright (C) 2011, 2013-2016 The JavaParser Team. + * + * This file is part of JavaParser. + * + * JavaParser can be used either under the terms of + * a) the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * b) the terms of the Apache License + * + * You should have received a copy of both licenses in LICENCE.LGPL and + * LICENCE.APACHE. Please refer to those files for details. + * + * JavaParser is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ +package com.github.javaparser.ast.expr; + +import com.github.javaparser.TokenRange; +import com.github.javaparser.ast.AllFieldsConstructor; +import com.github.javaparser.ast.Generated; +import com.github.javaparser.ast.Node; +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.Statement; +import com.github.javaparser.ast.stmt.SwitchEntryStmt; +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.SwitchStmtMetaModel; +import java.util.Optional; +import java.util.function.Consumer; +import static com.github.javaparser.utils.Utils.assertNotNull; +import com.github.javaparser.metamodel.SwitchExprMetaModel; + +/** + * A switch expression. + *
In switch(a) { ... } the selector is "a", + * and the contents of the { ... } are the entries. + * + * @author Julio Vilmar Gesser + * @see SwitchEntryStmt + * @see com.github.javaparser.ast.stmt.SwitchStmt + * @see SwitchNode + */ +public final class SwitchExpr extends Expression implements SwitchNode { + + private Expression selector; + + private NodeList entries; + + public SwitchExpr() { + this(null, new NameExpr(), new NodeList<>()); + } + + @AllFieldsConstructor + public SwitchExpr(final Expression selector, final NodeList 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 entries) { + super(tokenRange); + setSelector(selector); + setEntries(entries); + customInitialization(); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") + public R accept(final GenericVisitor v, final A arg) { + return v.visit(this, arg); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") + public void accept(final VoidVisitor v, final A arg) { + v.visit(this, arg); + } + + @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") + public NodeList getEntries() { + return entries; + } + + public SwitchEntryStmt getEntry(int i) { + return getEntries().get(i); + } + + @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") + public Expression getSelector() { + return selector; + } + + @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") + public SwitchExpr setEntries(final NodeList entries) { + assertNotNull(entries); + if (entries == this.entries) { + return (SwitchExpr) this; + } + notifyPropertyChange(ObservableProperty.ENTRIES, this.entries, entries); + if (this.entries != null) + this.entries.setParentNode(null); + this.entries = entries; + setAsParentNodeOf(entries); + return this; + } + + /** + * @deprecated use a method on getEntries instead + */ + @Deprecated + public SwitchExpr setEntry(int i, SwitchEntryStmt entry) { + getEntries().set(i, entry); + return this; + } + + /** + * @deprecated use a method on getEntries instead + */ + @Deprecated + public SwitchExpr addEntry(SwitchEntryStmt entry) { + getEntries().add(entry); + return this; + } + + @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") + public SwitchExpr setSelector(final Expression selector) { + assertNotNull(selector); + if (selector == this.selector) { + return (SwitchExpr) this; + } + notifyPropertyChange(ObservableProperty.SELECTOR, this.selector, selector); + if (this.selector != null) + this.selector.setParentNode(null); + this.selector = selector; + setAsParentNodeOf(selector); + return this; + } + + @Override + @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") + public boolean remove(Node node) { + if (node == null) + return false; + for (int i = 0; i < entries.size(); i++) { + if (entries.get(i) == node) { + entries.remove(i); + return true; + } + } + return super.remove(node); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.CloneGenerator") + public SwitchExpr clone() { + return (SwitchExpr) accept(new CloneVisitor(), null); + } + + @Override + @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") + public boolean replace(Node node, Node replacementNode) { + if (node == null) + return false; + for (int i = 0; i < entries.size(); i++) { + if (entries.get(i) == node) { + entries.set(i, (SwitchEntryStmt) replacementNode); + return true; + } + } + if (node == selector) { + setSelector((Expression) replacementNode); + return true; + } + return super.replace(node, replacementNode); + } + + @Override + public boolean isSwitchExpr() { + return true; + } + + @Override + public SwitchExpr asSwitchExpr() { + return this; + } + + @Override + public Optional toSwitchExpr() { + return Optional.of(this); + } + + public void ifSwitchExpr(Consumer action) { + action.accept(this); + } + + @Override + public SwitchExprMetaModel getMetaModel() { + return JavaParserMetaModel.switchExprMetaModel; + } +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/SwitchNode.java b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/SwitchNode.java new file mode 100644 index 0000000000..36147ae091 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/nodeTypes/SwitchNode.java @@ -0,0 +1,35 @@ +package com.github.javaparser.ast.nodeTypes; + +import com.github.javaparser.ast.Node; +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 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 getEntries(); + + SwitchEntryStmt getEntry(int i); + + Expression getSelector(); + + SwitchNode setEntries(NodeList entries); + + SwitchNode setSelector(Expression selector); + + boolean remove(Node node); + + SwitchNode clone(); + + boolean replace(Node node, Node replacementNode); + + Optional getComment(); + + // Too bad Node isn't an interface, or this could have easily inherited all of its methods. + // Add more when required. +} diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchStmt.java b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchStmt.java index 2a9dc1cdc0..7c699c0336 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchStmt.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/stmt/SwitchStmt.java @@ -24,6 +24,7 @@ import com.github.javaparser.ast.NodeList; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.NameExpr; +import com.github.javaparser.ast.nodeTypes.SwitchNode; import com.github.javaparser.ast.observer.ObservableProperty; import com.github.javaparser.ast.visitor.GenericVisitor; import com.github.javaparser.ast.visitor.VoidVisitor; @@ -44,8 +45,10 @@ * * @author Julio Vilmar Gesser * @see SwitchEntryStmt + * @see com.github.javaparser.ast.expr.SwitchExpr + * @see SwitchNode */ -public final class SwitchStmt extends Statement { +public final class SwitchStmt extends Statement implements SwitchNode { private Expression selector; 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 92ece4def0..5716390429 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 @@ -1005,4 +1005,14 @@ public Visitable visit(final Modifier n, final Object arg) { r.setComment(comment); return r; } + + @Override + public Visitable visit(final SwitchExpr n, final Object arg) { + NodeList entries = cloneList(n.getEntries(), arg); + Expression selector = cloneNode(n.getSelector(), arg); + Comment comment = cloneNode(n.getComment(), arg); + SwitchExpr r = new SwitchExpr(n.getTokenRange().orElse(null), selector, entries); + 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 43072dc7aa..376b2049d6 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 @@ -1303,4 +1303,16 @@ public Boolean visit(final Modifier n, final Visitable arg) { return false; return true; } + + @Override + public Boolean visit(final SwitchExpr n, final Visitable arg) { + final SwitchExpr n2 = (SwitchExpr) arg; + if (!nodesEquals(n.getEntries(), n2.getEntries())) + return false; + if (!nodeEquals(n.getSelector(), n2.getSelector())) + return false; + if (!nodeEquals(n.getComment(), n2.getComment())) + return false; + return true; + } } 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 266d98cf16..033226022a 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 @@ -2024,4 +2024,26 @@ public List visit(final Modifier n, final A arg) { } return result; } + + @Override + public List visit(final SwitchExpr n, final A arg) { + List result = new ArrayList<>(); + List tmp; + { + tmp = n.getEntries().accept(this, arg); + if (tmp != null) + result.addAll(tmp); + } + { + tmp = n.getSelector().accept(this, arg); + if (tmp != null) + result.addAll(tmp); + } + if (n.getComment().isPresent()) { + tmp = n.getComment().get().accept(this, arg); + if (tmp != null) + result.addAll(tmp); + } + return result; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java index 24b81218ed..e00eff7e96 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitor.java @@ -227,4 +227,6 @@ public interface GenericVisitor { R visit(VarType n, A arg); R visit(Modifier n, A arg); + + R visit(SwitchExpr n, A arg); } 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 a7797340b1..03633e7910 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 @@ -2016,4 +2016,25 @@ public R visit(final Modifier n, final A arg) { } return null; } + + @Override + public R visit(final SwitchExpr n, final A arg) { + R result; + { + result = n.getEntries().accept(this, arg); + if (result != null) + return result; + } + { + result = n.getSelector().accept(this, arg); + if (result != null) + return result; + } + if (n.getComment().isPresent()) { + result = n.getComment().get().accept(this, arg); + if (result != null) + return result; + } + return null; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java index 37ff2e0ca9..456e791b72 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/GenericVisitorWithDefaults.java @@ -514,4 +514,9 @@ public R visit(final VarType n, final A arg) { public R visit(final Modifier n, final A arg) { return defaultAction(n, arg); } + + @Override + public R visit(final SwitchExpr n, final A arg) { + return defaultAction(n, arg); + } } 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 0ac40dbd6b..77e0fa9771 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 @@ -429,4 +429,9 @@ public Integer visit(final VarType n, final Void arg) { public Integer visit(final Modifier n, final Void arg) { return (n.getKeyword().hashCode()) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0); } + + @Override + public Integer visit(final SwitchExpr n, final Void arg) { + return (n.getEntries().accept(this, arg)) * 31 + (n.getSelector().accept(this, arg)) * 31 + (n.getComment().isPresent() ? n.getComment().get().accept(this, arg) : 0); + } } 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 e8b9a984a9..8c990e9dcb 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 @@ -1228,4 +1228,17 @@ public Visitable visit(final Modifier n, final A arg) { n.setComment(comment); return n; } + + @Override + public Visitable visit(final SwitchExpr n, final A arg) { + NodeList entries = modifyList(n.getEntries(), arg); + Expression selector = (Expression) n.getSelector().accept(this, arg); + Comment comment = n.getComment().map(s -> (Comment) s.accept(this, arg)).orElse(null); + if (selector == null) + return null; + n.setEntries(entries); + n.setSelector(selector); + 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 ab42ae2fc9..5b2a46588f 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 @@ -1066,4 +1066,14 @@ public Boolean visit(final Modifier n, final Visitable arg) { return false; return true; } + + @Override + public Boolean visit(final SwitchExpr n, final Visitable arg) { + final SwitchExpr n2 = (SwitchExpr) arg; + if (!nodesEquals(n.getEntries(), n2.getEntries())) + return false; + if (!nodeEquals(n.getSelector(), n2.getSelector())) + return false; + return true; + } } 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 ab598f2eca..699db416a7 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 @@ -421,4 +421,9 @@ public Integer visit(final VarType n, final Void arg) { public Integer visit(final Modifier n, final Void arg) { return (n.getKeyword().hashCode()); } + + @Override + public Integer visit(final SwitchExpr n, final Void arg) { + return (n.getEntries().accept(this, arg)) * 31 + (n.getSelector().accept(this, arg)); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java index 53ff82b121..441d3cd13f 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityEqualsVisitor.java @@ -507,4 +507,9 @@ public Boolean visit(final VarType n, final Visitable arg) { public Boolean visit(final Modifier n, final Visitable arg) { return n == arg; } + + @Override + public Boolean visit(final SwitchExpr n, final Visitable arg) { + return n == arg; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java index 631a06b258..64e5691202 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/ObjectIdentityHashCodeVisitor.java @@ -421,4 +421,9 @@ public Integer visit(final VarType n, final Void arg) { public Integer visit(final Modifier n, final Void arg) { return n.hashCode(); } + + @Override + public Integer visit(final SwitchExpr n, final Void arg) { + return n.hashCode(); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java index ca1160baed..5024a637ce 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitor.java @@ -222,4 +222,6 @@ public interface VoidVisitor { void visit(VarType n, A arg); void visit(Modifier n, A arg); + + void visit(SwitchExpr switchExpr, A 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 b7cb85e240..0958549db8 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 @@ -693,4 +693,11 @@ public void visit(final VarType n, final A arg) { public void visit(final Modifier n, final A arg) { n.getComment().ifPresent(l -> l.accept(this, arg)); } + + @Override + public void visit(final SwitchExpr n, final A arg) { + n.getEntries().forEach(p -> p.accept(this, arg)); + n.getSelector().accept(this, arg); + n.getComment().ifPresent(l -> l.accept(this, arg)); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java index ffd5ee814e..4c03d1f835 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/visitor/VoidVisitorWithDefaults.java @@ -510,4 +510,9 @@ public void visit(final Modifier n, final A arg) { public void visit(final VarType n, final A arg) { defaultAction(n, arg); } + + @Override + public void visit(final SwitchExpr n, final A arg) { + defaultAction(n, 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 4a081d9b57..b69fd33ce5 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 @@ -170,6 +170,8 @@ private static void initializeConstructorParameters() { variableDeclarationExprMetaModel.getConstructorParameters().add(variableDeclarationExprMetaModel.modifiersPropertyMetaModel); variableDeclarationExprMetaModel.getConstructorParameters().add(variableDeclarationExprMetaModel.annotationsPropertyMetaModel); variableDeclarationExprMetaModel.getConstructorParameters().add(variableDeclarationExprMetaModel.variablesPropertyMetaModel); + switchExprMetaModel.getConstructorParameters().add(switchExprMetaModel.selectorPropertyMetaModel); + switchExprMetaModel.getConstructorParameters().add(switchExprMetaModel.entriesPropertyMetaModel); importDeclarationMetaModel.getConstructorParameters().add(importDeclarationMetaModel.namePropertyMetaModel); importDeclarationMetaModel.getConstructorParameters().add(importDeclarationMetaModel.isStaticPropertyMetaModel); importDeclarationMetaModel.getConstructorParameters().add(importDeclarationMetaModel.isAsteriskPropertyMetaModel); @@ -333,6 +335,7 @@ private static void initializeNodeMetaModels() { nodeMetaModels.add(stringLiteralExprMetaModel); nodeMetaModels.add(superExprMetaModel); nodeMetaModels.add(switchEntryStmtMetaModel); + nodeMetaModels.add(switchExprMetaModel); nodeMetaModels.add(switchStmtMetaModel); nodeMetaModels.add(synchronizedStmtMetaModel); nodeMetaModels.add(thisExprMetaModel); @@ -605,6 +608,10 @@ private static void initializePropertyMetaModels() { variableDeclarationExprMetaModel.getDeclaredPropertyMetaModels().add(variableDeclarationExprMetaModel.variablesPropertyMetaModel); variableDeclarationExprMetaModel.maximumCommonTypePropertyMetaModel = new PropertyMetaModel(variableDeclarationExprMetaModel, "maximumCommonType", com.github.javaparser.ast.type.Type.class, Optional.of(typeMetaModel), true, false, false, false); variableDeclarationExprMetaModel.getDerivedPropertyMetaModels().add(variableDeclarationExprMetaModel.maximumCommonTypePropertyMetaModel); + switchExprMetaModel.entriesPropertyMetaModel = new PropertyMetaModel(switchExprMetaModel, "entries", com.github.javaparser.ast.stmt.SwitchEntryStmt.class, Optional.of(switchEntryStmtMetaModel), false, false, true, false); + switchExprMetaModel.getDeclaredPropertyMetaModels().add(switchExprMetaModel.entriesPropertyMetaModel); + switchExprMetaModel.selectorPropertyMetaModel = new PropertyMetaModel(switchExprMetaModel, "selector", com.github.javaparser.ast.expr.Expression.class, Optional.of(expressionMetaModel), false, false, false, false); + switchExprMetaModel.getDeclaredPropertyMetaModels().add(switchExprMetaModel.selectorPropertyMetaModel); importDeclarationMetaModel.isAsteriskPropertyMetaModel = new PropertyMetaModel(importDeclarationMetaModel, "isAsterisk", boolean.class, Optional.empty(), false, false, false, false); importDeclarationMetaModel.getDeclaredPropertyMetaModels().add(importDeclarationMetaModel.isAsteriskPropertyMetaModel); importDeclarationMetaModel.isStaticPropertyMetaModel = new PropertyMetaModel(importDeclarationMetaModel, "isStatic", boolean.class, Optional.empty(), false, false, false, false); @@ -892,6 +899,8 @@ public static Optional getNodeMetaModel(Class c) { public static final VariableDeclarationExprMetaModel variableDeclarationExprMetaModel = new VariableDeclarationExprMetaModel(Optional.of(expressionMetaModel)); + public static final SwitchExprMetaModel switchExprMetaModel = new SwitchExprMetaModel(Optional.of(expressionMetaModel)); + public static final ImportDeclarationMetaModel importDeclarationMetaModel = new ImportDeclarationMetaModel(Optional.of(nodeMetaModel)); public static final AssertStmtMetaModel assertStmtMetaModel = new AssertStmtMetaModel(Optional.of(statementMetaModel)); diff --git a/javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchExprMetaModel.java b/javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchExprMetaModel.java new file mode 100644 index 0000000000..bcbc1ad36d --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/metamodel/SwitchExprMetaModel.java @@ -0,0 +1,14 @@ +package com.github.javaparser.metamodel; + +import java.util.Optional; + +public class SwitchExprMetaModel extends ExpressionMetaModel { + + SwitchExprMetaModel(Optional superBaseNodeMetaModel) { + super(superBaseNodeMetaModel, com.github.javaparser.ast.expr.SwitchExpr.class, "SwitchExpr", "com.github.javaparser.ast.expr", false, false); + } + + public PropertyMetaModel entriesPropertyMetaModel; + + public PropertyMetaModel selectorPropertyMetaModel; +} 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 a57e278ba2..e42410981d 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 @@ -696,6 +696,19 @@ private static CsmElement typeArguments() { token(GeneratedJavaParserConstants.RBRACE) )); + concreteSyntaxModelByClass.put(SwitchExpr.class, sequence( + comment(), + token(GeneratedJavaParserConstants.SWITCH), + token(GeneratedJavaParserConstants.LPAREN), + child(ObservableProperty.SELECTOR), + token(GeneratedJavaParserConstants.RPAREN), + space(), + token(GeneratedJavaParserConstants.LBRACE), + newline(), + list(ObservableProperty.ENTRIES, none(), indent(), unindent()), + token(GeneratedJavaParserConstants.RBRACE) + )); + concreteSyntaxModelByClass.put(SynchronizedStmt.class, sequence( comment(), token(GeneratedJavaParserConstants.SYNCHRONIZED), 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 57cbb57e9b..bc3f904d97 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 @@ -29,10 +29,7 @@ import com.github.javaparser.ast.comments.LineComment; import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.modules.*; -import com.github.javaparser.ast.nodeTypes.NodeWithName; -import com.github.javaparser.ast.nodeTypes.NodeWithTraversableScope; -import com.github.javaparser.ast.nodeTypes.NodeWithTypeArguments; -import com.github.javaparser.ast.nodeTypes.NodeWithVariables; +import com.github.javaparser.ast.nodeTypes.*; import com.github.javaparser.ast.stmt.*; import com.github.javaparser.ast.type.*; import com.github.javaparser.ast.visitor.Visitable; @@ -1078,6 +1075,15 @@ public void visit(final ExpressionStmt n, final Void arg) { @Override public void visit(final SwitchStmt n, final Void arg) { + printSwitchNode(n, arg); + } + + @Override + public void visit(SwitchExpr n, Void arg) { + printSwitchNode(n, arg); + } + + private void printSwitchNode(SwitchNode n, Void arg) { printComment(n.getComment(), arg); printer.print("switch("); n.getSelector().accept(this, arg); diff --git a/javaparser-core/src/main/javacc/java.jj b/javaparser-core/src/main/javacc/java.jj index 530f5a28da..b10437c0c3 100644 --- a/javaparser-core/src/main/javacc/java.jj +++ b/javaparser-core/src/main/javacc/java.jj @@ -1693,17 +1693,19 @@ Expression UnaryExpressionNotPlusMinus(): JavaToken begin = INVALID; } { - ( - ( "~" { op = UnaryExpr.Operator.BITWISE_COMPLEMENT; begin=token(); } | - "!" { op = UnaryExpr.Operator.LOGICAL_COMPLEMENT; begin=token(); } - ) ret = UnaryExpression() { ret = new UnaryExpr(range(begin, token()), ret, op); } - | - LOOKAHEAD( CastExpression() ) - ret = CastExpression() - | - ret = PostfixExpression() - ) - { return ret; } + ( + ( + "~" { op = UnaryExpr.Operator.BITWISE_COMPLEMENT; begin=token(); } | + "!" { op = UnaryExpr.Operator.LOGICAL_COMPLEMENT; begin=token(); } + ) ret = UnaryExpression() { ret = new UnaryExpr(range(begin, token()), ret, op); } + | LOOKAHEAD( CastExpression() ) + ret = CastExpression() + | + ret = PostfixExpression() + | + ret = SwitchExpression() + ) + { return ret; } } Expression PostfixExpression(): @@ -2227,6 +2229,21 @@ SwitchStmt SwitchStatement(): { return new SwitchStmt(range(begin, token()), selector, entries); } } +SwitchExpr SwitchExpression(): +{ + Expression selector; + SwitchEntryStmt entry; + NodeList entries = emptyList(); + JavaToken begin; +} +{ + "switch" {begin=token();} "(" selector = Expression() ")" "{" + ( entry = SwitchEntry() { entries = add(entries, entry); } )* + "}" + + { return new SwitchExpr(range(begin, token()), selector, entries); } +} + SwitchEntryStmt SwitchEntry(): { Expression label = null; diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/DefaultVisitorAdapter.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/DefaultVisitorAdapter.java index 7dc0e17656..3a53569937 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/DefaultVisitorAdapter.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/DefaultVisitorAdapter.java @@ -477,4 +477,9 @@ public ResolvedType visit(VarType node, Boolean arg) { public ResolvedType visit(Modifier node, Boolean arg) { throw new UnsupportedOperationException(node.getClass().getCanonicalName()); } + + @Override + public ResolvedType visit(SwitchExpr node, Boolean arg) { + throw new UnsupportedOperationException(node.getClass().getCanonicalName()); + } }