You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/07/08 02:05:34 UTC
[groovy] branch GROOVY_3_0_X updated: GROOVY-9422: non-static inner
class constructor call sets type of "this" (closes #1301)
This is an automated email from the ASF dual-hosted git repository.
paulk 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 31b0ab7 GROOVY-9422: non-static inner class constructor call sets type of "this" (closes #1301)
31b0ab7 is described below
commit 31b0ab7fdc10bee737203c3de06c58bd25ac46d7
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" (closes #1301)
---
.../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 63faa85..4826404 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']
+ '''
+ }
+}