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

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

Changing {{ClassNode#getSuperClass()}} to stop returning interface or trait 
requires several changes.  I may make a more surgical change for Groovy 4 if I 
can work out the STC implications of leaving "this.sm().toLowerCase()" 
unaltered by {{StaticImportVisitor}}.

> 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.
> 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.



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

Reply via email to