You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2024/01/27 16:54:00 UTC
[jira] (GROOVY-11299) ClassNode getField(String), getMethods(String) and others return from super interface when class uses extends
[ https://issues.apache.org/jira/browse/GROOVY-11299 ]
Eric Milles deleted comment on GROOVY-11299:
--------------------------------------
was (Author: emilles):
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)