changeset 52349:d7b19832f535 patterns

Post-merge fixes.
author jlahoda
date Thu, 30 Aug 2018 08:19:58 +0200
parents 04adf962576e
children bc6e1e4b584d
files src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java test/langtools/tools/javac/patterns/PatternMatchPosTest.java
diffstat 7 files changed, 31 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Aug 29 13:34:55 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Thu Aug 30 08:19:58 2018 +0200
@@ -76,7 +76,7 @@
 import static com.sun.tools.javac.code.Kinds.Kind.*;
 import static com.sun.tools.javac.code.TypeTag.*;
 import static com.sun.tools.javac.code.TypeTag.WILDCARD;
-import com.sun.tools.javac.tree.JCTree.JCSwitch.SwitchKind;
+import com.sun.tools.javac.tree.JCTree.GenericSwitch.SwitchKind;
 import com.sun.tools.javac.comp.Analyzer.AnalyzerMode;
 import static com.sun.tools.javac.tree.JCTree.Tag.*;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
@@ -1443,7 +1443,7 @@
         ListBuffer<DiagnosticPosition> caseTypePositions = new ListBuffer<>();
         ListBuffer<Type> caseTypes = new ListBuffer<>();
 
-        handleSwitch(tree, tree.selector, tree.cases, (t, k) -> {/*XXX: ignored for now*/}, (c, caseEnv) -> {
+        handleSwitch(tree, tree.selector, tree.cases, (t, k) -> ((JCSwitchExpression) t).kind = k, (c, caseEnv) -> {
             caseEnv.info.breakResult = condInfo;
             attribStats(c.stats, caseEnv);
             new TreeScanner() {
@@ -1532,7 +1532,7 @@
                     wasError = true;
                 }
                 List<BindingSymbol> matchBindings = prevBindings;
-                if (c.getExpressions().nonEmpty()) {
+                if (c.getPatterns().nonEmpty()) {
                     for (JCPattern pat : c.getPatterns()) {
                         if (TreeInfo.isNull(pat)) {
                             log.error(pat.pos(),
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java	Wed Aug 29 13:34:55 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java	Thu Aug 30 08:19:58 2018 +0200
@@ -45,7 +45,7 @@
 
 import com.sun.tools.javac.code.Symbol.*;
 import com.sun.tools.javac.tree.JCTree.*;
-import com.sun.tools.javac.tree.JCTree.JCSwitch.SwitchKind;
+import com.sun.tools.javac.tree.JCTree.GenericSwitch.SwitchKind;
 
 import static com.sun.tools.javac.code.Flags.*;
 import static com.sun.tools.javac.code.Flags.BLOCK;
@@ -630,12 +630,12 @@
                 boolean hasDefault = false;
                 for (List<JCCase> l = tree.cases; l.nonEmpty(); l = l.tail) {
                     JCCase c = l.head;
+                    alive = true;
                     if (c.pats.nonEmpty()) {
                         for (JCPattern pat : c.pats) {
                             if (patternDominated(tree.cases, pat, tree.selector.type)) {
                                 log.error(c, Errors.PatternDominated);
                             }
-                            alive = true;
                             scan(pat);
                         }
                     } else {
@@ -665,6 +665,9 @@
                             }
                         }
                         for (JCPattern pat : c.pats) {
+                            if (pat == givenPattern) {
+                                break OUTTER;
+                            }
                             switch (pat.getTag()) {
                                 case BINDINGPATTERN: {
                                     JCBindingPattern vpatt = (JCBindingPattern)pat;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Wed Aug 29 13:34:55 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Thu Aug 30 08:19:58 2018 +0200
@@ -67,7 +67,7 @@
 import static com.sun.tools.javac.code.Kinds.Kind.*;
 import static com.sun.tools.javac.code.TypeTag.*;
 import static com.sun.tools.javac.tree.JCTree.Tag.*;
-import com.sun.tools.javac.tree.JCTree.JCSwitch.SwitchKind;
+import com.sun.tools.javac.tree.JCTree.GenericSwitch.SwitchKind;
 import static com.sun.tools.javac.jvm.Pool.DynamicMethod;
 
 import javax.lang.model.element.ElementKind;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Wed Aug 29 13:34:55 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java	Thu Aug 30 08:19:58 2018 +0200
@@ -62,7 +62,7 @@
 import com.sun.tools.javac.tree.JCTree.JCExpression;
 import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
 import static com.sun.tools.javac.tree.JCTree.JCOperatorExpression.OperandPos.LEFT;
-import com.sun.tools.javac.tree.JCTree.JCSwitch.SwitchKind;
+import com.sun.tools.javac.tree.JCTree.GenericSwitch.SwitchKind;
 import static com.sun.tools.javac.tree.JCTree.Tag.*;
 
 
@@ -3651,6 +3651,7 @@
 
         stmtList.append(make.at(tree.pos()).VarDef(dollar_switchexpr, null).setType(dollar_switchexpr.type));
         JCSwitch switchStatement = make.Switch(tree.selector, null);
+        switchStatement.kind = tree.kind;
         switchStatement.cases =
                 tree.cases.stream()
                           .map(c -> convertCase(dollar_switchexpr, switchStatement, tree, c))
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java	Wed Aug 29 13:34:55 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java	Thu Aug 30 08:19:58 2018 +0200
@@ -32,6 +32,7 @@
 import com.sun.tools.javac.code.Types;
 import com.sun.tools.javac.comp.MatchBindingsComputer.BindingSymbol;
 import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.JCTree.GenericSwitch.SwitchKind;
 import com.sun.tools.javac.tree.JCTree.JCAssign;
 import com.sun.tools.javac.tree.JCTree.JCBinary;
 import com.sun.tools.javac.tree.JCTree.JCBlock;
@@ -50,7 +51,6 @@
 import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
 import com.sun.tools.javac.tree.JCTree.JCStatement;
 import com.sun.tools.javac.tree.JCTree.JCSwitch;
-import com.sun.tools.javac.tree.JCTree.JCSwitch.SwitchKind;
 import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
 import com.sun.tools.javac.tree.JCTree.JCBindingPattern;
 import com.sun.tools.javac.tree.JCTree.JCWhileLoop;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java	Wed Aug 29 13:34:55 2018 +0200
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java	Thu Aug 30 08:19:58 2018 +0200
@@ -28,6 +28,7 @@
 import java.io.IOException;
 import java.io.StringWriter;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import javax.lang.model.element.Modifier;
 import javax.lang.model.type.TypeKind;
@@ -1225,10 +1226,18 @@
         }
     }
 
+    public interface GenericSwitch {
+        public enum SwitchKind {
+            ORDINARY,
+            STRING,
+            ENUM,
+            MATCHING;
+        }
+    }
     /**
      * A "switch ( ) { }" construction.
      */
-    public static class JCSwitch extends JCStatement implements SwitchTree {
+    public static class JCSwitch extends JCStatement implements SwitchTree, GenericSwitch {
         public JCExpression selector;
         public List<JCCase> cases;
         public SwitchKind kind;
@@ -1253,12 +1262,6 @@
         public Tag getTag() {
             return SWITCH;
         }
-        public enum SwitchKind {
-            ORDINARY,
-            STRING,
-            ENUM,
-            MATCHING;
-        }
     }
 
     /**
@@ -1295,16 +1298,15 @@
         @DefinedBy(Api.COMPILER_TREE)
         @Deprecated
         public JCExpression getExpression() {
-            return constExpressions().stream().findFirst().orElse(null);
-        }
-        public List<JCExpression> constExpressions() {
-            return pats.stream()
-                       .map(pat -> pat.hasTag(LITERALPATTERN) ? ((JCLiteralPattern) pat).value : null)
-                       .collect(List.collector());
+            return pats.nonEmpty() ? pats.head.constExpression() : null;
         }
         @Override @DefinedBy(Api.COMPILER_TREE)
         @SuppressWarnings("removal")
-        public List<JCExpression> getExpressions() { return constExpressions(); }
+        public java.util.List<JCExpression> getExpressions() {
+            return pats.stream()
+                       .map(pat -> pat.constExpression())
+                       .collect(Collectors.toList());
+        }
         public List<JCPattern> getPatterns() { return pats; }
         @Override @DefinedBy(Api.COMPILER_TREE)
         @SuppressWarnings("removal")
@@ -1335,9 +1337,10 @@
      * A "switch ( ) { }" construction.
      */
     @SuppressWarnings("removal")
-    public static class JCSwitchExpression extends JCPolyExpression implements SwitchExpressionTree {
+    public static class JCSwitchExpression extends JCPolyExpression implements SwitchExpressionTree, GenericSwitch {
         public JCExpression selector;
         public List<JCCase> cases;
+        public SwitchKind kind;
         protected JCSwitchExpression(JCExpression selector, List<JCCase> cases) {
             this.selector = selector;
             this.cases = cases;
--- a/test/langtools/tools/javac/patterns/PatternMatchPosTest.java	Wed Aug 29 13:34:55 2018 +0200
+++ b/test/langtools/tools/javac/patterns/PatternMatchPosTest.java	Thu Aug 30 08:19:58 2018 +0200
@@ -83,7 +83,7 @@
                     boolean prevPrint = print;
                     try {
                         print = true;
-                        scan(node.getPattern(), p);
+                        scan(node.getPatterns(), p);
                     } finally {
                         print = prevPrint;
                     }