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 2020/08/06 20:08:49 UTC

[groovy] 01/01: GROOVY-9256: process closure expressions for Trait.super.name transforms

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

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

commit 52057c6b42e2b579c4dc66d4a570c87f22846a00
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Aug 6 15:05:13 2020 -0500

    GROOVY-9256: process closure expressions for Trait.super.name transforms
---
 .../transform/trait/SuperCallTraitTransformer.java | 14 +++++++++
 .../traitx/TraitASTTransformationTest.groovy       | 33 ++++++++++++++++++++++
 2 files changed, 47 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
index 4eccccb..601cf59 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
@@ -28,11 +28,13 @@ import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.expr.ArgumentListExpression;
 import org.codehaus.groovy.ast.expr.BinaryExpression;
 import org.codehaus.groovy.ast.expr.ClassExpression;
+import org.codehaus.groovy.ast.expr.ClosureExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.PropertyExpression;
 import org.codehaus.groovy.ast.expr.TupleExpression;
 import org.codehaus.groovy.ast.expr.VariableExpression;
+import org.codehaus.groovy.ast.tools.ClosureUtils;
 import org.codehaus.groovy.control.SourceUnit;
 import org.codehaus.groovy.syntax.Types;
 
@@ -66,6 +68,9 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
         if (exp instanceof BinaryExpression) {
             return transformBinaryExpression((BinaryExpression) exp);
         }
+        if (exp instanceof ClosureExpression) {
+            return transformClosureExpression((ClosureExpression) exp);
+        }
         if (exp instanceof MethodCallExpression) {
             return transformMethodCallExpression((MethodCallExpression) exp);
         }
@@ -109,6 +114,15 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
         return trn;
     }
 
+    private Expression transformClosureExpression(final ClosureExpression exp) {
+        for (Parameter prm : ClosureUtils.getParametersSafe(exp)) {
+            Expression ini = transform(prm.getInitialExpression());
+            prm.setInitialExpression(ini);
+        }
+        visitClassCodeContainer(exp.getCode());
+        return super.transform(exp);
+    }
+
     private Expression transformMethodCallExpression(final MethodCallExpression exp) {
         ClassNode traitType = getTraitSuperTarget(exp.getObjectExpression());
         if (traitType != null) {
diff --git a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index 11cf72c..470af73 100644
--- a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -399,6 +399,7 @@ final class TraitASTTransformationTest {
         '''
     }
 
+    @Test
     void testTraitOnEnum() {
         assertScript '''
             trait WithBar { int bar }
@@ -1048,6 +1049,37 @@ final class TraitASTTransformationTest {
         '''
     }
 
+    @Test // GROOVY-9256
+    void testTraitSuperCallWithinClosure() {
+        assertScript '''
+            trait T {
+              int getX() { 42 }
+            }
+            class C implements T {
+              def test() {
+                { ->
+                  T.super.getX()
+                }()
+              }
+            }
+            assert new C().test() == 42
+        '''
+
+        assertScript '''
+            trait T {
+              int getX() { 42 }
+            }
+            class C implements T {
+              def test() {
+                { p = T.super.getX() ->
+                  return p
+                }()
+              }
+            }
+            assert new C().test() == 42
+        '''
+    }
+
     @Test
     void testTraitShouldNotTakeOverSuperClassMethod() {
         assertScript '''
@@ -1700,6 +1732,7 @@ final class TraitASTTransformationTest {
         '''
     }
 
+    @Test
     void testIncrementPropertyOfTraitUsingPlusPlus() {
         def err = shouldFail '''
             trait Level {