[ 
https://issues.apache.org/jira/browse/GROOVY-11657?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17950220#comment-17950220
 ] 

Paul King commented on GROOVY-11657:
------------------------------------

This is another variation:
{code:groovy}
public class JEP394 {
    public static void main(String[] args) {
        List<?> items = List.of("Pi", "Cat", "Camel", 3.14, new ArrayList<>());
        for (Object item : items) {
            if (item instanceof String s && s.length() < 3) {
                System.out.println(s.toUpperCase());
            }
            if (item instanceof String s && s.length() > 3) {
                System.out.println(s.toUpperCase());
            }
            if (!(item instanceof String s)) {
                return;
            }
            System.out.println(s.equalsIgnoreCase("Dog"));
        }
    }
}
// PI false false camel false
{code}
Adding this as another case and noting that we don't (currently) support the 
not instanceof syntax for the last {{if}} statement: {{item !instanceof String 
s}}
Given this is really a Java compatibility feature, I don't think we need this 
last case.

> Improved compatibility for "Support instanceof variable"
> --------------------------------------------------------
>
>                 Key: GROOVY-11657
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11657
>             Project: Groovy
>          Issue Type: New Feature
>          Components: class generator, parser-antlr4
>            Reporter: Daniel Sun
>            Assignee: Eric Milles
>            Priority: Minor
>             Fix For: 5.0.0-alpha-13
>
>
> Java's pattern matching for {{instanceof}} supports flow-sensitive scoping, 
> see:
> * https://stackoverflow.com/a/73749721
> * JLS 6.3.1, "Scope for Pattern Variables in Expressions"
> * 
> https://openjdk.org/projects/amber/design-notes/patterns/pattern-match-semantics
> So, for the class below, the variable {{s}} would still be in scope for the 
> last {{println}} statement.
> {code:java}
> import java.util.ArrayList;
> import java.util.List;
> public class JEP394 {
>     public static void main(String[] args) {
>         List<?> items = List.of("Pi", "Cat", 3.14, new ArrayList<>());
>         for (Object item : items) {
>             if (item instanceof String s && s.length() < 3) {
>                 System.out.println(s.toUpperCase());
>             } else if (item instanceof Number n && n.intValue() < 5) {
>                 System.out.println(n.doubleValue());
>                 continue;
>             } else {
>                 if (item instanceof String s) {
>                     System.out.println(s.toLowerCase());
>                 } else {
>                     System.out.println(item);
>                 }
>                 continue;
>             }
>             System.out.println(s);
>         }
>     }
> }
> // PI Pi cat 3.14 []
> {code}
> Currently we report an error for this case (for both static and dynamic 
> natures).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to