Scott Murphy Heiberg created GROOVY-12517:
---------------------------------------------
Summary: Qualified super naming an enclosing class
(Outer.super.m() in an inner class) is rejected by static type checking
Key: GROOVY-12517
URL: https://issues.apache.org/jira/browse/GROOVY-12517
Project: Groovy
Issue Type: Bug
Components: Static compilation, Static Type Checker
Affects Versions: 6.0.0
Reporter: Scott Murphy Heiberg
In an inner class of {{Outer}}, {{Outer.super.m()}} calls the superclass's
method {{m()}} on the enclosing {{Outer}} instance (JLS 15.12.1). The type
checker rejects it:
{code:groovy}
class Base {
String m() { 'base' }
}
@groovy.transform.CompileStatic
class Outer extends Base {
String m() { 'outer' }
class Inner {
String test() { Outer.super.m() }
}
}
new Outer.Inner(new Outer()).test()
{code}
{code}
[Static type checking] - No such property: super for Class or static property
for class: Outer
{code}
The same error is reported under {{@TypeChecked}}, and for a property,
{{Outer.super.p}} with a {{getP()}} in both classes. Dynamic Groovy returns
{{base}} for the method call, but {{p:outer}} for the property, which it reads
as {{Outer.this.p}}. javac accepts both and prints {{base}} and {{p:base}} (for
the property through {{Outer.super.getP()}}). Seen in 5.0.8, 6.0.0 and master;
in 4.0.33 dynamic Groovy also failed, with {{MissingPropertyException: No such
property: super for class: Outer}}.
Expected: {{Outer.super.m()}} and {{Outer.super.p}} in an inner class (also in
an anonymous class, in a closure or lambda, or in an inner class of an inner
class) call the superclass's member on the enclosing {{Outer}} instance, in
every mode. Where the class has no enclosing instance of {{Outer}} (a static
nested class, or an anonymous class created in a static context), it stays an
error.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)