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'
+        '''
+    }
 }

Reply via email to