Skip to content

Commit b84587b

Browse files
committed
GROOVY-9885
1 parent 3bf39d8 commit b84587b

4 files changed

Lines changed: 49 additions & 4 deletions

File tree

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5481,6 +5481,28 @@ public void testCompileStatic9883() {
54815481
"----------\n");
54825482
}
54835483

5484+
@Test
5485+
public void testCompileStatic9885() {
5486+
//@formatter:off
5487+
String[] sources = {
5488+
"Main.groovy",
5489+
"@groovy.transform.ToString\n" +
5490+
"class C {\n" +
5491+
" String p\n" +
5492+
"}\n" +
5493+
"@groovy.transform.CompileStatic\n" +
5494+
"void test(String string, whatever) {\n" +
5495+
" print new C(p: string.trim() ?: \"$whatever\")\n" +
5496+
"}\n" +
5497+
"test('x','y')\n" +
5498+
"test(' ','y')\n" +
5499+
"test(' ',123)\n",
5500+
};
5501+
//@formatter:on
5502+
5503+
runConformTest(sources, "C(x)C(y)C(123)");
5504+
}
5505+
54845506
@Test
54855507
public void testCompileStatic9892() {
54865508
//@formatter:off

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,7 +1355,15 @@ protected void checkGroovyConstructorMap(final Expression receiver, final ClassN
13551355
ClassNode valueType = getType(entryExpression.getValueExpression());
13561356
MethodNode setter = receiverType.getSetterMethod("set" + MetaClassHelper.capitalize(pexp.getPropertyAsString()), false);
13571357
ClassNode toBeAssignedTo = setter == null ? lookup.get() : setter.getParameters()[0].getType();
1358+
/* GRECLIPSE edit -- GROOVY-9885
13581359
if (!isAssignableTo(valueType, toBeAssignedTo)
1360+
*/
1361+
Expression valueExpression = entryExpression.getValueExpression();
1362+
BinaryExpression assign = new BinaryExpression(keyExpr, GeneralUtils.ASSIGN, valueExpression);
1363+
assign.setSourcePosition(entryExpression);
1364+
ClassNode resultType = getResultType(toBeAssignedTo, ASSIGN, valueType, assign);
1365+
if (!checkCompatibleAssignmentTypes(toBeAssignedTo, resultType, valueExpression)
1366+
// GRECLIPSE end
13591367
&& !extension.handleIncompatibleAssignment(toBeAssignedTo, valueType, entryExpression)) {
13601368
addAssignmentError(toBeAssignedTo, valueType, entryExpression);
13611369
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
import org.codehaus.groovy.ast.stmt.SwitchStatement;
9595
import org.codehaus.groovy.ast.stmt.TryCatchStatement;
9696
import org.codehaus.groovy.ast.stmt.WhileStatement;
97+
import org.codehaus.groovy.ast.tools.GeneralUtils;
9798
import org.codehaus.groovy.ast.tools.GenericsUtils;
9899
import org.codehaus.groovy.ast.tools.WideningCategories;
99100
import org.codehaus.groovy.classgen.ReturnAdder;
@@ -1314,7 +1315,15 @@ protected void checkGroovyConstructorMap(final Expression receiver, final ClassN
13141315
ClassNode valueType = getType(entryExpression.getValueExpression());
13151316
MethodNode setter = receiverType.getSetterMethod(getSetterName(pexp.getPropertyAsString()), false);
13161317
ClassNode toBeAssignedTo = setter == null ? lookup.get() : setter.getParameters()[0].getType();
1318+
/* GRECLIPSE edit -- GROOVY-9885
13171319
if (!isAssignableTo(valueType, toBeAssignedTo)
1320+
*/
1321+
Expression valueExpression = entryExpression.getValueExpression();
1322+
BinaryExpression assign = new BinaryExpression(keyExpr, GeneralUtils.ASSIGN, valueExpression);
1323+
assign.setSourcePosition(entryExpression);
1324+
ClassNode resultType = getResultType(toBeAssignedTo, ASSIGN, valueType, assign);
1325+
if (!checkCompatibleAssignmentTypes(toBeAssignedTo, resultType, valueExpression)
1326+
// GRECLIPSE end
13181327
&& !extension.handleIncompatibleAssignment(toBeAssignedTo, valueType, entryExpression)) {
13191328
addAssignmentError(toBeAssignedTo, valueType, entryExpression);
13201329
}

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
import org.codehaus.groovy.ast.stmt.SwitchStatement;
9595
import org.codehaus.groovy.ast.stmt.TryCatchStatement;
9696
import org.codehaus.groovy.ast.stmt.WhileStatement;
97+
import org.codehaus.groovy.ast.tools.GeneralUtils;
9798
import org.codehaus.groovy.ast.tools.GenericsUtils;
9899
import org.codehaus.groovy.ast.tools.WideningCategories;
99100
import org.codehaus.groovy.classgen.ReturnAdder;
@@ -1275,10 +1276,7 @@ protected void typeCheckAssignment(final BinaryExpression assignmentExpression,
12751276
ClassNode wrappedRHS = adjustTypeForSpreading(inferredRightExpressionType, leftExpression);
12761277

12771278
// check types are compatible for assignment
1278-
boolean compatible = checkCompatibleAssignmentTypes(leftRedirect, wrappedRHS, rightExpression);
1279-
1280-
1281-
if (!compatible) {
1279+
if (!checkCompatibleAssignmentTypes(leftRedirect, wrappedRHS, rightExpression)) {
12821280
if (!extension.handleIncompatibleAssignment(leftExpressionType, inferredRightExpressionType, assignmentExpression)) {
12831281
addAssignmentError(leftExpressionType, inferredRightExpressionType, assignmentExpression.getRightExpression());
12841282
}
@@ -1309,7 +1307,15 @@ protected void checkGroovyConstructorMap(final Expression receiver, final ClassN
13091307
ClassNode valueType = getType(entryExpression.getValueExpression());
13101308
MethodNode setter = receiverType.getSetterMethod(getSetterName(pexp.getPropertyAsString()), false);
13111309
ClassNode toBeAssignedTo = setter == null ? lookup.get() : setter.getParameters()[0].getType();
1310+
/* GRECLIPSE edit -- GROOVY-9885
13121311
if (!isAssignableTo(valueType, toBeAssignedTo)
1312+
*/
1313+
Expression valueExpression = entryExpression.getValueExpression();
1314+
BinaryExpression assign = new BinaryExpression(keyExpr, GeneralUtils.ASSIGN, valueExpression);
1315+
assign.setSourcePosition(entryExpression);
1316+
ClassNode resultType = getResultType(toBeAssignedTo, ASSIGN, valueType, assign);
1317+
if (!checkCompatibleAssignmentTypes(toBeAssignedTo, resultType, valueExpression)
1318+
// GRECLIPSE end
13131319
&& !extension.handleIncompatibleAssignment(toBeAssignedTo, valueType, entryExpression)) {
13141320
addAssignmentError(toBeAssignedTo, valueType, entryExpression);
13151321
}

0 commit comments

Comments
 (0)