[
https://issues.apache.org/jira/browse/GROOVY-10102?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Paul King closed GROOVY-10102.
------------------------------
> 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
> Assignee: Eric Milles
> Priority: Major
> Fix For: 4.0.0-beta-1, 3.0.9
>
>
> 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.20.1#820001)