On Fri, 1 Oct 2021 11:09:20 GMT, Pavel Rappo <pra...@openjdk.org> wrote:
>> It's hard to know how to make it fail at compile time. There are >> essentially 3 groups of trees ... inline tags (and other trees that use >> `DCEndPosTree`), block tags (the big block of cases round about line 177), >> and "other". We could arguably move block tags into the `default` case and >> use a type test, which would improve the future-safety. We could arguably >> catch missing cases at runtime with suitable use of `IllegalStateException`. >> >> As for tests, we *do* have tests for `ProvidesTree` and `UsesTree`, but the >> new `RangeChecker` didn't catch the missing case labels because the basic >> checks in `RangeChecker` were satisfied by the code in the default case in >> the switch statement. > > I agree that it might prove hard, if at all possible. That said, we should > investigate this later, not in this PR. One potential direction for > investigation would be "switching on sealed interfaces". A class or an > interface can be a part of multiple sealed-interface hierarchies: > > > sealed interface Tag permits Block, Inline {} > sealed interface Block extends Tag permits Block1, Bimodal {} > non-sealed interface Block1 extends Block {} > sealed interface Inline extends Tag permits Inline1, Bimodal {} > non-sealed interface Inline1 extends Inline {} > non-sealed interface Bimodal extends Block, Inline {} > > > After pattern matching for `switch` (currently in preview via JEP 406) has > been standardized, the exhaustiveness of a switch could help us catch bugs at > compile time. Possibly. Maybe. ------------- PR: https://git.openjdk.java.net/jdk/pull/5510