Skip to content

Commit 29ebe97

Browse files
committed
GROOVY-10094, GROOVY-10104
1 parent c51fb47 commit 29ebe97

5 files changed

Lines changed: 70 additions & 0 deletions

File tree

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/StaticCompilationTests.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6288,6 +6288,9 @@ public void testCompileStatic10072() {
62886288
" c = { p, q = 'baz' -> '' + p + q }\n" +
62896289
" assert c('foo', 'bar') == 'foobar'\n" +
62906290
" assert c('foo') == 'foobaz'\n" +
6291+
" c = { p, q = p.toString() -> '' + p + q }\n" +
6292+
" assert c('foo', 'bar') == 'foobar'\n" +
6293+
" assert c('foo') == 'foofoo'\n" +
62916294
"}\n" +
62926295
"test()\n",
62936296
};

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3000,6 +3000,26 @@ public void testTypeChecked10091() {
30003000
"----------\n");
30013001
}
30023002

3003+
@Test
3004+
public void testTypeChecked10094() {
3005+
//@formatter:off
3006+
String[] sources = {
3007+
"Main.groovy",
3008+
"@groovy.transform.TypeChecked\n" +
3009+
"void test(int i = 'error') {}\n" +
3010+
"test()\n",
3011+
};
3012+
//@formatter:on
3013+
3014+
runNegativeTest(sources,
3015+
"----------\n" +
3016+
"1. ERROR in Main.groovy (at line 2)\n" +
3017+
"\tvoid test(int i = 'error') {}\n" +
3018+
"\t ^^^^^^^\n" +
3019+
"Groovy:[Static type checking] - Cannot assign value of type java.lang.String to variable of type int\n" +
3020+
"----------\n");
3021+
}
3022+
30033023
@Test
30043024
public void testTypeChecked10098() {
30053025
//@formatter:off

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.codehaus.groovy.ast.ClassCodeVisitorSupport;
3737
import org.codehaus.groovy.ast.ClassHelper;
3838
import org.codehaus.groovy.ast.ClassNode;
39+
import org.codehaus.groovy.ast.CodeVisitorSupport;
3940
import org.codehaus.groovy.ast.ConstructorNode;
4041
import org.codehaus.groovy.ast.DynamicVariable;
4142
import org.codehaus.groovy.ast.FieldNode;
@@ -2611,6 +2612,21 @@ protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)
26112612
typeCheckingContext.pushEnclosingMethod(node);
26122613
if (!isSkipMode(node) && !shouldSkipMethodNode(node)) {
26132614
super.visitConstructorOrMethod(node, isConstructor);
2615+
// GRECLIPSE add
2616+
if (node.hasDefaultValue())
2617+
for (Parameter parameter : node.getParameters()) {
2618+
if (!parameter.hasInitialExpression()) continue;
2619+
// GROOVY-10094: visit param default argument expression
2620+
visitInitialExpression(parameter.getInitialExpression(), varX(parameter), parameter);
2621+
// GROOVY-10104: remove direct target setting to prevent errors
2622+
parameter.getInitialExpression().visit(new CodeVisitorSupport() {
2623+
@Override
2624+
public void visitMethodCallExpression(final MethodCallExpression mce) {
2625+
mce.setMethodTarget(null); super.visitMethodCallExpression(mce);
2626+
}
2627+
});
2628+
}
2629+
// GRECLIPSE end
26142630
}
26152631
if (!isConstructor) {
26162632
returnAdder.visitMethod(node); // return statement added after visitConstructorOrMethod finished... we can not count these auto-generated return statements(GROOVY-7753), see `typeCheckingContext.pushEnclosingReturnStatement`

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.codehaus.groovy.ast.ClassCodeVisitorSupport;
3737
import org.codehaus.groovy.ast.ClassHelper;
3838
import org.codehaus.groovy.ast.ClassNode;
39+
import org.codehaus.groovy.ast.CodeVisitorSupport;
3940
import org.codehaus.groovy.ast.ConstructorNode;
4041
import org.codehaus.groovy.ast.DynamicVariable;
4142
import org.codehaus.groovy.ast.FieldNode;
@@ -2344,6 +2345,21 @@ protected void visitConstructorOrMethod(final MethodNode node, final boolean isC
23442345
typeCheckingContext.pushEnclosingMethod(node);
23452346
if (!isSkipMode(node) && !shouldSkipMethodNode(node)) {
23462347
super.visitConstructorOrMethod(node, isConstructor);
2348+
// GRECLIPSE add
2349+
if (node.hasDefaultValue())
2350+
for (Parameter parameter : node.getParameters()) {
2351+
if (!parameter.hasInitialExpression()) continue;
2352+
// GROOVY-10094: visit param default argument expression
2353+
visitInitialExpression(parameter.getInitialExpression(), varX(parameter), parameter);
2354+
// GROOVY-10104: remove direct target setting to prevent errors
2355+
parameter.getInitialExpression().visit(new CodeVisitorSupport() {
2356+
@Override
2357+
public void visitMethodCallExpression(final MethodCallExpression mce) {
2358+
mce.setMethodTarget(null); super.visitMethodCallExpression(mce);
2359+
}
2360+
});
2361+
}
2362+
// GRECLIPSE end
23472363
}
23482364
if (!isConstructor) {
23492365
returnAdder.visitMethod(node); // return statement added after visitConstructorOrMethod finished... we can not count these auto-generated return statements(GROOVY-7753), see `typeCheckingContext.pushEnclosingReturnStatement`

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,6 +2176,21 @@ protected void visitConstructorOrMethod(final MethodNode node, final boolean isC
21762176
typeCheckingContext.pushEnclosingMethod(node);
21772177
if (!isSkipMode(node) && !shouldSkipMethodNode(node)) {
21782178
super.visitConstructorOrMethod(node, isConstructor);
2179+
// GRECLIPSE add
2180+
if (node.hasDefaultValue())
2181+
for (Parameter parameter : node.getParameters()) {
2182+
if (!parameter.hasInitialExpression()) continue;
2183+
// GROOVY-10094: visit param default argument expression
2184+
visitInitialExpression(parameter.getInitialExpression(), varX(parameter), parameter);
2185+
// GROOVY-10104: remove direct target setting to prevent errors
2186+
parameter.getInitialExpression().visit(new CodeVisitorSupport() {
2187+
@Override
2188+
public void visitMethodCallExpression(final MethodCallExpression mce) {
2189+
mce.setMethodTarget(null); super.visitMethodCallExpression(mce);
2190+
}
2191+
});
2192+
}
2193+
// GRECLIPSE end
21792194
}
21802195
if (!isConstructor) {
21812196
returnAdder.visitMethod(node); // return statement added after visitConstructorOrMethod finished... we can not count these auto-generated return statements(GROOVY-7753), see `typeCheckingContext.pushEnclosingReturnStatement`

0 commit comments

Comments
 (0)