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

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


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new 32d0ea6  GROOVY-9739: check knownFields for accessedVariable in 
FieldNode case
32d0ea6 is described below

commit 32d0ea629912021e186b205f49893adbf4f2afd6
Author: Eric Milles <[email protected]>
AuthorDate: Tue Sep 15 12:14:41 2020 -0500

    GROOVY-9739: check knownFields for accessedVariable in FieldNode case
    
    Conflicts:
        
src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
        
src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
---
 .../transform/trait/TraitReceiverTransformer.java  | 35 +++++++++-------------
 .../traitx/TraitASTTransformationTest.groovy       | 31 +++++++++++++++++++
 2 files changed, 45 insertions(+), 21 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
index 8cb68af..dfb3476 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
@@ -49,6 +49,7 @@ import org.codehaus.groovy.syntax.SyntaxException;
 import org.codehaus.groovy.syntax.Token;
 import org.codehaus.groovy.syntax.Types;
 
+import java.lang.reflect.Modifier;
 import java.util.Collection;
 import java.util.List;
 
@@ -120,27 +121,19 @@ class TraitReceiverTransformer extends 
ClassCodeExpressionTransformer {
         } else if (exp instanceof VariableExpression) {
             VariableExpression vexp = (VariableExpression) exp;
             Variable accessedVariable = vexp.getAccessedVariable();
-            if (accessedVariable instanceof FieldNode) {
-                FieldNode fn = (FieldNode) accessedVariable;
-                Expression receiver = createFieldHelperReceiver();
-                MethodCallExpression mce;
-                boolean isStatic = fn.isStatic();
-                if (isStatic) {
-                    receiver = createStaticReceiver(receiver);
-                }
-                mce = new MethodCallExpression(
-                        receiver,
-                        Traits.helperGetterName(fn),
-                        ArgumentListExpression.EMPTY_ARGUMENTS
-                );
-                mce.setSourcePosition(exp);
-                mce.setImplicitThis(false);
-                markDynamicCall(mce, fn, isStatic);
-                return mce;
-            } else if (accessedVariable instanceof PropertyNode) {
-                String propName = accessedVariable.getName();
-                if (knownFields.contains(propName)) {
-                    return createFieldHelperCall(exp, weavedType, propName);
+            if (accessedVariable instanceof FieldNode || accessedVariable 
instanceof PropertyNode) {
+                if (knownFields.contains(accessedVariable.getName())) {
+                    boolean isStatic = 
Modifier.isStatic(accessedVariable.getModifiers());
+                    Expression receiver = createFieldHelperReceiver();
+                    if (isStatic) {
+                        receiver = createStaticReceiver(receiver);
+                    }
+                    FieldNode fn = accessedVariable instanceof FieldNode ? 
(FieldNode) accessedVariable : ((PropertyNode) accessedVariable).getField();
+                    MethodCallExpression mce = new 
MethodCallExpression(receiver, Traits.helperGetterName(fn), 
ArgumentListExpression.EMPTY_ARGUMENTS);
+                    mce.setImplicitThis(false);
+                    mce.setSourcePosition(exp);
+                    markDynamicCall(mce, fn, isStatic);
+                    return mce;
                 } else {
                     PropertyExpression propertyExpression = new 
PropertyExpression(
                             new VariableExpression(weaved), 
accessedVariable.getName());
diff --git 
a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
 
b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index a0da8e7..2962db6 100644
--- 
a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ 
b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -1375,6 +1375,37 @@ assert p.get(0) == 'bar'
 '''
     }
 
+    // GROOVY-9739
+    void testTraitExtendsTraitWithDelegate() {
+        assertScript '''
+            class Main implements ClientSupport {
+                static main(args) {
+                    def tester = new Main(client: new Client())
+
+                    assert tester.isReady()
+                    assert tester.client.getValue() == 'works'
+                }
+            }
+
+            class Client {
+                def getValue() { 'works' }
+                boolean waitForServer(int seconds) { true }
+            }
+
+            trait ClientDelegate {
+                @Delegate Client client
+            }
+
+            trait ClientSupport implements ClientDelegate {
+                boolean isReady() {
+                    boolean ready = client.waitForServer(60)
+                    // assert, log, etc.
+                    return ready
+                }
+            }
+        '''
+    }
+
     void testAnnotationShouldBeCarriedOver() {
         assertScript '''import groovy.transform.ASTTest
 

Reply via email to