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/02/27 15:31:08 UTC
[groovy] 01/01: GROOVY-10072: SC/STC: `def c = { p = defaultValue -> return p }; c()`
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
commit c98739fafcb7824c3ebb04583fdf7576f6452f5d
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun Feb 27 08:04:16 2022 -0600
GROOVY-10072: SC/STC: `def c = { p = defaultValue -> return p }; c()`
Conflicts:
src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
---
.../org/codehaus/groovy/classgen/asm/ClosureWriter.java | 4 ++--
.../classgen/asm/sc/StaticTypesClosureWriter.java | 4 +++-
.../groovy/transform/stc/StaticTypeCheckingVisitor.java | 6 ++++--
src/test/groovy/transform/stc/ClosuresSTCTest.groovy | 17 ++++++++++++++++-
4 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
index 607d6e3..dda126d 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
@@ -31,7 +31,6 @@ import org.codehaus.groovy.ast.Variable;
import org.codehaus.groovy.ast.VariableScope;
import org.codehaus.groovy.ast.expr.ClassExpression;
import org.codehaus.groovy.ast.expr.ClosureExpression;
-import org.codehaus.groovy.ast.expr.ConstantExpression;
import org.codehaus.groovy.ast.expr.ConstructorCallExpression;
import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.expr.FieldExpression;
@@ -54,6 +53,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorSuperX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
@@ -196,7 +196,7 @@ public class ClosureWriter {
parameters = Parameter.EMPTY_ARRAY;
} else if (parameters.length == 0) {
// let's create a default 'it' parameter
- Parameter it = param(ClassHelper.OBJECT_TYPE, "it", ConstantExpression.NULL);
+ Parameter it = param(ClassHelper.OBJECT_TYPE, "it", nullX());
parameters = new Parameter[]{it};
Variable ref = expression.getVariableScope().getDeclaredVariable("it");
if (ref != null) it.setClosureSharedVariable(ref.isClosureSharedVariable());
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesClosureWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesClosureWriter.java
index 89020f1..b3164b2 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesClosureWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesClosureWriter.java
@@ -96,7 +96,9 @@ public class StaticTypesClosureWriter extends ClosureWriter {
private static Expression defaultArgument(final Parameter parameter) {
Expression argument;
- if (parameter.getType().isArray()) {
+ if (parameter.hasInitialExpression()) {
+ argument = parameter.getInitialExpression(); // GROOVY-10072
+ } else if (parameter.getType().isArray()) {
ClassNode elementType = parameter.getType().getComponentType();
argument = new ArrayExpression(elementType, null, Collections.singletonList(constX(0, true)));
} else {
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 c426248..7bc2ccc 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -235,7 +235,7 @@ import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.Matche
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.NUMBER_OPS;
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.UNKNOWN_PARAMETER_TYPE;
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.addMethodLevelDeclaredGenerics;
-import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.allParametersAndArgumentsMatch;
+import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.allParametersAndArgumentsMatchWithDefaultParams;
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.applyGenericsConnections;
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.applyGenericsContext;
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.applyGenericsContextToParameterClass;
@@ -2424,6 +2424,8 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
typeCheckingContext.isInStaticContext = oldStaticContext;
for (Parameter parameter : getParametersSafe(expression)) {
typeCheckingContext.controlStructureVariables.remove(parameter);
+ // GROOVY-10072: visit param default argument expression if present
+ visitInitialExpression(parameter.getInitialExpression(), varX(parameter), parameter);
}
}
@@ -3887,7 +3889,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
protected void typeCheckClosureCall(final Expression arguments, final ClassNode[] argumentTypes, final Parameter[] parameters) {
- if (allParametersAndArgumentsMatch(parameters, argumentTypes) < 0 && lastArgMatchesVarg(parameters, argumentTypes) < 0) {
+ if (allParametersAndArgumentsMatchWithDefaultParams(parameters, argumentTypes) < 0 && lastArgMatchesVarg(parameters, argumentTypes) < 0) {
addStaticTypeError("Cannot call closure that accepts " + formatArgumentList(extractTypesFromParameters(parameters)) + " with " + formatArgumentList(argumentTypes), arguments);
}
}
diff --git a/src/test/groovy/transform/stc/ClosuresSTCTest.groovy b/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
index f4909d9..510d07b 100644
--- a/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
@@ -57,6 +57,21 @@ class ClosuresSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10072
+ void testClosureWithoutArguments5() {
+ assertScript '''
+ def c = { p = 'foo' -> return p }
+ assert c('bar') == 'bar'
+ assert c() == 'foo'
+ '''
+
+ assertScript '''
+ def c = { p, q = 'baz' -> '' + p + q }
+ assert c('foo', 'bar') == 'foobar'
+ assert c('foo') == 'foobaz'
+ '''
+ }
+
void testClosureWithArguments1() {
assertScript '''
def c = { int a, int b -> a + b }
@@ -64,7 +79,7 @@ class ClosuresSTCTest extends StaticTypeCheckingTestCase {
'''
shouldFailWithMessages '''
- def c = { int a, int b -> print a + b }
+ def c = { int a, int b -> a + b }
c('5', '7')
''',
'Cannot call closure that accepts [int, int] with [java.lang.String, java.lang.String]'