[ 
https://issues.apache.org/jira/browse/GROOVY-10102?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Renato Athaydes updated GROOVY-10102:
-------------------------------------
    Description: 
I am having trouble migrating a very large project from Groovy 2.4.x to 2.5.14.

I was able to reproduce the problem with this small example:
  
{code:java}
import groovy.transform.CompileStatic
 import groovy.transform.SelfType
import java.util.function.Supplier
@CompileStatic
 @SelfType([C])
 trait D {
   def go() {
     String s = foo
     withObject(s) {
       s.toUpperCase()
     }
  }
 }

@SelfType(B)
@CompileStatic
trait C {}

@SelfType([A])
@CompileStatic
trait B {}

@CompileStatic
trait A {
   String foo = 'foo'
  def withObject(String s, Supplier<Object> g) {
     s + g.get()
   }

}

class Impl implements A, B, C, D {
   def go() {

    println withObject(foo) { ' bar' }

  }
 }
{code}
 

 
 Compiling this code results in this error:

 
{noformat}
src/main/groovy/bar/Foo.groovy: 13: [Static type checking] - Cannot find 
matching method <UnionType:bar.C+bar.D>#withObject(java.lang.String, 
groovy.lang.Closure). Please check if the declared type is correct and if the 
method exists.
 @ line 13, column 9.
 withObject(s) {
 ^

1 error

{noformat}
It's easy to work around once you know how: just make the trait that calls 
`withObject` list the trait that provides that method in its `SelfType` 
directly, i.e. in this case:

 
{code:java}
@SelfType([A, C])
trait D { ... } 
{code}
 

_Interestingly, changing D's self-type to `B` also works! It looks like the 2nd 
indirection is needed to reproduce the issue._

 

However, figuring it out can take a long time! Would be nice to make this work 
automatically, maybe by just making `@SelfType(C)` equivalent to `@SelfType(C, 
B, A)` (i.e. merge the types by recursively applying other's self-types).

 

  was:
I am having trouble migrating a very large project from Groovy 2.4.x to 2.5.14.

I was able to reproduce the problem with this small example:
  
{code:java}
import groovy.transform.CompileStatic
 import groovy.transform.SelfType
import java.util.function.Supplier
@CompileStatic
 @SelfType([C])
 trait D {
   def go() {
     String s = foo
     withObject(s) {
       s.toUpperCase()
     }
  }
 }
@SelfType(B)
@CompileStatic
trait C {}
@SelfType([A])
@CompileStatic
trait B {}
@CompileStatic
trait A {
   String foo = 'foo'
  def withObject(String s, Supplier<Object> g) {
     s + g.get()
   }

}
class Impl implements A, B, C, D {
   def go() {

    println withObject(foo) { ' bar' }

  }
 }
{code}
 

 
 Compiling this code results in this error:

 
{noformat}
src/main/groovy/bar/Foo.groovy: 13: [Static type checking] - Cannot find 
matching method <UnionType:bar.C+bar.D>#withObject(java.lang.String, 
groovy.lang.Closure). Please check if the declared type is correct and if the 
method exists.
 @ line 13, column 9.
 withObject(s) {
 ^

1 error

{noformat}
It's easy to work around once you know how: just make the trait that calls 
`withObject` list the trait that provides that method in its `SelfType` 
directly, i.e. in this case:

 
{code:java}
@SelfType([A, C])
trait D { ... } 
{code}
 

_Interestingly, changing D's self-type to `B` also works! It looks like the 2nd 
indirection is needed to reproduce the issue._

 

However, figuring it out can take a long time! Would be nice to make this work 
automatically, maybe by just making `@SelfType(C)` equivalent to `@SelfType(C, 
B, A)` (i.e. merge the types by recursively applying other's self-types).

 


> Type checking fails when calling trait method using indirect SelfType relation
> ------------------------------------------------------------------------------
>
>                 Key: GROOVY-10102
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10102
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler, Static Type Checker
>    Affects Versions: 2.5.14
>            Reporter: Renato Athaydes
>            Priority: Major
>
> I am having trouble migrating a very large project from Groovy 2.4.x to 
> 2.5.14.
> I was able to reproduce the problem with this small example:
>   
> {code:java}
> import groovy.transform.CompileStatic
>  import groovy.transform.SelfType
> import java.util.function.Supplier
> @CompileStatic
>  @SelfType([C])
>  trait D {
>    def go() {
>      String s = foo
>      withObject(s) {
>        s.toUpperCase()
>      }
>   }
>  }
> @SelfType(B)
> @CompileStatic
> trait C {}
> @SelfType([A])
> @CompileStatic
> trait B {}
> @CompileStatic
> trait A {
>    String foo = 'foo'
>   def withObject(String s, Supplier<Object> g) {
>      s + g.get()
>    }
> }
> class Impl implements A, B, C, D {
>    def go() {
>     println withObject(foo) { ' bar' }
>   }
>  }
> {code}
>  
>  
>  Compiling this code results in this error:
>  
> {noformat}
> src/main/groovy/bar/Foo.groovy: 13: [Static type checking] - Cannot find 
> matching method <UnionType:bar.C+bar.D>#withObject(java.lang.String, 
> groovy.lang.Closure). Please check if the declared type is correct and if the 
> method exists.
>  @ line 13, column 9.
>  withObject(s) {
>  ^
> 1 error
> {noformat}
> It's easy to work around once you know how: just make the trait that calls 
> `withObject` list the trait that provides that method in its `SelfType` 
> directly, i.e. in this case:
>  
> {code:java}
> @SelfType([A, C])
> trait D { ... } 
> {code}
>  
> _Interestingly, changing D's self-type to `B` also works! It looks like the 
> 2nd indirection is needed to reproduce the issue._
>  
> However, figuring it out can take a long time! Would be nice to make this 
> work automatically, maybe by just making `@SelfType(C)` equivalent to 
> `@SelfType(C, B, A)` (i.e. merge the types by recursively applying other's 
> self-types).
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to