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 2022/06/29 19:23:17 UTC
[groovy] branch GROOVY_3_0_X updated: GROOVY-10673: STC: outer closure parameter reference
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 28ff2eefd4 GROOVY-10673: STC: outer closure parameter reference
28ff2eefd4 is described below
commit 28ff2eefd419c6b4159859591ea82f0942b07f53
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Jun 29 13:38:25 2022 -0500
GROOVY-10673: STC: outer closure parameter reference
---
.../transform/stc/StaticTypeCheckingVisitor.java | 38 +++++++++++-----------
.../groovy/transform/stc/GenericsSTCTest.groovy | 24 ++++++++++++++
2 files changed, 43 insertions(+), 19 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 f421fabc0e..03db7b99a2 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -4979,9 +4979,8 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
type = typeCheckingContext.controlStructureVariables.get(parameter);
}
// now check for closure override
- TypeCheckingContext.EnclosingClosure enclosingClosure = typeCheckingContext.getEnclosingClosure();
- if (type == null && enclosingClosure != null && temporaryTypesForExpression == null) {
- type = getTypeFromClosureArguments(parameter, enclosingClosure);
+ if (type == null && temporaryTypesForExpression == null) {
+ type = getTypeFromClosureArguments(parameter);
}
if (type != null) {
storeType(vexp, type);
@@ -5056,25 +5055,26 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
return ((Expression) exp).getType();
}
- private ClassNode getTypeFromClosureArguments(final Parameter parameter, final TypeCheckingContext.EnclosingClosure enclosingClosure) {
- ClosureExpression closureExpression = enclosingClosure.getClosureExpression();
- ClassNode[] closureParamTypes = closureExpression.getNodeMetaData(CLOSURE_ARGUMENTS);
- if (closureParamTypes == null) return null;
- Parameter[] parameters = closureExpression.getParameters();
- String name = parameter.getName();
-
- if (parameters != null) {
- if (parameters.length == 0) {
- return "it".equals(name) && closureParamTypes.length != 0 ? closureParamTypes[0] : null;
- }
-
- for (int index = 0; index < parameters.length; index++) {
- if (name.equals(parameters[index].getName())) {
- return closureParamTypes.length > index ? closureParamTypes[index] : null;
+ private ClassNode getTypeFromClosureArguments(final Parameter parameter) {
+ for (TypeCheckingContext.EnclosingClosure enclosingClosure : typeCheckingContext.getEnclosingClosureStack()) {
+ ClosureExpression closureExpression = enclosingClosure.getClosureExpression();
+ ClassNode[] closureParamTypes = closureExpression.getNodeMetaData(CLOSURE_ARGUMENTS);
+ if (closureParamTypes != null) {
+ Parameter[] parameters = closureExpression.getParameters();
+ if (parameters != null) {
+ final int n = parameters.length;
+ String parameterName = parameter.getName();
+ if (n == 0 && parameterName.equals("it")) {
+ return closureParamTypes.length > 0 ? closureParamTypes[0] : null;
+ }
+ for (int i = 0; i < n; i += 1) {
+ if (parameterName.equals(parameters[i].getName())) {
+ return closureParamTypes.length > i ? closureParamTypes[i] : null;
+ }
+ }
}
}
}
-
return null;
}
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 06a5b3ab39..0b28f76d50 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -4242,6 +4242,30 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10673
+ void testMockito() {
+ assertScript '''
+ @Grab('org.mockito:mockito-core:4.5.1')
+ import static org.mockito.Mockito.*
+
+ class C {
+ String string
+ }
+ interface I {
+ C f(String s)
+ }
+
+ def i = mock(I)
+ when(i.f(anyString())).thenAnswer { /*InvocationOnMock*/ iom ->
+ //new C(string: iom.arguments[0]) works
+ new C().tap {
+ string = iom.arguments[0]
+ }
+ }
+ assert i.f('x') instanceof C
+ '''
+ }
+
//--------------------------------------------------------------------------
static class MyList