Scott Murphy Heiberg created GROOVY-12520:
---------------------------------------------
Summary: super.x calls getX() instead of isX() when the class
overrides isX()
Key: GROOVY-12520
URL: https://issues.apache.org/jira/browse/GROOVY-12520
Project: Groovy
Issue Type: Bug
Components: groovy-runtime
Affects Versions: 6.0.0
Reporter: Scott Murphy Heiberg
When a class declares both {{isX()}} and {{getX()}}, Groovy reads the property
{{x}} through {{isX()}} (GROOVY-10133), also through {{super}}. If the subclass
overrides {{isX()}} or declares a {{boolean x}} property, dynamic Groovy and
{{@TypeChecked}} read {{super.x}} through the superclass's {{getX()}} instead:
{code:groovy}
class C {
boolean isX() { true }
boolean getX() { false }
}
class D extends C {
boolean isX() { false }
boolean test() { super.x }
}
class E extends C {
boolean x
boolean test() { super.x }
}
assert new D().test() // fails: false
assert new E().test() // fails: false
{code}
{{@CompileStatic}} returns {{true}} for both, and so does dynamic Groovy
4.0.33. 5.0.0, 5.0.8, 6.0.0 and master return {{false}}.
For {{super}}, the getter of an overridden method is the MOP method
{{super$2$isX}}, and the check that keeps {{isX()}} over {{getX()}} only
accepts a method whose name starts with "is", so {{getX()}} replaces it.
Expected: {{super.x}} calls {{C.isX()}} in every mode.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)