GROOVY-7951: MethodCallExpression.transformExpression does not copy generic 
types (closes #441)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/e914966d
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/e914966d
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/e914966d

Branch: refs/heads/parrot
Commit: e914966d71a84ae32c763c17821ceb99d25e3e93
Parents: 4bca3fe
Author: John Wagenleitner <jwagenleit...@apache.org>
Authored: Wed Oct 12 22:05:37 2016 -0700
Committer: John Wagenleitner <jwagenleit...@apache.org>
Committed: Wed Oct 12 22:06:44 2016 -0700

----------------------------------------------------------------------
 .../groovy/ast/expr/MethodCallExpression.java   |  1 +
 src/test/groovy/bugs/Groovy7951Bug.groovy       | 75 ++++++++++++++++++++
 2 files changed, 76 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/e914966d/src/main/org/codehaus/groovy/ast/expr/MethodCallExpression.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/ast/expr/MethodCallExpression.java 
b/src/main/org/codehaus/groovy/ast/expr/MethodCallExpression.java
index a2a6d38..c3e7535 100644
--- a/src/main/org/codehaus/groovy/ast/expr/MethodCallExpression.java
+++ b/src/main/org/codehaus/groovy/ast/expr/MethodCallExpression.java
@@ -72,6 +72,7 @@ public class MethodCallExpression extends Expression 
implements MethodCall {
         answer.setSafe(safe);
         answer.setSpreadSafe(spreadSafe);
         answer.setImplicitThis(implicitThis);
+        answer.setGenericsTypes(genericsTypes);
         answer.setSourcePosition(this);
         answer.setMethodTarget(target);
         answer.copyNodeMetaData(this);

http://git-wip-us.apache.org/repos/asf/groovy/blob/e914966d/src/test/groovy/bugs/Groovy7951Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/Groovy7951Bug.groovy 
b/src/test/groovy/bugs/Groovy7951Bug.groovy
new file mode 100644
index 0000000..ec523c8
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy7951Bug.groovy
@@ -0,0 +1,75 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy.bugs
+
+import org.codehaus.groovy.ast.ClassCodeExpressionTransformer
+import org.codehaus.groovy.ast.ClassCodeVisitorSupport
+import org.codehaus.groovy.ast.ClassNode
+import org.codehaus.groovy.ast.expr.MethodCallExpression
+import org.codehaus.groovy.control.CompilerConfiguration
+import org.codehaus.groovy.control.SourceUnit
+import org.codehaus.groovy.control.customizers.CompilationCustomizer
+import org.codehaus.groovy.classgen.GeneratorContext
+
+import static org.codehaus.groovy.control.CompilePhase.CANONICALIZATION
+import static org.codehaus.groovy.control.CompilePhase.INSTRUCTION_SELECTION
+
+class Groovy7951Bug extends GroovyTestCase {
+
+    void testTransformMethodCallExpressionPassesGenericTypes() {
+
+        def config = new CompilerConfiguration()
+
+        // Just visiting the transform method on each expression is enough to 
verify
+        // that the checker is able to see the generic types in the later 
phase.
+        def transformer = new CompilationCustomizer(CANONICALIZATION) {
+            @Override void call(SourceUnit src, GeneratorContext ctxt, 
ClassNode cn) {
+                new ClassCodeExpressionTransformer() {
+                    @Override SourceUnit getSourceUnit() { src }
+                }.visitClass(cn)
+            }
+        }
+
+        boolean assertWasChecked
+        def checker = new CompilationCustomizer(INSTRUCTION_SELECTION) {
+            void call(SourceUnit src, GeneratorContext ctxt, ClassNode cn) {
+                new ClassCodeVisitorSupport() {
+                    @Override void 
visitMethodCallExpression(MethodCallExpression mce) {
+                        if (mce.objectExpression.text == 
'java.util.Collections' &&
+                                mce.method.text == 'emptyList') {
+                            assert mce.genericsTypes != null && 
mce.genericsTypes*.name == ['Date']
+                            assertWasChecked = true
+                        }
+                        super.visitMethodCallExpression(mce)
+                    }
+                    @Override SourceUnit getSourceUnit() { src }
+                }.visitClass(cn)
+            }
+        }
+
+        config.addCompilationCustomizers(transformer, checker)
+
+        new GroovyShell(config).parse '''
+            Collections.<Date>emptyList()
+        '''
+
+        assert assertWasChecked
+    }
+
+}

Reply via email to