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

Eric Milles edited comment on GROOVY-5358 at 1/15/22, 6:44 PM:
---------------------------------------------------------------

Even with this fix, the Bar and Bax cases will not do what you expect for 
"class" or "metaClass".  See {{ExpandoMetaClass}}:
{code:java}
    private boolean hasOverrideGetProperty(String name) {
        return getPropertyMethod != null && !name.equals(META_CLASS_PROPERTY) 
&& !name.equals(CLASS_PROPERTY);
    }
{code}


was (Author: emilles):
Even with this fix, the category case will not do what you expect for "class" 
or "metaClass".  See {{ExpandoMetaClass}}:
{code:java}
    private boolean hasOverrideGetProperty(String name) {
        return getPropertyMethod != null && !name.equals(META_CLASS_PROPERTY) 
&& !name.equals(CLASS_PROPERTY);
    }
{code}

> Different ways of extending a class functionality esp. adding getProperty 
> inconsistent
> --------------------------------------------------------------------------------------
>
>                 Key: GROOVY-5358
>                 URL: https://issues.apache.org/jira/browse/GROOVY-5358
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>            Reporter: OC
>            Assignee: Eric Milles
>            Priority: Minor
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> When getProperty is used e.g., to mimic a Map behaviour, the result differs 
> depending on whether getProperty was defined directly in the class, added 
> through a mixin, or through a metaclass.
> {code}
> class FooWorksAsMap { // class names the same length as LinkedHashMap to make 
> output pretty
>  def getProperty(String foo) { "OK:FooWorksAsMap.$foo" }
> }
> class BarWorksAsMap {}
> class BaxWorksAsMap {}
> @Category(BarWorksAsMap) class C {
>  def getProperty(String foo) { "OK:BarWorksAsMap.$foo" }
> }
> BarWorksAsMap.mixin C
> BaxWorksAsMap.metaClass.getProperty = { foo -> "OK:BaxWorksAsMap.$foo" }
> def maps = [new FooWorksAsMap(), new BarWorksAsMap(), new BaxWorksAsMap(),
>            [foo:'OK:LinkedHashMap.foo', class:'OK:LinkedHashMap.class']]
> for (def prop in ['foo','class']) {
>  for (def m in maps) {
>    def op = "${m.getClass().getSimpleName()}.$prop"
>    try { println "$op -> " + m."$prop" }
>    catch (t) { println "$op -> FAIL:$t" }
>  }
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to