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() {