You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2023/05/07 15:18:00 UTC

[jira] [Assigned] (GROOVY-10915) SC: class that provides isCase but not isNotCase

     [ https://issues.apache.org/jira/browse/GROOVY-10915?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eric Milles reassigned GROOVY-10915:
------------------------------------

    Assignee: Eric Milles

> SC: class that provides isCase but not isNotCase
> ------------------------------------------------
>
>                 Key: GROOVY-10915
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10915
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-jdk, Static compilation
>    Affects Versions: 4.0.0
>            Reporter: Eric Milles
>            Assignee: Eric Milles
>            Priority: Major
>
> Consider the following:
> {code:groovy}
> class C {
>   boolean isCase(value) {
>     System.out.println("C isCase"); true
>   }
> }
> @groovy.transform.CompileStatic // comment out and C#isCase is called for all 3
> void test() {
>   assert 0 in new C()
>   assert !!(0 in new C())
>   assert !(0 !in new C())
> }
> test()
> {code}
> "x in c" and "!(x in c)" will use C's {{isCase}} method. However "x !in c" will use {{DGM.isNotCase(c,x)}} which static dispatches to {{{}DGM.isCase{}}}. The isNotCase extension methods added in Groovy 4 should probably use invokeMethod to dynamic dispatch to make use of the isCase implemented by C.
> IMO it would be much simpler to ditch "isNotCase" and have "a not in b" work identically to "not(a in b)" so one cannot implement incongruent "in" and "!in" handling.  Otherwise, expected behavior could be restored by disabling GROOVY-10383 optimization when declaring class of isCase and isNotCase differ.



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