Repository: groovy
Updated Branches:
  refs/heads/parrot 2ca95086e -> 08ebc38cb


GROOVY-8006: [parrot] Allow dropping 'def' or type in try with resources


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/08ebc38c
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/08ebc38c
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/08ebc38c

Branch: refs/heads/parrot
Commit: 08ebc38cb8e7605679532b4735f0193f48dcf096
Parents: 2ca9508
Author: Daniel Sun <sun...@apache.org>
Authored: Sat Nov 26 16:52:48 2016 +0800
Committer: Daniel Sun <sun...@apache.org>
Committed: Sat Nov 26 16:52:48 2016 +0800

----------------------------------------------------------------------
 .../apache/groovy/parser/antlr4/GroovyParser.g4 |  1 +
 .../apache/groovy/parser/antlr4/AstBuilder.java | 35 +++++++++++++++++---
 .../resources/core/TryWithResources_01x.groovy  | 15 +++++++--
 3 files changed, 45 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/08ebc38c/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
 
b/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
index 8bdb6b8..a3c6043 100644
--- 
a/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
+++ 
b/subprojects/groovy-antlr4-grammar/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
@@ -688,6 +688,7 @@ resourceList
 
 resource
     :   localVariableDeclaration
+    |   expression
     ;
 
 

http://git-wip-us.apache.org/repos/asf/groovy/blob/08ebc38c/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
 
b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index f731a8d..23d4fa5 100644
--- 
a/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ 
b/subprojects/groovy-antlr4-grammar/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -444,13 +444,40 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
 
     @Override
     public ExpressionStatement visitResource(ResourceContext ctx) {
-        List<ExpressionStatement> declarationStatements = 
this.visitLocalVariableDeclaration(ctx.localVariableDeclaration()).getDeclarationStatements();
+        if (asBoolean(ctx.localVariableDeclaration())) {
+            List<ExpressionStatement> declarationStatements = 
this.visitLocalVariableDeclaration(ctx.localVariableDeclaration()).getDeclarationStatements();
+
+            if (declarationStatements.size() > 1) {
+                throw createParsingFailedException("Multi resources can not be 
declared in one statement", ctx);
+            }
+
+            return declarationStatements.get(0);
+        } else if (asBoolean(ctx.expression())) {
+            Expression expression = (Expression) this.visit(ctx.expression());
+            if (!(expression instanceof BinaryExpression
+                    && Types.ASSIGN == ((BinaryExpression) 
expression).getOperation().getType()
+                    && ((BinaryExpression) expression).getLeftExpression() 
instanceof VariableExpression)) {
+
+                throw createParsingFailedException("Only variable declarations 
are allowed to declare resource", ctx);
+            }
+
+            BinaryExpression assignmentExpression = (BinaryExpression) 
expression;
 
-        if (declarationStatements.size() > 1) {
-            throw createParsingFailedException("Multi resources can not be 
declared in one statement", ctx);
+            return this.configureAST(
+                    new ExpressionStatement(
+                            this.configureAST(
+                                    new DeclarationExpression(
+                                            this.configureAST(
+                                                    new 
VariableExpression(assignmentExpression.getLeftExpression().getText()),
+                                                    
assignmentExpression.getLeftExpression()
+                                            ),
+                                            
assignmentExpression.getOperation(),
+                                            
assignmentExpression.getRightExpression()
+                                    ), ctx)
+                    ), ctx);
         }
 
-        return declarationStatements.get(0);
+        throw createParsingFailedException("Unsupported resource declaration: 
" + ctx.getText(), ctx);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/groovy/blob/08ebc38c/subprojects/groovy-antlr4-grammar/src/test/resources/core/TryWithResources_01x.groovy
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-antlr4-grammar/src/test/resources/core/TryWithResources_01x.groovy
 
b/subprojects/groovy-antlr4-grammar/src/test/resources/core/TryWithResources_01x.groovy
index 38f8da8..9b88740 100644
--- 
a/subprojects/groovy-antlr4-grammar/src/test/resources/core/TryWithResources_01x.groovy
+++ 
b/subprojects/groovy-antlr4-grammar/src/test/resources/core/TryWithResources_01x.groovy
@@ -247,9 +247,20 @@ try (
         Resource r1 = new Resource(
         1
 )
-     Resource r2 = new Resource(2)
-    ) {
+        Resource r2 = new Resource(2)
+) {
     a = 2;
 }
 assert Resource.closedResourceIds == [2, 1]
 assert 2 == a
+
+// test case 17
+Resource.closedResourceIds = []
+a = 1;
+try (r1 = new Resource(1)
+     r2 = new Resource(2)) {
+    a = 2;
+}
+assert Resource.closedResourceIds == [2, 1]
+assert 2 == a
+

Reply via email to