Repository: groovy Updated Branches: refs/heads/master 6a6e1f0ff -> 522fd4996
GROOVY-8778: Cast short-hand breaks for empty map (closes #792) Project: http://git-wip-us.apache.org/repos/asf/groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/522fd499 Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/522fd499 Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/522fd499 Branch: refs/heads/master Commit: 522fd4996b6314caa05d16590f3896bf750eb83e Parents: 6a6e1f0 Author: Paul King <[email protected]> Authored: Sat Sep 8 10:22:37 2018 +1000 Committer: Paul King <[email protected]> Committed: Sun Sep 9 08:12:16 2018 +1000 ---------------------------------------------------------------------- src/antlr/GroovyParser.g4 | 2 +- src/test/groovy/GroovyTruthTest.groovy | 4 +++- .../apache/groovy/parser/antlr4/AstBuilder.java | 17 ++++++++--------- 3 files changed, 12 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/groovy/blob/522fd499/src/antlr/GroovyParser.g4 ---------------------------------------------------------------------- diff --git a/src/antlr/GroovyParser.g4 b/src/antlr/GroovyParser.g4 index f2a3e2f..72d6fab 100644 --- a/src/antlr/GroovyParser.g4 +++ b/src/antlr/GroovyParser.g4 @@ -1013,7 +1013,7 @@ indexPropertyArgs ; namedPropertyArgs - : LBRACK mapEntryList RBRACK + : LBRACK (mapEntryList | COLON) RBRACK ; primary http://git-wip-us.apache.org/repos/asf/groovy/blob/522fd499/src/test/groovy/GroovyTruthTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/groovy/GroovyTruthTest.groovy b/src/test/groovy/GroovyTruthTest.groovy index 8034e59..e602125 100644 --- a/src/test/groovy/GroovyTruthTest.groovy +++ b/src/test/groovy/GroovyTruthTest.groovy @@ -43,8 +43,10 @@ class GroovyTruthTest extends GroovyTestCase { testTrue([1]) testFalse([].toArray()) - testFalse [:] + testFalse Collections.EMPTY_MAP + testFalse([:]) testTrue([bla: 'some value']) + testTrue 1234 testFalse 0 testTrue 0.3f http://git-wip-us.apache.org/repos/asf/groovy/blob/522fd499/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java ---------------------------------------------------------------------- diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java index ce8ee31..16bda16 100644 --- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java +++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java @@ -2332,19 +2332,18 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov return configureAST( new BinaryExpression(baseExpr, createGroovyToken(tuple.getFirst()), tuple.getSecond(), isSafeChain || asBoolean(ctx.indexPropertyArgs().QUESTION())), ctx); - } else if (asBoolean(ctx.namedPropertyArgs())) { // this is a special way to new instance, e.g. Person[name: 'Daniel.Sun', location: 'Shanghai'] + } else if (asBoolean(ctx.namedPropertyArgs())) { // this is a special way to signify a cast, e.g. Person[name: 'Daniel.Sun', location: 'Shanghai'] List<MapEntryExpression> mapEntryExpressionList = this.visitNamedPropertyArgs(ctx.namedPropertyArgs()); Expression right; - if (mapEntryExpressionList.size() == 1) { - MapEntryExpression mapEntryExpression = mapEntryExpressionList.get(0); - - if (mapEntryExpression.getKeyExpression() instanceof SpreadMapExpression) { - right = mapEntryExpression.getKeyExpression(); - } else { - right = mapEntryExpression; - } + if (mapEntryExpressionList.size() == 0) { + // expecting list of MapEntryExpressions later so use SpreadMap to smuggle empty MapExpression to later stages + right = configureAST( + new SpreadMapExpression(configureAST(new MapExpression(), ctx.namedPropertyArgs())), + ctx.namedPropertyArgs()); + } else if (mapEntryExpressionList.size() == 1 && mapEntryExpressionList.get(0).getKeyExpression() instanceof SpreadMapExpression) { + right = mapEntryExpressionList.get(0).getKeyExpression(); } else { ListExpression listExpression = configureAST(
