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

Eric Milles updated GROOVY-11403:
---------------------------------
    Fix Version/s: 5.0.0-alpha-9

> property semantics of map-based types (pt.2)
> --------------------------------------------
>
>                 Key: GROOVY-11403
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11403
>             Project: Groovy
>          Issue Type: Improvement
>            Reporter: Eric Milles
>            Assignee: Eric Milles
>            Priority: Major
>              Labels: breaking
>             Fix For: 5.0.0-alpha-9
>
>
> The property semantics for map-based types was recently updated (see 
> GROOVY-11367).  {{testRead3()}} and {{testRead4()}} demonstrate the desired 
> outcome: public members (except {{isEmpty()}} and {{getClass()}}) then map 
> get/put.
> {{testRead1()}} and {{testRead2()}} demonstrate the differing semantics for 
> {{this}} references: accessible fields and public methods then map get/put.  
> Why the difference between fields and methods?  Also there are differences 
> between dynamic and static compilation modes (as noted).
> {code:groovy}
> import groovy.transform.*
> class M implements Map<String,String> {
>   @Delegate Map<String,String> map = [:].withDefault{ 'entry' }
>   public        a = 'field'
>   protected     b = 'field'
>   @PackageScope c = 'field'
>   private       d = 'field'
>   Closure       e = { 'called' }
>   public        getF() { 'getter' }
>   protected     getG() { 'getter' }
>   @PackageScope getH() { 'getter' }
>   private       getI() { 'getter' }
>   public        void setF(f) { 'setter' }
>   protected     void setG(g) { 'setter' }
>   @PackageScope void setH(h) { 'setter' }
>   private       void setI(i) { 'setter' }
>   void testRead1() {
>     println a         // field
>     println b         // field
>     println c         // field
>     println d         // field
>     println e         // proper
>     println f         // getter
>     println g         // entry (dynamic) or getter (static)
>     println h         // entry (dynamic) or getter (static)
>     println i         // entry (dynamic) or getter (static)
>     println j         // entry
>     println empty     // entry (dynamic) or isser  (static)
>     println metaClass // field (dynamic) or getter (static)
>     println "";
>     {->
>     println a         // field
>     println b         // entry
>     println c         // entry
>     println d         // entry
>     println e         // proper
>     println f         // getter
>     println g         // entry
>     println h         // entry
>     println i         // entry
>     println j         // entry
>     println empty     // entry
>     println metaClass // getter (of Closure)
>     }()
>   }
>   void testRead2() {
>     println this.a         // field
>     println this.b         // field
>     println this.c         // field
>     println this.d         // field
>     println this.e         // proper
>     println this.f         // getter
>     println this.g         // entry (dynamic) or getter (static)
>     println this.h         // entry (dynamic) or getter (static)
>     println this.i         // entry (dynamic) or getter (static)
>     println this.j         // entry
>     println this.empty     // entry (dynamic) or isser  (static)
>     println this.class     // entry (dynamic) or getter (static)
>     println this.metaClass // field (dynamic) or getter (static)
>     println "";
>     {->
>     println this.a         // field
>     println this.b         // entry (dynamic) or field (static)
>     println this.c         // entry (dynamic) or field (static)
>     println this.d         // entry (dynamic) or field (static)
>     println this.e         // proper
>     println this.f         // getter
>     println this.g         // entry (dynamic) or getter (static)
>     println this.h         // entry (dynamic) or getter (static)
>     println this.i         // entry (dynamic) or getter (static)
>     println this.j         // entry
>     println this.empty     // entry (dynamic) or isser  (static)
>     println this.class     // entry (dynamic) or getter (static)
>     println this.metaClass // getter
>     }()
>   }
>   void testRead3() {
>    def that = this
>     println that.a         // field
>     println that.b         // entry
>     println that.c         // entry
>     println that.d         // entry
>     println that.e         // proper
>     println that.f         // getter
>     println that.g         // entry
>     println that.h         // entry
>     println that.i         // entry
>     println that.j         // entry
>     println that.empty     // entry
>     println that.class     // entry
>     println that.metaClass // getter
>     println "";
>     {->
>     println that.a         // field
>     println that.b         // entry
>     println that.c         // entry
>     println that.d         // entry
>     println that.e         // proper
>     println that.f         // getter
>     println that.g         // entry
>     println that.h         // entry
>     println that.i         // entry
>     println that.j         // entry
>     println that.empty     // entry
>     println that.class     // entry
>     println that.metaClass // getter
>     }()
>   }
>   void testRead4() {
>     this.with {
>       println a         // field
>       println b         // entry
>       println c         // entry
>       println d         // entry
>       println e         // proper
>       println f         // getter
>       println g         // entry
>       println h         // entry
>       println i         // entry
>       println j         // entry
>       println empty     // entry
>       println metaClass // getter (of Closure)
>     }
>     def that = this; println ""
>     that.with {
>       println a         // field
>       println b         // entry
>       println c         // entry
>       println d         // entry
>       println e         // proper
>       println f         // getter
>       println g         // entry
>       println h         // entry
>       println i         // entry
>       println j         // entry
>       println empty     // entry
>       println metaClass // getter (of Closure)
>     }
>   }
> }
> {code}



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

Reply via email to