Scott Murphy Heiberg created GROOVY-12522:
---------------------------------------------

             Summary: super.name() and super.name miss an extension method that 
the class overrides
                 Key: GROOVY-12522
                 URL: https://issues.apache.org/jira/browse/GROOVY-12522
             Project: Groovy
          Issue Type: Bug
          Components: groovy-runtime
    Affects Versions: 6.0.0
            Reporter: Scott Murphy Heiberg


When a class declares its own version of an extension method of its superclass, 
{{super.name()}} and {{super.name}} in dynamic Groovy and under 
{{@TypeChecked}} do not find the superclass's extension method:

{code:groovy}
class Numbers extends ArrayList<Integer> {
    Numbers() { super([1, 2, 3]) }
    Integer first() { -1 }
    def test() { super.first() }
}
class Bean {
    Map getProperties() { [:] }
    def test() { super.properties.containsKey('class') }
}
class Text extends File {
    Text(String path) { super(path) }
    String getText() { 'own' }
    def test() { [super.getText(), super.text] }
}
assert new Numbers().test() == 1 // fails: MissingMethodException: No signature 
of method: first for class: java.util.ArrayList
assert new Bean().test()          // fails: MissingPropertyException: No such 
property: properties for class: Bean
def file = File.createTempFile('text', '.txt')
file.text = 'content'
assert new Text(file.path).test() == ['content', 'content'] // fails: 
NullPointerException: charsetName
{code}

{{super.getText()}} calls {{getText(File, String charset)}} with a null 
charset, the only {{getText}} left for {{super}}. Without the class's own 
method, all three work. Under {{@CompileStatic}} these calls work, but 
{{super.text += 'x'}} compiles to a dynamic property access and fails the same 
way. Seen in 4.0.33, 5.0.8, 6.0.0 and master.

For {{super}}, a method the class declares is replaced by the MOP method 
{{super$2$name}} of the superclass method it overrides, or dropped when there 
is none. An extension method has no MOP method, so the class's method is 
dropped, and the extension method it replaced in the method index is not 
restored.

Expected: {{super.name()}} and {{super.name}} call the superclass's extension 
method, as they do when the class does not declare the method.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to