You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/12/07 22:37:20 UTC

[groovy] branch master updated: GROOVY-6653: MetaMethodIndex: allow bridge method to override

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 19ade45  GROOVY-6653: MetaMethodIndex: allow bridge method to override
19ade45 is described below

commit 19ade45010b92ae959d3b06909e99e93d6d07e53
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Dec 7 16:37:04 2021 -0600

    GROOVY-6653: MetaMethodIndex: allow bridge method to override
---
 .../codehaus/groovy/reflection/CachedClass.java    |  3 +-
 src/test/groovy/bugs/Groovy6653.java               | 53 ++++++++++++++++++++++
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
index 8517820..647e98f 100644
--- a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
+++ b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
@@ -83,8 +83,7 @@ public class CachedClass {
             PrivilegedAction<CachedMethod[]> action = () -> {
                 try {
                     return Arrays.stream(getTheClass().getDeclaredMethods())
-                        // skip synthetic methods inserted by JDK 1.5+ compilers
-                        .filter(m -> !m.isBridge() && m.getName().indexOf('+') < 0)
+                        .filter(m -> m.getName().indexOf('+') < 0) // no synthetic JDK 5+ methods
                         .filter(m -> ReflectionUtils.checkCanSetAccessible(m, CachedClass.class))
                         .map(m -> new CachedMethod(CachedClass.this, m))
                         .toArray(CachedMethod[]::new);
diff --git a/src/test/groovy/bugs/Groovy6653.java b/src/test/groovy/bugs/Groovy6653.java
new file mode 100644
index 0000000..589d20d
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy6653.java
@@ -0,0 +1,53 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy.bugs;
+
+import org.junit.Test;
+
+import static groovy.test.GroovyAssert.assertScript;
+
+public final class Groovy6653 {
+
+    public static abstract class A<T> {
+        protected String getText(T t) {
+            return "A";
+        }
+    }
+
+    public static class C extends A<String> {
+        @Override
+        protected String getText(String s) {
+            return super.getText(s) + "C";
+        }
+    }
+
+    @Test
+    public void testCovariantMethodSuperCall() throws Exception {
+        assertScript(
+            "class D extends " + C.class.getName() + " {\n" +
+            "    @Override\n" +
+            "    protected String getText(String s) {\n" +
+            "        super.getText(s) + 'D'\n" +
+            "    }\n" +
+            "}\n" +
+            "String result = new D().getText(null)\n" +
+            "assert result == 'ACD'\n"
+        );
+    }
+}