You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2021/07/25 02:21:52 UTC

[groovy] branch master updated: tweak printing expressions

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 4988329  tweak printing expressions
4988329 is described below

commit 49883296965dcc1ee66f0aa9d5ce05edaf57f9c4
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Jul 25 10:21:35 2021 +0800

    tweak printing expressions
---
 .../console/ui/AstNodeToScriptAdapter.groovy       | 79 ++++++++++++----------
 .../console/ui/AstNodeToScriptAdapterTest.groovy   | 15 ++--
 2 files changed, 56 insertions(+), 38 deletions(-)

diff --git a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/AstNodeToScriptAdapter.groovy b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/AstNodeToScriptAdapter.groovy
index e9c4ee5..dd5be0e 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/AstNodeToScriptAdapter.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/AstNodeToScriptAdapter.groovy
@@ -681,11 +681,7 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
     @Override
     void visitMethodCallExpression(MethodCallExpression expression) {
         Expression objectExpr = expression.objectExpression
-        if (objectExpr instanceof VariableExpression) {
-            visitVariableExpression(objectExpr, false)
-        } else {
-            objectExpr.visit(this)
-        }
+        printExpression(objectExpr)
         if (expression.spreadSafe) {
             print '*'
         }
@@ -727,19 +723,18 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
 
     @Override
     void visitBinaryExpression(BinaryExpression expression) {
-        String opText = expression?.operation?.text
-        boolean isInstanceofOp = opText?.endsWith('instanceof')
-        boolean isSubscriptOp = opText == '['
-        if ((isSubscriptOp || isInstanceofOp) && expression?.leftExpression instanceof VariableExpression) {
+        if (expression !instanceof DeclarationExpression && expression?.leftExpression instanceof VariableExpression) {
             visitVariableExpression((VariableExpression) expression?.leftExpression, false)
         } else {
             expression?.leftExpression?.visit this
         }
         if (!(expression.rightExpression instanceof EmptyExpression) || expression.operation.type != Types.ASSIGN) {
+            String opText = expression?.operation?.text
+            boolean isSubscriptOp = opText == '['
             if (isSubscriptOp) {
                 print "["
             } else {
-                print " $expression.operation.text "
+                print " $opText "
             }
             expression.rightExpression.visit this
             if (isSubscriptOp) {
@@ -750,18 +745,26 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
 
     @Override
     void visitPostfixExpression(PostfixExpression expression) {
-        print '('
-        expression?.expression?.visit this
-        print ')'
+        if (expression?.expression instanceof VariableExpression) {
+            visitVariableExpression((VariableExpression) expression?.expression, false)
+        } else {
+            print '('
+            expression?.expression?.visit this
+            print ')'
+        }
         print expression?.operation?.text
     }
 
     @Override
     void visitPrefixExpression(PrefixExpression expression) {
         print expression?.operation?.text
-        print '('
-        expression?.expression?.visit this
-        print ')'
+        if (expression?.expression instanceof VariableExpression) {
+            visitVariableExpression((VariableExpression) expression?.expression, false)
+        } else {
+            print '('
+            expression?.expression?.visit this
+            print ')'
+        }
     }
 
     @Override
@@ -810,11 +813,7 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
 
     @Override
     void visitPropertyExpression(PropertyExpression expression) {
-        if (expression?.objectExpression instanceof VariableExpression) {
-            visitVariableExpression((VariableExpression) expression?.objectExpression, false)
-        } else {
-            expression?.objectExpression?.visit this
-        }
+        printExpression(expression?.objectExpression)
 
         if (expression?.spreadSafe) {
             print '*'
@@ -923,19 +922,24 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
 
     @Override
     void visitCastExpression(CastExpression expression) {
-        print '(('
+        print '('
         if (expression?.coerce) {
-            expression?.expression?.visit this
-            print ') as '
+            boolean isVariableExpressionOrPropertyExpression =
+                    expression?.expression instanceof VariableExpression || expression?.expression instanceof PropertyExpression
+            if (!isVariableExpressionOrPropertyExpression) {
+                print '('
+            }
+            printExpression(expression?.expression)
+            if (!isVariableExpressionOrPropertyExpression) {
+                print ')'
+            }
+            print ' as '
             visitType(expression?.type)
         } else {
+            print '('
             visitType(expression?.type)
             print ') '
-            if (expression?.expression instanceof VariableExpression) {
-                visitVariableExpression((VariableExpression) expression?.expression, false)
-            } else {
-                expression?.expression?.visit this
-            }
+            printExpression(expression?.expression)
         }
         print ')'
     }
@@ -1072,11 +1076,7 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
 
     @Override
     void visitBooleanExpression(BooleanExpression expression) {
-        if (expression?.expression instanceof VariableExpression) {
-            visitVariableExpression((VariableExpression) expression?.expression, false)
-        } else {
-            expression?.expression?.visit this
-        }
+        printExpression(expression?.expression)
     }
 
     @Override
@@ -1142,6 +1142,9 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
         expression?.expressions?.each {
             if (!first) {
                 print ';'
+                if (it !instanceof EmptyExpression) {
+                    print ' '
+                }
             }
             first = false
             it.visit this
@@ -1208,4 +1211,12 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
         }
         return true
     }
+
+    private void printExpression(Expression expression) {
+        if (expression instanceof VariableExpression) {
+            visitVariableExpression((VariableExpression) expression, false)
+        } else {
+            expression?.visit this
+        }
+    }
 }
diff --git a/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy b/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy
index 199fbf7..b8a9cec 100644
--- a/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy
+++ b/subprojects/groovy-console/src/test/groovy/groovy/console/ui/AstNodeToScriptAdapterTest.groovy
@@ -190,7 +190,7 @@ final class AstNodeToScriptAdapterTest extends GroovyTestCase {
                             def y = 2
                             (boolean) !(-x + (+y--)) '''
         String result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
-        assert result.contains('((boolean) !(-x + +(( y )--)))')
+        assert result.contains('((boolean) !(-x + +(y--)))')
 
         script = '''boolean x = false
                     !x'''
@@ -243,7 +243,7 @@ final class AstNodeToScriptAdapterTest extends GroovyTestCase {
                         }'''
 
         String result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
-        assert result.contains('for (java.lang.Integer x = 0; x < 10;( x )++) {')
+        assert result.contains('for (java.lang.Integer x = 0; x < 10; x++) {')
         assert result.contains('continue')
     }
 
@@ -263,7 +263,7 @@ final class AstNodeToScriptAdapterTest extends GroovyTestCase {
         String script = '''def x = 1, y = 2
                             x++ + --y - --x++'''
         String result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
-        assert result.contains('( x )++ + --( y ) - --(( x )++)')
+        assert result.contains('x++ + --y - --(x++)')
     }
 
     void testMultipleAssignments() {
@@ -629,7 +629,7 @@ final class AstNodeToScriptAdapterTest extends GroovyTestCase {
         String result = compileToScript(script, CompilePhase.CANONICALIZATION)
         assert result =~ /Lazy\s*private java\.util\.ArrayList .*speakers /
         assert result.contains('public java.util.ArrayList getSpeakers() {')
-        assert result.contains('if ( $speakers != null) {')
+        assert result.contains('if ($speakers != null) {')
         assert result.contains('$speakers = new java.util.ArrayList()')
     }
 
@@ -1017,4 +1017,11 @@ final class AstNodeToScriptAdapterTest extends GroovyTestCase {
         String result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
         assert result.contains('if (a instanceof java.lang.String) {')
     }
+
+    void testVisitCastExpression() {
+        String script = '''String a = 'foo'
+                           a as String'''
+        String result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
+        assert result.contains('(a as java.lang.String)')
+    }
 }