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

Eric Milles edited comment on GROOVY-11403 at 6/18/24 5:35 PM:
---------------------------------------------------------------

One additional difference exists between dynamic and static modes when it comes 
to super class field access:
{code:groovy}
abstract class A {
  public        x = 'field'
  protected     y = 'field'
  @PackageScope z = 'field'
}
class M extends A implements Map<String,String> {
  // ...
  void testRead5() {
    println x      // field
    println y      // entry (dynamic) or field (static)
    println z      // entry (dynamic) or field (static)
    println this.x // field
    println this.y // entry (dynamic) or field (static)
    println this.z // entry (dynamic) or field (static)
  }
  void testWrite() {
    a = null      // field
    b = null      // field
    x = null      // field
    y = null      // entry (dynamic) or field (static)
    z = null      // entry (dynamic) or field (static)
    println(this); clear()
    this.a = null // field
    this.b = null // field
    this.x = null // field
    this.y = null // entry (dynamic) or field (static)
    this.z = null // entry (dynamic) or field (static)
    println this
  }
}
{code}

GROOVY-8978 is a variant of this.


was (Author: emilles):
One additional difference exists between dynamic and static modes when it comes 
to super class field access:
{code:groovy}
abstract class A {
  public        x = 'field'
  protected     y = 'field'
  @PackageScope z = 'field'
}
class M extends A implements Map<String,String> {
  // ...
  void testRead5() {
    println x      // field
    println y      // entry (dynamic) or field (static)
    println z      // entry (dynamic) or field (static)
    println this.x // field
    println this.y // entry (dynamic) or field (static)
    println this.z // entry (dynamic) or field (static)
  }
  void testWrite() {
    a = null      // field
    b = null      // field
    x = null      // field
    y = null      // entry (dynamic) or field (static)
    z = null      // entry (dynamic) or field (static)
    println(this); clear()
    this.a = null // field
    this.b = null // field
    this.x = null // field
    this.y = null // entry (dynamic) or field (static)
    this.z = null // entry (dynamic) or field (static)
    println this
  }
}
{code}

> 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