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 {