On Wed, 7 Jul 2021 12:10:16 GMT, Jan Lahoda <jlah...@openjdk.org> wrote:
>> Currently, an enum switch with patterns is desugared in a very non-standard, >> and potentially slow, way. It would be better to use the standard >> `typeSwitch` bootstrap to classify the enum constants. The bootstrap needs >> to accept enum constants as labels in order to allow this. A complication is >> that if an enum constant is missing, that is not an incompatible change for >> the switch, and the switch should simply work as if the case for the missing >> constant didn't exist. So, the proposed solution is to have a new bootstrap >> `enumSwitch` that accepts `String`s in place of the enum constants, and will >> internally convert them to the appropriate enum constants, and then it will >> find the proper case similarly to `typeSwitch`. >> >> How does this look? > > Jan Lahoda has updated the pull request incrementally with one additional > commit since the last revision: > > If the pattern type is a supertype of the selector type, use selector type > rather than the pattern type when constructing the bootstrap method > parameters. There turned out to be a bug in the patch: considering a switch over enum like: E e = ...; switch (e) { case Object o -> {} } (Or, even worse, `case Object o && <guard> ->`), the patch will generate `Object.class` as a static parameter to the `enumSwitch` bootstrap method. But the method (rightfully) requires the enum class as the static parameter. https://github.com/openjdk/jdk17/pull/81/commits/d970402e969d76a017cdfdcbc6556f6d9a9f3bfa tweaks the code generation to produce `E.class` instead of `Object.class`. ------------- PR: https://git.openjdk.java.net/jdk17/pull/81