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:38 UTC

[groovy] branch GROOVY-7512 created (now 3c1dbe4)

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

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


      at 3c1dbe4  GROOVY-7512: add MapStyleConstructorCall override of transformExpression

This branch includes the following new commits:

     new 3c1dbe4  GROOVY-7512: add MapStyleConstructorCall override of transformExpression

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[groovy] 01/01: GROOVY-7512: add MapStyleConstructorCall override of transformExpression

Posted by em...@apache.org.
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 '''