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/24 18:51:50 UTC

[groovy] 06/07: tweak printing unary expression

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

commit ef8f3bd5e01494e9e080f0950b1281c6dcba6885
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Jul 25 02:18:38 2021 +0800

    tweak printing unary expression
---
 .../console/ui/AstNodeToScriptAdapter.groovy       | 33 +++++++++++++++-------
 .../console/ui/AstNodeToScriptAdapterTest.groovy   | 17 ++++++++++-
 2 files changed, 39 insertions(+), 11 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 ef2f023..e6fad0f 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
@@ -19,6 +19,7 @@
 package groovy.console.ui
 
 import groovy.transform.AutoFinal
+import groovy.transform.CompileDynamic
 import groovy.transform.CompileStatic
 import org.apache.groovy.io.StringBuilderWriter
 import org.codehaus.groovy.ast.AnnotationNode
@@ -889,25 +890,33 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
         expression?.expression?.visit this
     }
 
+    @CompileDynamic
+    private void printUnaryExpression(String opText, Expression expression) {
+        print opText
+        if (expression?.expression instanceof VariableExpression) {
+            visitVariableExpression((VariableExpression) expression?.expression, false)
+        } else if (expression?.expression instanceof PropertyExpression)  {
+            expression?.expression?.visit this
+        } else {
+            print '('
+            expression?.expression?.visit this
+            print ')'
+        }
+    }
+
     @Override
     void visitNotExpression(NotExpression expression) {
-        print '!('
-        expression?.expression?.visit this
-        print ')'
+        printUnaryExpression('!', expression)
     }
 
     @Override
     void visitUnaryMinusExpression(UnaryMinusExpression expression) {
-        print '-('
-        expression?.expression?.visit this
-        print ')'
+        printUnaryExpression('-', expression)
     }
 
     @Override
     void visitUnaryPlusExpression(UnaryPlusExpression expression) {
-        print '+('
-        expression?.expression?.visit this
-        print ')'
+        printUnaryExpression('+', expression)
     }
 
     @Override
@@ -1061,7 +1070,11 @@ class AstNodeToScriptVisitor implements CompilationUnit.IPrimaryClassNodeOperati
 
     @Override
     void visitBooleanExpression(BooleanExpression expression) {
-        expression?.expression?.visit this
+        if (expression?.expression instanceof VariableExpression) {
+            visitVariableExpression((VariableExpression) expression?.expression, false)
+        } else {
+            expression?.expression?.visit this
+        }
     }
 
     @Override
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 0e44a00..6abf69b 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,22 @@ 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'''
+        result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
+        assert result.contains('!x')
+
+        script = '''int x = 0
+                    -x'''
+        result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
+        assert result.contains('-x')
+
+        script = '''int x = 0
+                    +x'''
+        result = compileToScript(script, CompilePhase.SEMANTIC_ANALYSIS)
+        assert result.contains('+x')
     }
 
     void testArrayHandling() {