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

Eric Milles commented on GROOVY-11299:
--------------------------------------

The test cases of GROOVY-8272 and GROOVY-10312 are examples of where this comes 
up.
{code:groovy}
trait A {
  static sm() {
    'A'
  }
}
trait B extends A {
  String m() {
    sm().toLowerCase()
  }
}
class C implements B {
}
print(new C().m())
{code}

{{StaticImportVisitor}} runs during semantic analysis before the trait 
transform has moved {{A}} from super class to super interface.  Asking for the 
methods "sm" of {{B}} returns the method of {{A}} and so "sm()" is transformed 
into the static call "B.sm()".  Leaving the method call unchanged allows it to 
be resolved through other trait means and fixes 8272, 10312 without dynamic 
dispatch (of trait helpers) that was added in Groovy 5.

> ClassNode getField(String), getMethods(String) and others return from super 
> interface when class uses extends
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-11299
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11299
>             Project: Groovy
>          Issue Type: Bug
>            Reporter: Eric Milles
>            Assignee: Eric Milles
>            Priority: Major
>              Labels: traits
>
> Consider the following:
> {code:groovy}
> trait A {
>   def m() {}
> }
> trait B extends A {
> }
> {code}
> Calling {{ClassNode#getMehtod(String)}} before the canonicalization compile 
> phase returns "m()".  Normally a super-trait or super-interface method would 
> not be returned -- when appearing in the {{implements}} clause for example.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to