Scott Murphy Heiberg created GROOVY-12614:
---------------------------------------------

             Summary: Trait code reads a plain static accessor as a property 
through the implementing class in dynamic and @TypeChecked code, but 
declarer-bound under @CompileStatic and in the method form
                 Key: GROOVY-12614
                 URL: https://issues.apache.org/jira/browse/GROOVY-12614
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 6.0.0
            Reporter: Scott Murphy Heiberg


{code:groovy}
trait T {
    static String getLabel() { 'trait' }
    static String sm() { label }        // property form
    static String sm2() { getLabel() }  // method form
}
class C implements T { static String getLabel() { 'impl' } }
class D implements T {}
println([C.sm(), D.sm(), C.sm2(), D.sm2()])
{code}
Dynamic and @TypeChecked: [impl, trait, trait, trait]
@CompileStatic: [trait, trait, trait, trait]

The property form of a plain (non-@Virtual) static accessor, read from trait 
code, dispatches through the implementing class in dynamic and type-checked 
code, but is declarer-bound under static compilation, and the method form is 
declarer-bound in every mode. The same holds for this.label, for an instance 
trait method, inside closures, and for an accessor of a super trait. A 
field-backed static property is declarer-bound in all modes.

The traits guide says public statics are declarer-bound by default for calls 
from other trait code and that @Virtual opts into implementing-class dispatch 
("For overridable static data rather than behaviour, use a @Virtual accessor"). 
VirtualAnnotationTest/TraitStaticDispatchMatrix row09vget adds @Virtual to get 
exactly the override-visible property read. But 
TraitStaticDispatchMatrix.row09acc_accessorPattern_overrideVisibleToTraitBody 
asserts the dynamic behaviour ("origin is class" for a plain accessor), with a 
comment pointing at row 1's dispatch path, which since "GROOVY-12093 adjusted: 
out with @Anchored in with @Virtual" requires @Virtual. row09acc looks like it 
predates that change.

Question: which is intended? If declarer-bound is the rule, 
TraitReceiverTransformer should call the helper for a property read or write of 
a plain static accessor, as it does for the method form, and row09acc should 
expect "origin is trait" (or move to @Virtual). If row09acc is the rule, static 
compilation and the method form disagree with it. I can provide the PR either 
way.

Seen in 6.0.0 and on master.



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

Reply via email to