This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
new c9f2d71bc7 GROOVY-11548: default method does not override superclass
`final` method
c9f2d71bc7 is described below
commit c9f2d71bc700fd8dbc4a96a256cd08414ca1b445
Author: Eric Milles <[email protected]>
AuthorDate: Mon Feb 17 19:02:57 2025 -0600
GROOVY-11548: default method does not override superclass `final` method
---
.../codehaus/groovy/transform/trait/TraitComposer.java | 7 ++++++-
src/test/groovy/OverrideTest.groovy | 17 +++++++++++++++++
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git
a/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
b/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
index 186e980d45..e9e4a8f847 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
@@ -529,7 +529,12 @@ public abstract class TraitComposer {
}
private static MethodNode findExistingMethod(final ClassNode cNode, final
String name, final Parameter[] params) {
- return cNode.getDeclaredMethod(name, params);
+ MethodNode mNode = cNode.getDeclaredMethod(name, params);
+ if (mNode == null) { // GROOVY-11548: check for final method
+ mNode = Optional.ofNullable(cNode.getMethod(name, params))
+ .filter(m -> m.isFinal() && !m.isPrivate() &&
!m.isStatic()).orElse(null);
+ }
+ return mNode;
}
private static boolean shouldSkipMethod(final ClassNode cNode, final
String name, final Parameter[] params) {
diff --git a/src/test/groovy/OverrideTest.groovy
b/src/test/groovy/OverrideTest.groovy
index c29618a8d9..2280822ba3 100644
--- a/src/test/groovy/OverrideTest.groovy
+++ b/src/test/groovy/OverrideTest.groovy
@@ -249,4 +249,21 @@ final class OverrideTest {
new TemplatedInterfaceImplementation()
'''
}
+
+ // GROOVY-11548
+ @Test
+ void testDefaultMethodDoesNotOverride() {
+ assertScript '''
+ class A {
+ final func() { 'A' }
+ }
+ interface B {
+ default func() { 'B' }
+ }
+ class C extends A implements B {
+ }
+
+ assert new C().func() == 'A'
+ '''
+ }
}