test/langtools/tools/javac/switchexpr/ExpressionSwitch.java
author jlahoda
Tue, 12 Nov 2019 06:32:13 +0000
changeset 59021 cfc7bb9a5a92
parent 55306 ea43db53de91
permissions -rw-r--r--
8232684: Make switch expressions final Reviewed-by: alanb, mcimadamore, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     1
/*
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     2
 * @test /nodynamiccopyright/
54900
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
     3
 * @bug 8206986 8222169 8224031
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     4
 * @summary Check expression switch works.
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     5
 * @compile/fail/ref=ExpressionSwitch-old.out -source 9 -Xlint:-options -XDrawDiagnostics ExpressionSwitch.java
59021
cfc7bb9a5a92 8232684: Make switch expressions final
jlahoda
parents: 55306
diff changeset
     6
 * @compile ExpressionSwitch.java
cfc7bb9a5a92 8232684: Make switch expressions final
jlahoda
parents: 55306
diff changeset
     7
 * @run main ExpressionSwitch
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     8
 */
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     9
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    10
import java.util.Objects;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    11
import java.util.function.Supplier;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    12
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    13
public class ExpressionSwitch {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    14
    public static void main(String... args) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    15
        new ExpressionSwitch().run();
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    16
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    17
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    18
    private void run() {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    19
        check(T.A, "A");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    20
        check(T.B, "B");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    21
        check(T.C, "other");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    22
        assertEquals(exhaustive1(T.C), "C");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    23
        assertEquals(scopesIsolated(T.B), "B");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    24
        assertEquals(lambdas1(T.B).get(), "B");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    25
        assertEquals(lambdas2(T.B).get(), "B");
52794
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    26
        assertEquals(convert1("A"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    27
        assertEquals(convert1("B"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    28
        assertEquals(convert1("C"), 1);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    29
        assertEquals(convert1(""), -1);
54894
382101e97784 8222169: java.lang.AssertionError switch expression in ternary operator - ?
jlahoda
parents: 53878
diff changeset
    30
        assertEquals(convert1(null), -2);
52794
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    31
        assertEquals(convert2("A"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    32
        assertEquals(convert2("B"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    33
        assertEquals(convert2("C"), 1);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    34
        assertEquals(convert2(""), -1);
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    35
        localClass(T.A);
54900
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
    36
        assertEquals(castSwitchExpressions(T.A), "A");
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    37
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    38
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    39
    private String print(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    40
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    41
            case A -> "A";
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    42
            case B -> { yield "B"; }
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    43
            default -> { yield "other"; }
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    44
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    45
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    46
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    47
    private String exhaustive1(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    48
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    49
            case A -> "A";
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    50
            case B -> { yield "B"; }
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    51
            case C -> "C";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    52
            case D -> "D";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    53
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    54
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    55
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    56
    private String exhaustive2(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    57
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    58
            case A -> "A";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    59
            case B -> "B";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    60
            case C -> "C";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    61
            case D -> "D";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    62
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    63
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    64
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    65
    private String scopesIsolated(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    66
        return switch (t) {
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    67
            case A -> { String res = "A"; yield res;}
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    68
            case B -> { String res = "B"; yield res;}
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    69
            default -> { String res = "default"; yield res;}
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    70
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    71
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    72
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    73
    private Supplier<String> lambdas1(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    74
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    75
            case A -> () -> "A";
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    76
            case B -> { yield () -> "B"; }
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    77
            default -> () -> "default";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    78
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    79
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    80
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    81
    private Supplier<String> lambdas2(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    82
        return switch (t) {
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    83
            case A: yield () -> "A";
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    84
            case B: { yield () -> "B"; }
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    85
            default: yield () -> "default";
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    86
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    87
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    88
52794
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    89
    private int convert1(String s) {
54894
382101e97784 8222169: java.lang.AssertionError switch expression in ternary operator - ?
jlahoda
parents: 53878
diff changeset
    90
        return s == null
382101e97784 8222169: java.lang.AssertionError switch expression in ternary operator - ?
jlahoda
parents: 53878
diff changeset
    91
                ? -2
382101e97784 8222169: java.lang.AssertionError switch expression in ternary operator - ?
jlahoda
parents: 53878
diff changeset
    92
                : switch (s) {
382101e97784 8222169: java.lang.AssertionError switch expression in ternary operator - ?
jlahoda
parents: 53878
diff changeset
    93
                      case "A", "B" -> 0;
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
    94
                      case "C" -> { yield 1; }
54894
382101e97784 8222169: java.lang.AssertionError switch expression in ternary operator - ?
jlahoda
parents: 53878
diff changeset
    95
                      default -> -1;
382101e97784 8222169: java.lang.AssertionError switch expression in ternary operator - ?
jlahoda
parents: 53878
diff changeset
    96
                  };
52794
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    97
    }
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    98
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    99
    private int convert2(String s) {
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
   100
        return switch (s) {
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
   101
            case "A", "B": yield 0;
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
   102
            case "C": yield 1;
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
   103
            default: yield -1;
52794
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
   104
        };
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
   105
    }
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
   106
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   107
    private void localClass(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   108
        String good = "good";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   109
        class L {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   110
            public String c() {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   111
                STOP: switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   112
                    default: break STOP;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   113
                }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   114
                return switch (t) {
55306
ea43db53de91 8223305: Compiler support for Switch Expressions
jlahoda
parents: 54900
diff changeset
   115
                    default: yield good;
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   116
                };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   117
            }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   118
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   119
        String result = new L().c();
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   120
        if (!Objects.equals(result, good)) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   121
            throw new AssertionError("Unexpected result: " + result);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   122
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   123
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   124
54900
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
   125
    private String castSwitchExpressions(T t) {
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
   126
        return (String) switch (t) {
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
   127
            case A -> "A";
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
   128
            default -> 1;
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
   129
        };
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
   130
    }
e9f5e06a0dd7 8224031: Cannot parse switch expressions after type cast
jlahoda
parents: 54894
diff changeset
   131
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   132
    private void check(T t, String expected) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   133
        String result = print(t);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   134
        assertEquals(result, expected);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   135
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   136
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   137
    private void assertEquals(Object result, Object expected) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   138
        if (!Objects.equals(result, expected)) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   139
            throw new AssertionError("Unexpected result: " + result);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   140
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   141
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   142
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   143
    enum T {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   144
        A, B, C, D;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   145
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   146
    void t() {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   147
        Runnable r = () -> {};
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   148
        r.run();
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   149
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   150
}