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 2020/02/21 03:45:43 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-9414: Groovy 3.0.1 : @Delegate does not work with default getter

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


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new df251a4  GROOVY-9414: Groovy 3.0.1 : @Delegate does not work with default getter
df251a4 is described below

commit df251a4ead41300f9699da2b215b5c7a613b2be7
Author: Paul King <pa...@asert.com.au>
AuthorDate: Fri Feb 21 13:43:58 2020 +1000

    GROOVY-9414: Groovy 3.0.1 : @Delegate does not work with default getter
---
 .../groovy/transform/DelegateASTTransformation.java    | 18 +++++++++++++++---
 .../groovy/transform/DelegateTransformTest.groovy      | 13 +++++++++++++
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
index 6e6a417..9eeba82 100644
--- a/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/DelegateASTTransformation.java
@@ -43,6 +43,7 @@ import org.codehaus.groovy.control.SourceUnit;
 
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -203,11 +204,22 @@ public class DelegateASTTransformation extends AbstractASTTransformation {
         if (propertyNameList == null || propertyNameList.isEmpty()) {
             return true;
         }
-        final List<String> pNames = new ArrayList<>();
+        final Set<String> pNames = new HashSet<>();
+        final Set<String> mNames = new HashSet<>();
         for (PropertyNode pNode : BeanUtils.getAllProperties(cNode, false, false, false)) {
-            pNames.add(pNode.getField().getName());
+            String name = pNode.getField().getName();
+            pNames.add(name);
+            // add getter/setters since Groovy compiler hasn't added property accessors yet
+            String capitalized = Verifier.capitalize(name);
+            if ((pNode.getModifiers() & ACC_FINAL) == 0) {
+                mNames.add("set" + capitalized);
+            }
+            mNames.add("get" + capitalized);
+            boolean isPrimBool = pNode.getOriginType().equals(ClassHelper.boolean_TYPE);
+            if (isPrimBool) {
+                mNames.add("is" + capitalized);
+            }
         }
-        final List<String> mNames = new ArrayList<>();
         for (MethodNode mNode : cNode.getAllDeclaredMethods()) {
             mNames.add(mNode.getName());
         }
diff --git a/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy b/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy
index f6b99f3..903ff4b 100644
--- a/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy
@@ -859,6 +859,19 @@ assert foo.dm.x == '123'
             assert new B().s == '456'
         '''
     }
+
+    // GROOVY-9414
+    void testDelegateToPropertyViaGetter() {
+        assertScript '''
+            class Bar {
+                String name
+            }
+            class BarDelegate {
+                @Delegate(includes = "getName") Bar bar = new Bar(name: 'Baz')
+            }
+            assert new BarDelegate().name == 'Baz'
+        '''
+    }
 }
 
 interface DelegateFoo {