You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/03/21 00:43:50 UTC

[groovy] 02/02: GROOVY-7288: fix for `@Delegate` target that implements trait(s) (port to 3_0_X)

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

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

commit 6b8c3ad5346af30b3995dfd165dcf8b8f737151b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Mar 18 10:38:01 2022 -0500

    GROOVY-7288: fix for `@Delegate` target that implements trait(s) (port to 3_0_X)
---
 .../groovy/transform/DelegateASTTransformation.java  |  3 +--
 .../traitx/TraitASTTransformationTest.groovy         | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
index 1e58a77..311edc3 100644
--- a/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
@@ -38,7 +38,6 @@ import org.codehaus.groovy.ast.tools.BeanUtils;
 import org.codehaus.groovy.control.CompilePhase;
 import org.codehaus.groovy.control.SourceUnit;
 
-import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -187,7 +186,7 @@ public class DelegateASTTransformation extends AbstractASTTransformation {
             if (skipInterfaces) return;
 
             Set<ClassNode> addedInterfaces = getInterfacesAndSuperInterfaces(delegate.type);
-            addedInterfaces.removeIf(i -> !Modifier.isPublic(i.getModifiers()));
+            addedInterfaces.removeIf(i -> (i.getModifiers() & (ACC_PUBLIC | ACC_SYNTHETIC)) != ACC_PUBLIC); // GROOVY-7288 and JDK16+
             if (!addedInterfaces.isEmpty()) {
                 Set<ClassNode> ownerInterfaces = getInterfacesAndSuperInterfaces(delegate.owner);
                 for (ClassNode i : addedInterfaces) {
diff --git a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index b62a851..228edeb 100644
--- a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -1760,6 +1760,26 @@ final class TraitASTTransformationTest {
         '''
     }
 
+    @Test // GROOVY-7288
+    void testClassWithTraitDelegate() {
+        assertScript '''
+            trait T {
+                final foo = 'bar'
+            }
+            class D implements T {
+                def m() {
+                    return 'baz'
+                }
+            }
+            class C { // The class must be declared abstract or the method 'java.lang.String T__foo$get()' must be implemented
+                private @Delegate D provider = new D()
+            }
+            def c = new C()
+            assert c.foo == 'bar'
+            assert c.m() == 'baz'
+        '''
+    }
+
     @Test // GROOVY-9739
     void testTraitExtendsTraitWithDelegate() {
         assertScript '''