You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/06/13 13:28:32 UTC

[groovy] branch master updated: GROOVY-7512: add MapStyleConstructorCall override of transformExpression

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 21b6162  GROOVY-7512: add MapStyleConstructorCall override of transformExpression
21b6162 is described below

commit 21b61620a98a0d83361bac5ec728a2db37d36c9f
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 '''