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 2021/03/21 14:55:32 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-7945: resolve type of "super" ctor call including type arguments

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

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


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new 08e7975  GROOVY-7945: resolve type of "super" ctor call including type arguments
08e7975 is described below

commit 08e79757d486a7b093ebed90199d7e4bf29f1025
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Mar 16 15:04:24 2021 -0500

    GROOVY-7945: resolve type of "super" ctor call including type arguments
---
 .../transform/stc/StaticTypeCheckingVisitor.java   |  8 ++++---
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 28 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 7b79d14..abe3fce 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2177,11 +2177,13 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
             extension.afterMethodCall(call);
             return;
         }
-        ClassNode receiver = call.getType();
+        ClassNode receiver;
         if (call.isThisCall()) {
-            receiver = typeCheckingContext.getEnclosingClassNode();
+            receiver = makeThis();
         } else if (call.isSuperCall()) {
-            receiver = typeCheckingContext.getEnclosingClassNode().getSuperClass();
+            receiver = makeSuper();
+        } else {
+            receiver = call.getType();
         }
         Expression arguments = call.getArguments();
         ArgumentListExpression argumentList = InvocationWriter.makeArgumentList(arguments);
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index ef55b9d..2c0b7bd 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -418,6 +418,34 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-7945
+    void testSpecialCtorCallWithClassLiteral() {
+        shouldFailWithMessages '''
+            abstract class A<X, Y> {
+                private final Class<X> x
+                private final Class<Y> y
+
+                A(Class<X> x, Class<Y> y) {
+                    this.x = x
+                    this.y = y
+                }
+
+                void test() {
+                    println("{$x} and {$y}")
+                }
+            }
+
+            class B extends A<String, Integer> {
+                B() {
+                    super(Integer, String)
+                }
+            }
+
+            A<String, Integer> a = new B()
+            a.test()
+        ''', 'Cannot call A <String, Integer>#<init>(java.lang.Class <String>, java.lang.Class <Integer>) with arguments [java.lang.Class <java.lang.Integer>, java.lang.Class <java.lang.String>]'
+    }
+
     // GROOVY-9460
     void testMethodCallWithClassParameterUnbounded() {
         assertScript '''