This is a preview of a patch implementing JEP 406: Pattern Matching for switch 
(Preview):
https://bugs.openjdk.java.net/browse/JDK-8213076

The current draft of the specification is here:
http://cr.openjdk.java.net/~gbierman/jep406/jep406-20210430/specs/patterns-switch-jls.html

A summary of notable parts of the patch:
-to support cases expressions and patterns in cases, there is a new common 
superinterface for expressions and patterns, `CaseLabelTree`, which expressions 
and patterns implement, and a list of case labels is returned from 
`CaseTree.getLabels()`.
-to support `case default`, there is an implementation of `CaseLabelTree` that 
represents it (`DefaultCaseLabelTree`). It is used also to represent the 
conventional `default` internally and in the newly added methods.
-in the parser, parenthesized patterns and expressions need to be disambiguated 
when parsing case labels.
-Lower has been enhanced to handle `case null` for ordinary (boxed-primitive, 
String, enum) switches. This is a bit tricky for boxed primitives, as there is 
no value that is not part of the input domain so that could be used to 
represent `case null`. Requires a bit shuffling with values.
-TransPatterns has been enhanced to handle the pattern matching switch. It 
produces code that delegates to a new bootstrap method, that will classify the 
input value to the switch and return the case number, to which the switch then 
jumps. To support guards, the switches (and the bootstrap method) are 
restartable. The bootstrap method as such is written very simply so far, but 
could be much more optimized later.
-nullable type patterns are `case String s, null`/`case null, String s`/`case 
null: case String s:`/`case String s: case null:`, handling of these required a 
few tricks in `Attr`, `Flow` and `TransPatterns`.

The specdiff for the change is here (to be updated):
http://cr.openjdk.java.net/~jlahoda/8265981/specdiff.preview.01/overview-summary.html

-------------

Commit messages:
 - Trailing whitespaces.
 - Cleanup, reflecting review comments.
 - Merge branch 'master' into JDK-8262891
 - JDK-8262891: Compiler implementation for Pattern Matching for switch

Changes: https://git.openjdk.java.net/jdk/pull/3863/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=3863&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8262891
  Stats: 3927 lines in 70 files changed: 3636 ins; 97 del; 194 mod
  Patch: https://git.openjdk.java.net/jdk/pull/3863.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/3863/head:pull/3863

PR: https://git.openjdk.java.net/jdk/pull/3863

Reply via email to