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/07/07 00:27:10 UTC

[groovy] branch GROOVY-9422 created (now 07f91c3)

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

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


      at 07f91c3  GROOVY-9422: non-static inner class constructor call sets type of "this"

This branch includes the following new commits:

     new 07f91c3  GROOVY-9422: non-static inner class constructor call sets type of "this"

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-9422: non-static inner class constructor call sets type of "this"

Posted by em...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 07f91c3be9f4aa20b84acfa156634ba76c6d914b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Jul 6 19:26:53 2020 -0500

    GROOVY-9422: non-static inner class constructor call sets type of "this"
---
 .../codehaus/groovy/classgen/InnerClassVisitor.java   |  3 +--
 .../transform/stc/StaticTypeCheckingVisitor.java      | 14 +++-----------
 .../groovy/transform/stc/ConstructorsSTCTest.groovy   | 19 ++++++++++++++++++-
 3 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java
index 85acaa9..b6bd1fc 100644
--- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java
+++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitor.java
@@ -185,9 +185,8 @@ public class InnerClassVisitor extends InnerClassVisitorHelper implements Opcode
         int pCount = 0;
         if (!isStatic) {
             // need to pass "this" to access unknown methods/properties
-            expressions.add(pCount, VariableExpression.THIS_EXPRESSION);
-
             ClassNode enclosingType = (inClosure ? ClassHelper.CLOSURE_TYPE : outerClass).getPlainNodeReference();
+            expressions.add(pCount, new VariableExpression("this", enclosingType));
             Parameter thisParameter = new Parameter(enclosingType, "p" + pCount);
             parameters.add(pCount++, thisParameter);
 
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 38eb2f3..0dc82fc 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -648,16 +648,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
     private boolean storeTypeForSuper(final VariableExpression vexp) {
         if (vexp == VariableExpression.SUPER_EXPRESSION) return true;
         if (!vexp.isSuperExpression()) return false;
-        ClassNode superClassNode = typeCheckingContext.getEnclosingClassNode().getSuperClass();
-        storeType(vexp, makeType(superClassNode, typeCheckingContext.isInStaticContext));
+        storeType(vexp, makeSuper());
         return true;
     }
 
     private boolean storeTypeForThis(final VariableExpression vexp) {
         if (vexp == VariableExpression.THIS_EXPRESSION) return true;
         if (!vexp.isThisExpression()) return false;
-        ClassNode enclosingClassNode = typeCheckingContext.getEnclosingClassNode();
-        storeType(vexp, makeType(enclosingClassNode, typeCheckingContext.isInStaticContext));
+        // GROOVY-6904, GROOVY-9422: non-static inner class constructor call sets type
+        storeType(vexp, !OBJECT_TYPE.equals(vexp.getType()) ? vexp.getType() : makeThis());
         return true;
     }
 
@@ -2208,13 +2207,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         visitMethodCallArguments(receiver, argumentList, false, null);
 
         ClassNode[] args = getArgumentTypes(argumentList);
-        if (args.length > 0 &&
-                typeCheckingContext.getEnclosingClosure() != null &&
-                isThisExpression(argumentList.getExpression(0)) &&
-                args[0].equals(call.getType().getOuterClass()) &&
-                !call.getType().isStaticClass()) {
-            args[0] = CLOSURE_TYPE;
-        }
 
         MethodNode node;
         if (looksLikeNamedArgConstructor(receiver, args)
diff --git a/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy b/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
index 628fa7a..af11740 100644
--- a/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
@@ -473,5 +473,22 @@ class ConstructorsSTCTest extends StaticTypeCheckingTestCase {
             new Test().main()
         '''
     }
-}
 
+    // GROOVY-9422
+    void testInnerClassConstructorCallWithinClosure() {
+        assertScript '''
+            class A {
+              class B {
+                B(param) {}
+                String x = 'value'
+              }
+              def test() {
+                ['s'].collect { String s ->
+                  new B(s).x // expect outer class, not closure as implicit first param to inner class constructor
+                }
+              }
+            }
+            assert new A().test() == ['value']
+        '''
+    }
+}