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

Daniil Ovchinnikov commented on GROOVY-8214:
--------------------------------------------

All cases work when value returned from property is a {{Closure}}. In 
{{Closure}} cases explicit method takes precedence:
{code}
class A {
  def getFoo() { return { "closure" } }
  def foo() { "method" }
}
println new A().foo() // method
{code}

I see no reason not to allow the same behaviour for all objects with 
{{.call()}} defined.

There is special handling for closures in 
{{groovy.lang.MetaClassImpl#invokePropertyOrMissing}}. In may be replaced with 
something like this (pseudocode):
{code}
if (/*necessary checks*/) return invokeMethod(value, "call", args)
{code}

> Implicit .call is inconsistent
> ------------------------------
>
>                 Key: GROOVY-8214
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8214
>             Project: Groovy
>          Issue Type: Bug
>            Reporter: Daniil Ovchinnikov
>
> {code}
> interface Callable {
>   def call()
> }
> def callable = new Callable() {
>   def call() { println "callable local var" }
> }
> callable.call()
> callable()
> class ClassWithCallableField {
>   public ppp = new Callable() {
>     def call() { println "callable field" }
>   }
> }
> def cwcp = new ClassWithCallableField()
> cwcp.ppp.call()
> cwcp.ppp() // MME
> def foo(Callable p) {
>   p.call()
>   p()
> }
> foo new Callable() {
>   def call() { println "callable parameter" }
> }
> class ClassWithCallableGetter {
>   def getGetter() {
>     new Callable() {
>       def call() { println "callable getter" }
>     }
>   }
> }
> def cwcg = new ClassWithCallableGetter()
> cwcg.getter.call()
> cwcg.getter() // MME
> class ClassWithCallableFieldInside {
>   public bbb = new Callable() {
>     def call() { println "callable field inside class" }
>   }
>   def foo() {
>     bbb.call()
>     bbb()
>   }
> }
> new ClassWithCallableFieldInside().foo()
> class ClassWithCallableGetterInside {
>   def getGetter() {
>     new Callable() {
>       def call() { println "callable getter inside class" }
>     }
>   }
>   def foo() {
>     getter.call()
>     getter() // MME
>   }
> }
> new ClassWithCallableGetterInside().foo()
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to