Refine the position information of postfix expression AST node

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

Branch: refs/heads/master
Commit: 65c2bf5244a260ed9821f1b23ba4e8f060d113b6
Parents: aaf704f
Author: sunlan <[email protected]>
Authored: Tue Jan 24 12:03:12 2017 +0800
Committer: sunlan <[email protected]>
Committed: Tue Jan 24 12:03:12 2017 +0800

----------------------------------------------------------------------
 .../apache/groovy/parser/antlr4/GroovyParser.g4 | 22 ++++++++++++++--
 .../apache/groovy/parser/antlr4/AstBuilder.java | 27 +++++++++++++++-----
 2 files changed, 40 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/65c2bf52/subprojects/groovy-parser-antlr4/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-parser-antlr4/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
 
b/subprojects/groovy-parser-antlr4/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
index eb93aeb..5bf6f87 100644
--- 
a/subprojects/groovy-parser-antlr4/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
+++ 
b/subprojects/groovy-parser-antlr4/src/main/antlr4/org/apache/groovy/parser/antlr4/GroovyParser.g4
@@ -667,9 +667,13 @@ locals[boolean resourcesExists = false]
         )
     ;
 
+assertStatement
+locals[ String footprint = "" ]
+    :   ASSERT ce=expression ((COLON | COMMA) nls me=expression)?
+    ;
+
 statement
     :   block                                                                  
                             #blockStmtAlt
-    |   ASSERT ce=expression ((COLON | COMMA) nls me=expression)?              
                             #assertStmtAlt
     |   IF parExpression nls tb=statement ((nls | sep) ELSE nls fb=statement)? 
                             #ifElseStmtAlt
     |   loopStatement                                                          
                             #loopStmtAlt
 
@@ -688,6 +692,8 @@ statement
     // Import statement.  Can be used in any scope.  Has "import x as y" also.
     |   importDeclaration                                                      
                             #importStmtAlt
 
+    |   assertStatement                                                        
                             #assertStmtAlt
+
     |   typeDeclaration                                                        
                             #typeDeclarationStmtAlt
     |   localVariableDeclaration                                               
                             #localVariableDeclarationStmtAlt
 
@@ -786,11 +792,23 @@ statementExpression
     |   commandExpression                   #commandExprAlt
     ;
 
+postfixExpression
+locals[ boolean isInsideAssert ]
+@init {
+    try {
+        $isInsideAssert = null != $assertStatement::footprint;
+    } catch(NullPointerException e) {
+        $isInsideAssert = false;
+    }
+}
+    :   pathExpression op=(INC | DEC)?
+    ;
+
 expression
     // qualified names, array expressions, method invocation, post inc/dec, 
type casting (level 1)
     // The cast expression must be put before pathExpression to resovle the 
ambiguities between type casting and call on parentheses expression, e.g. 
(int)(1 / 2)
     :   castParExpression expression                                           
             #castExprAlt
-    |   pathExpression op=(INC | DEC)?                                         
             #postfixExprAlt
+    |   postfixExpression                                                      
             #postfixExprAlt
 
     // ~(BNOT)/!(LNOT) (level 1)
     |   (BITNOT | NOT) nls expression                                          
             #unaryNotExprAlt

http://git-wip-us.apache.org/repos/asf/groovy/blob/65c2bf52/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
----------------------------------------------------------------------
diff --git 
a/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
 
b/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index d0b5c72..f3195ef 100644
--- 
a/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ 
b/subprojects/groovy-parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -262,8 +262,7 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
 
         PackageNode packageNode = moduleNode.getPackage();
 
-        this.visitAnnotationsOpt(ctx.annotationsOpt()).stream()
-                .forEach(packageNode::addAnnotation);
+        
this.visitAnnotationsOpt(ctx.annotationsOpt()).forEach(packageNode::addAnnotation);
 
         return this.configureAST(packageNode, ctx);
     }
@@ -331,7 +330,7 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
 
     // statement {    
--------------------------------------------------------------------
     @Override
-    public AssertStatement visitAssertStmtAlt(AssertStmtAltContext ctx) {
+    public AssertStatement visitAssertStatement(AssertStatementContext ctx) {
         Expression conditionExpression = (Expression) this.visit(ctx.ce);
         BooleanExpression booleanExpression =
                 this.configureAST(
@@ -345,7 +344,11 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
         return this.configureAST(new AssertStatement(booleanExpression,
                         (Expression) this.visit(ctx.me)),
                 ctx);
+    }
 
+    @Override
+    public AssertStatement visitAssertStmtAlt(AssertStmtAltContext ctx) {
+        return 
this.configureAST(this.visitAssertStatement(ctx.assertStatement()), ctx);
     }
 
     @Override
@@ -2214,19 +2217,29 @@ public class AstBuilder extends 
GroovyParserBaseVisitor<Object> implements Groov
     }
 
     @Override
-    public Expression visitPostfixExprAlt(PostfixExprAltContext ctx) {
+    public Expression visitPostfixExpression(PostfixExpressionContext ctx) {
         Expression pathExpr = this.visitPathExpression(ctx.pathExpression());
 
         if (asBoolean(ctx.op)) {
-            return this.configureAST(
-                    new PostfixExpression(pathExpr, createGroovyToken(ctx.op)),
-                    ctx.op/*powerassert requires different column for values, 
so we have to copy the location of op*/);
+            PostfixExpression postfixExpression = new 
PostfixExpression(pathExpr, createGroovyToken(ctx.op));
+
+            if (ctx.isInsideAssert) {
+                // powerassert requires different column for values, so we 
have to copy the location of op
+                return this.configureAST(postfixExpression, ctx.op);
+            } else {
+                return this.configureAST(postfixExpression, ctx);
+            }
         }
 
         return this.configureAST(pathExpr, ctx);
     }
 
     @Override
+    public Expression visitPostfixExprAlt(PostfixExprAltContext ctx) {
+        return this.visitPostfixExpression(ctx.postfixExpression());
+    }
+
+    @Override
     public Expression visitUnaryNotExprAlt(UnaryNotExprAltContext ctx) {
         if (asBoolean(ctx.NOT())) {
             return this.configureAST(

Reply via email to