[
https://issues.apache.org/jira/browse/GROOVY-11403?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17856055#comment-17856055
]
Eric Milles commented on GROOVY-11403:
--------------------------------------
https://github.com/apache/groovy/commit/93f0d096c5c23256add266ff8f0f7d6a953a65ee
> 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)