Hi,
I encountered an issue with @CompileStatic. Consider following code:
import groovy.transform.CompileStatic
@CompileStatic
class E extends BImpl {
@Override
public void a() {
super.a();
}
public static void main(String[] args) { }
}
interface A {
void a();
}
interface B extends A {
@Override
void a();
}
class AImpl implements A {
@Override
public void a() {
}
}
class BImpl extends AImpl implements B {
}
It will fail to run with the following error:
Bug.groovy: 7: [Static type checking] - Abstract method a() cannot be called
directly
@ line 7, column 9.
super.a();
^
However, without @CompileStatic this code runs just fine.
It also works in Java, as the called super method comes from AImpl, but STC in
Groovy selects the abstract method from B instead.
This seems to be caused by
https://github.com/apache/groovy/blob/ea6ba7c6fcfefe3d8abdfbb6e20a44b1ebb8823e/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java#L1091
where the distance to the interface is 1, but the distance to the class is 4.
To give more context: I initially encountered this issue when extending
AbstractSet, overriding addAll for a fast path and delegating to super.addAll
for the slow path. I think such a pattern is quite common.
Greetings,
Hannes