[patterns-record-deconstruction3] RFR: Fix deconstruction patterns with unconditional nested type pattern

Jan Lahoda jlahoda at openjdk.java.net
Mon Apr 25 18:54:57 UTC 2022


On Fri, 22 Apr 2022 12:14:10 GMT, Aggelos Biboudis <duke at openjdk.java.net> wrote:

> According to the spec:
> 
> 
> class Super {}
> class Sub extends Super {}
> record R(Super s) {}
> 
> public static void testRes(R r) {
>     switch(r) {
>        case R(Super s) -> System.out.println("a");
>     }
> }
> 
> testRes(new R(null)); // this should match since after resolution, the nested type pattern is transformed to an any pattern

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java line 310:

> 308:                 }
> 309:                 else
> 310:                     extraTest = makeLit(syms.booleanType, 1);

Thanks for working on this.

A few general comments here:
- we usually put `else` at the same line as the preceding closing `}`, e.g. `} else`.
- we usually put `{}` around the else section when there are brackets around the then section
- we normally don't (currently) use `instanceof` to check AST node types - we usually use `JCTree.hasTag` or `JCTree.getTag`.

Here, seems this would work as well, right?

            } else if (nested.type.isReference() && nested.hasTag(Tag.DECONSTRUCTIONPATTERN)) {
                extraTest = makeBinary(Tag.NE, make.Ident(nestedTemp), makeNull());
            }

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

PR: https://git.openjdk.java.net/amber/pull/81


More information about the amber-dev mailing list