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

Scott Murphy Heiberg updated GROOVY-12594:
------------------------------------------
    Description: 
{code:groovy}
import groovy.transform.Virtual
@groovy.transform.CompileStatic
trait T {
    @Virtual static boolean isVr() { false }
    static String sm() { vr ? 'yes' : 'no' }
}
class C implements T { static boolean isVr() { true } }
class D implements T { }
assert [C.sm(), D.sm()] == ['yes', 'no']
{code}
Actual: {{[Static type checking] - No such property: vr for Class or static 
property for class: T}} with {{@CompileStatic}} or {{@TypeChecked}}. The same 
error occurs in instance trait methods, for a @Virtual setter written as an 
assignment or compound assignment, and for a @Virtual accessor of a super 
trait. The method form {{isVr()}} compiles, and dynamic Groovy runs the script.

Expected: the script compiles, and the property reads and writes dispatch 
through the implementing class like {{isVr()}} does, giving {{yes}} for {{C}} 
and {{no}} for {{D}}.

A @Virtual static is not promoted to the trait interface, so the type checker 
finds no property on the trait for the receiver that the trait transformation 
produces. The method form is resolved through the trait type checking 
extension; the property form is not.

Seen in 6.0.0 (the first version with @Virtual).

PR: https://github.com/apache/groovy/pull/3121

  was:
{code:groovy}
import groovy.transform.Virtual
@groovy.transform.CompileStatic
trait T {
    @Virtual static boolean isVr() { false }
    static String sm() { vr ? 'yes' : 'no' }
}
class C implements T { static boolean isVr() { true } }
class D implements T { }
assert [C.sm(), D.sm()] == ['yes', 'no']
{code}
Actual: {{[Static type checking] - No such property: vr for Class or static 
property for class: T}} with {{@CompileStatic}} or {{@TypeChecked}}. The same 
error occurs in instance trait methods, for a @Virtual setter written as an 
assignment or compound assignment, and for a @Virtual accessor of a super 
trait. The method form {{isVr()}} compiles, and dynamic Groovy runs the script.

Expected: the script compiles, and the property reads and writes dispatch 
through the implementing class like {{isVr()}} does, giving {{yes}} for {{C}} 
and {{no}} for {{D}}.

A @Virtual static is not promoted to the trait interface, so the type checker 
finds no property on the trait for the receiver that the trait transformation 
produces. The method form is resolved through the trait type checking 
extension; the property form is not.

Seen in 6.0.0 (the first version with @Virtual).


> STC rejects a @Virtual trait static accessor read or written with property 
> syntax
> ---------------------------------------------------------------------------------
>
>                 Key: GROOVY-12594
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12594
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 6.0.0
>            Reporter: Scott Murphy Heiberg
>            Priority: Major
>
> {code:groovy}
> import groovy.transform.Virtual
> @groovy.transform.CompileStatic
> trait T {
>     @Virtual static boolean isVr() { false }
>     static String sm() { vr ? 'yes' : 'no' }
> }
> class C implements T { static boolean isVr() { true } }
> class D implements T { }
> assert [C.sm(), D.sm()] == ['yes', 'no']
> {code}
> Actual: {{[Static type checking] - No such property: vr for Class or static 
> property for class: T}} with {{@CompileStatic}} or {{@TypeChecked}}. The same 
> error occurs in instance trait methods, for a @Virtual setter written as an 
> assignment or compound assignment, and for a @Virtual accessor of a super 
> trait. The method form {{isVr()}} compiles, and dynamic Groovy runs the 
> script.
> Expected: the script compiles, and the property reads and writes dispatch 
> through the implementing class like {{isVr()}} does, giving {{yes}} for {{C}} 
> and {{no}} for {{D}}.
> A @Virtual static is not promoted to the trait interface, so the type checker 
> finds no property on the trait for the receiver that the trait transformation 
> produces. The method form is resolved through the trait type checking 
> extension; the property form is not.
> Seen in 6.0.0 (the first version with @Virtual).
> PR: https://github.com/apache/groovy/pull/3121



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to