[
https://issues.apache.org/jira/browse/GROOVY-11403?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles updated GROOVY-11403:
---------------------------------
Description:
The property semantics for map-based types was updated in GROOVY-11367.
{{testRead3()}} demonstrates the desired outcome: public members (except
{{isEmpty()}} and {{getClass()}}) followed by map entries.
{{testRead1()}} and {{testRead2()}} demonstrate the differing semantics for
{{this}} references: accessible fields and public methods followed by map
entries. Why the difference between fields and methods? Alignment on
accessibility would result in 2 simple rules: 1. accessible vs inaccessible for
{{this}} and 2. public vs non-public for non-{{this}} references.
{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
println h // entry
println i // entry
println j // entry
println empty // entry
println metaClass // field
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
println this.h // entry
println this.i // entry
println this.j // entry
println this.empty // entry
println this.class // entry
println this.metaClass // field
println "";
{->
println this.a // field
println this.b // entry
println this.c // entry
println this.d // entry
println this.e // proper
println this.f // getter
println this.g // entry
println this.h // entry
println this.i // entry
println this.j // entry
println this.empty // entry
println this.class // entry
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 // field
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
}()
}
}
{code}
was:
Consider the following:
{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
println h // entry
println i // entry
println j // entry
println empty // entry
println metaClass // field
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
println this.h // entry
println this.i // entry
println this.j // entry
println this.empty // entry
println this.class // entry
println this.metaClass // field
println "";
{->
println this.a // field
println this.b // entry
println this.c // entry
println this.d // entry
println this.e // proper
println this.f // getter
println this.g // entry
println this.h // entry
println this.i // entry
println this.j // entry
println this.empty // entry
println this.class // entry
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 // field
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
}()
}
}
{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
>
> The property semantics for map-based types was updated in GROOVY-11367.
> {{testRead3()}} demonstrates the desired outcome: public members (except
> {{isEmpty()}} and {{getClass()}}) followed by map entries.
> {{testRead1()}} and {{testRead2()}} demonstrate the differing semantics for
> {{this}} references: accessible fields and public methods followed by map
> entries. Why the difference between fields and methods? Alignment on
> accessibility would result in 2 simple rules: 1. accessible vs inaccessible
> for {{this}} and 2. public vs non-public for non-{{this}} references.
> {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
> println h // entry
> println i // entry
> println j // entry
> println empty // entry
> println metaClass // field
> 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
> println this.h // entry
> println this.i // entry
> println this.j // entry
> println this.empty // entry
> println this.class // entry
> println this.metaClass // field
> println "";
> {->
> println this.a // field
> println this.b // entry
> println this.c // entry
> println this.d // entry
> println this.e // proper
> println this.f // getter
> println this.g // entry
> println this.h // entry
> println this.i // entry
> println this.j // entry
> println this.empty // entry
> println this.class // entry
> 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 // field
> 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
> }()
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)