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/06/11 22:14:39 UTC
[groovy] 01/01: GROOVY-7512: add MapStyleConstructorCall override
of transformExpression
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY-7512
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 3c1dbe44d0229de3eae35988095e80bf5ec5d6a2
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Jun 11 17:14:21 2020 -0500
GROOVY-7512: add MapStyleConstructorCall override of transformExpression
- allow PostTypeCheckingExpressionReplacer to replace closure literals
---
.../transformers/ConstructorCallTransformer.java | 13 +++++++++++
.../groovy/classgen/asm/sc/bugs/Groovy7242.groovy | 26 ++++++++++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/ConstructorCallTransformer.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/ConstructorCallTransformer.java
index d4f31e4..0a01f16 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/ConstructorCallTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/ConstructorCallTransformer.java
@@ -27,6 +27,7 @@ import org.codehaus.groovy.ast.Parameter;
import org.codehaus.groovy.ast.expr.BinaryExpression;
import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
import org.codehaus.groovy.ast.expr.Expression;
+import org.codehaus.groovy.ast.expr.ExpressionTransformer;
import org.codehaus.groovy.ast.expr.MapEntryExpression;
import org.codehaus.groovy.ast.expr.MapExpression;
import org.codehaus.groovy.ast.expr.TupleExpression;
@@ -125,6 +126,18 @@ public class ConstructorCallTransformer {
}
@Override
+ public Expression transformExpression(final ExpressionTransformer transformer) {
+ Expression result = new MapStyleConstructorCall(
+ staticCompilationTransformer, declaringClass,
+ (MapExpression) map.transformExpression(transformer),
+ (ConstructorCallExpression) originalCall.transformExpression(transformer)
+ );
+ result.copyNodeMetaData(this);
+ result.setSourcePosition(this);
+ return result;
+ }
+
+ @Override
public void visit(final GroovyCodeVisitor visitor) {
if (visitor instanceof AsmClassGenerator) {
acg = (AsmClassGenerator) visitor;
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7242.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7242.groovy
index 6884ea6..78f4b78 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7242.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/bugs/Groovy7242.groovy
@@ -102,6 +102,32 @@ final class Groovy7242 extends StaticTypeCheckingTestCase implements StaticCompi
'''
}
+ // GROOVY-7512
+ void testCallTraitMethodFromTraitClosureInMapConstructor() {
+ assertScript '''
+ class Foo {
+ Closure bar
+ }
+
+ trait T {
+ Foo getFoo() {
+ new Foo(bar: { ->
+ baz 'xyz' // ClassCastException: java.lang.Class cannot be cast to T
+ })
+ }
+ def baz(text) {
+ text
+ }
+ }
+
+ class C implements T {
+ }
+
+ Foo foo = new C().foo
+ assert foo.bar.call() == 'xyz'
+ '''
+ }
+
// GROOVY-9586
void testDelegateVsOwnerMethodFromTraitClosure1() {
assertScript '''