Repository: incubator-groovy Updated Branches: refs/heads/master f0bf0c867 -> 24ec32e6a
GROOVY-4787: BUG! exception in phase 'class generation' generating class from map in closure (closes #30) Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/24ec32e6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/24ec32e6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/24ec32e6 Branch: refs/heads/master Commit: 24ec32e6a5cfb653f9ca8aa151bbf6a671905098 Parents: f0bf0c8 Author: Paul King <pa...@asert.com.au> Authored: Mon Jun 1 22:42:37 2015 +1000 Committer: Paul King <pa...@asert.com.au> Committed: Mon Jun 1 22:43:13 2015 +1000 ---------------------------------------------------------------------- .../codehaus/groovy/control/ResolveVisitor.java | 7 ++++ .../operator/SpreadMapOperatorTest.groovy | 34 ++++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/24ec32e6/src/main/org/codehaus/groovy/control/ResolveVisitor.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/org/codehaus/groovy/control/ResolveVisitor.java index 302207c..c0f6f2b 100644 --- a/src/main/org/codehaus/groovy/control/ResolveVisitor.java +++ b/src/main/org/codehaus/groovy/control/ResolveVisitor.java @@ -1002,6 +1002,13 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer { return ce; } } + } else if (be.getRightExpression() instanceof SpreadMapExpression) { + // we have C[*:map] -> should become (C) map + SpreadMapExpression mapExpression = (SpreadMapExpression) be.getRightExpression(); + Expression right = transform(mapExpression.getExpression()); + Expression ce = new CastExpression(left.getType(), right); + ce.setSourcePosition(be); + return ce; } if (be.getRightExpression() instanceof MapEntryExpression) { http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/24ec32e6/src/test/groovy/operator/SpreadMapOperatorTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/groovy/operator/SpreadMapOperatorTest.groovy b/src/test/groovy/operator/SpreadMapOperatorTest.groovy index 97a54ff..f455879 100644 --- a/src/test/groovy/operator/SpreadMapOperatorTest.groovy +++ b/src/test/groovy/operator/SpreadMapOperatorTest.groovy @@ -32,7 +32,6 @@ package groovy.operator * assert z == w * * @author Pilho Kim - * @version $Revision$ */ public class SpreadMapOperatorTest extends GroovyTestCase { @@ -100,17 +99,34 @@ public class SpreadMapOperatorTest extends GroovyTestCase { assert w == w2 } + void testSpecialSpreadMapIndexNotation() { + assertScript ''' + @groovy.transform.ToString + class Person { String name; int age } + + assert Person[ name:'Dave', age:32 ].toString() == 'Person(Dave, 32)' + + def timMap = [ name:'Tim', age:49 ] + assert Person[ *:timMap ].toString() == 'Person(Tim, 49)' + + assert Person[ *:[ name:'John', age:29 ] ].toString() == 'Person(John, 29)' + + def ppl = [ [ name:'Tim', age:49 ], [ name:'Dave', age:32 ], [ name:'Steve', age:18 ] ] + assert ppl.collect { Person [ *:it ] }*.age == [49, 32, 18] + ''' + } + void testSpreadMapFunctionCall() { - def m = ['a':10, 'b':20, 'c':30] - f(*:m) // Call with only one spread map argument - f(*:m, 'e':50) // Call with one spread map argument and one named argument - f('e':100, *:m) // Call with one named argument and one spread map argument + def m = ['a':10, 'b':20, 'c':30] + f(*:m) // Call with only one spread map argument + f(*:m, 'e':50) // Call with one spread map argument and one named argument + f('e':100, *:m) // Call with one named argument and one spread map argument - func('e':100, 1, 2, 3, *:m) // Call with one named argument, three usual arguments, and one spread map argument + func('e':100, 1, 2, 3, *:m) // Call with one named argument, three usual arguments, and one spread map argument - def l = [4, 5] - func('e':100, *l, *:m, 6) // Call with one named argument, one spread list argument, one spread map argument, and one usual argument - func(7, 'e':100, *l, *:m) // Call with one usual argument, one named argument, one spread list argument, and one spread map argument + def l = [4, 5] + func('e':100, *l, *:m, 6) // Call with one named argument, one spread list argument, one spread map argument, and one usual argument + func(7, 'e':100, *l, *:m) // Call with one usual argument, one named argument, one spread list argument, and one spread map argument } }