You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2019/04/16 03:12:28 UTC

[groovy] branch master updated: GROOVY-9083: groovyConsole should be updated to understand method references and lambda expressions

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

paulk 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 5a2d84d  GROOVY-9083: groovyConsole should be updated to understand method references and lambda expressions
5a2d84d is described below

commit 5a2d84d4df1a78cebe403f1fa6188da89f369e7d
Author: Paul King <pa...@asert.com.au>
AuthorDate: Tue Apr 16 08:33:33 2019 +1000

    GROOVY-9083: groovyConsole should be updated to understand method references and lambda expressions
---
 .../codehaus/groovy/ast/CodeVisitorSupport.java    | 10 ++++++++
 .../org/codehaus/groovy/ast/GroovyCodeVisitor.java |  8 ++-----
 .../control/customizers/SecureASTCustomizer.java   | 12 ++++++++++
 .../inspect/swingui/AstNodeToScriptAdapter.groovy  | 23 ++++++++++++++++++
 .../inspect/swingui/ScriptToTreeNodeAdapter.groovy | 26 +++++++++++++++++----
 .../groovy/parser/antlr4/util/AstDumper.groovy     | 27 ++++++++++++++++++----
 6 files changed, 90 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java b/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java
index c08a2ed..03ef8b8 100644
--- a/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java
+++ b/src/main/java/org/codehaus/groovy/ast/CodeVisitorSupport.java
@@ -34,11 +34,13 @@ import org.codehaus.groovy.ast.expr.DeclarationExpression;
 import org.codehaus.groovy.ast.expr.ElvisOperatorExpression;
 import org.codehaus.groovy.ast.expr.FieldExpression;
 import org.codehaus.groovy.ast.expr.GStringExpression;
+import org.codehaus.groovy.ast.expr.LambdaExpression;
 import org.codehaus.groovy.ast.expr.ListExpression;
 import org.codehaus.groovy.ast.expr.MapEntryExpression;
 import org.codehaus.groovy.ast.expr.MapExpression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.MethodPointerExpression;
+import org.codehaus.groovy.ast.expr.MethodReferenceExpression;
 import org.codehaus.groovy.ast.expr.NotExpression;
 import org.codehaus.groovy.ast.expr.PostfixExpression;
 import org.codehaus.groovy.ast.expr.PrefixExpression;
@@ -222,6 +224,10 @@ public abstract class CodeVisitorSupport implements GroovyCodeVisitor {
         expression.getCode().visit(this);
     }
 
+    public void visitLambdaExpression(LambdaExpression expression) {
+        visitClosureExpression(expression);
+    }
+
     public void visitTupleExpression(TupleExpression expression) {
         visitListOfExpressions(expression.getExpressions());
     }
@@ -264,6 +270,10 @@ public abstract class CodeVisitorSupport implements GroovyCodeVisitor {
         expression.getMethodName().visit(this);
     }
 
+    public void visitMethodReferenceExpression(MethodReferenceExpression expression) {
+        visitMethodPointerExpression(expression);
+    }
+
     public void visitUnaryMinusExpression(UnaryMinusExpression expression) {
         expression.getExpression().visit(this);
     }
diff --git a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
index 22fee36..9d39f0c 100644
--- a/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
+++ b/src/main/java/org/codehaus/groovy/ast/GroovyCodeVisitor.java
@@ -140,9 +140,7 @@ public interface GroovyCodeVisitor {
 
     void visitClosureExpression(ClosureExpression expression);
 
-    default void visitLambdaExpression(LambdaExpression expression) {
-        visitClosureExpression(expression);
-    }
+    void visitLambdaExpression(LambdaExpression expression);
 
     void visitTupleExpression(TupleExpression expression);
 
@@ -162,9 +160,7 @@ public interface GroovyCodeVisitor {
 
     void visitMethodPointerExpression(MethodPointerExpression expression);
 
-    default void visitMethodReferenceExpression(MethodReferenceExpression expression) {
-        visitMethodPointerExpression(expression);
-    }
+    void visitMethodReferenceExpression(MethodReferenceExpression expression);
 
     void visitConstantExpression(ConstantExpression expression);
 
diff --git a/src/main/java/org/codehaus/groovy/control/customizers/SecureASTCustomizer.java b/src/main/java/org/codehaus/groovy/control/customizers/SecureASTCustomizer.java
index af43506..5a64348 100644
--- a/src/main/java/org/codehaus/groovy/control/customizers/SecureASTCustomizer.java
+++ b/src/main/java/org/codehaus/groovy/control/customizers/SecureASTCustomizer.java
@@ -42,11 +42,13 @@ import org.codehaus.groovy.ast.expr.ElvisOperatorExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.FieldExpression;
 import org.codehaus.groovy.ast.expr.GStringExpression;
+import org.codehaus.groovy.ast.expr.LambdaExpression;
 import org.codehaus.groovy.ast.expr.ListExpression;
 import org.codehaus.groovy.ast.expr.MapEntryExpression;
 import org.codehaus.groovy.ast.expr.MapExpression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.MethodPointerExpression;
+import org.codehaus.groovy.ast.expr.MethodReferenceExpression;
 import org.codehaus.groovy.ast.expr.NotExpression;
 import org.codehaus.groovy.ast.expr.PostfixExpression;
 import org.codehaus.groovy.ast.expr.PrefixExpression;
@@ -986,6 +988,11 @@ public class SecureASTCustomizer extends CompilationCustomizer {
             expression.getCode().visit(this);
         }
 
+        @Override
+        public void visitLambdaExpression(LambdaExpression expression) {
+            visitClosureExpression(expression);
+        }
+
         public void visitTupleExpression(final TupleExpression expression) {
             assertExpressionAuthorized(expression);
             visitListOfExpressions(expression.getExpressions());
@@ -1061,6 +1068,11 @@ public class SecureASTCustomizer extends CompilationCustomizer {
             expression.getMethodName().visit(this);
         }
 
+        @Override
+        public void visitMethodReferenceExpression(final MethodReferenceExpression expression) {
+            visitMethodPointerExpression(expression);
+        }
+
         public void visitConstantExpression(final ConstantExpression expression) {
             assertExpressionAuthorized(expression);
             final String type = expression.getType().getName();
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
index 2f3a2f8..52489ff 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/AstNodeToScriptAdapter.groovy
@@ -52,11 +52,13 @@ import org.codehaus.groovy.ast.expr.EmptyExpression
 import org.codehaus.groovy.ast.expr.Expression
 import org.codehaus.groovy.ast.expr.FieldExpression
 import org.codehaus.groovy.ast.expr.GStringExpression
+import org.codehaus.groovy.ast.expr.LambdaExpression
 import org.codehaus.groovy.ast.expr.ListExpression
 import org.codehaus.groovy.ast.expr.MapEntryExpression
 import org.codehaus.groovy.ast.expr.MapExpression
 import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.expr.MethodPointerExpression
+import org.codehaus.groovy.ast.expr.MethodReferenceExpression
 import org.codehaus.groovy.ast.expr.NotExpression
 import org.codehaus.groovy.ast.expr.PostfixExpression
 import org.codehaus.groovy.ast.expr.PrefixExpression
@@ -777,6 +779,20 @@ class AstNodeToScriptVisitor extends PrimaryClassNodeOperation implements Groovy
     }
 
     @Override
+    void visitLambdaExpression(LambdaExpression expression) {
+        print '( '
+        if (expression?.parameters) {
+            visitParameters(expression?.parameters)
+        }
+        print ') -> {'
+        printLineBreak()
+        indented {
+            expression?.code?.visit this
+        }
+        print '}'
+    }
+
+    @Override
     void visitTupleExpression(TupleExpression expression) {
         print '('
         visitExpressionsAndCommaSeparate(expression?.expressions)
@@ -1113,6 +1129,13 @@ class AstNodeToScriptVisitor extends PrimaryClassNodeOperation implements Groovy
     }
 
     @Override
+    void visitMethodReferenceExpression(MethodReferenceExpression expression) {
+        expression?.expression?.visit this
+        print '::'
+        expression?.methodName?.visit this
+    }
+
+    @Override
     void visitArrayExpression(ArrayExpression expression) {
         print 'new '
         visitType expression?.elementType
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
index 3d1b790..ac51fcc 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/inspect/swingui/ScriptToTreeNodeAdapter.groovy
@@ -52,11 +52,13 @@ import org.codehaus.groovy.ast.expr.ElvisOperatorExpression
 import org.codehaus.groovy.ast.expr.Expression
 import org.codehaus.groovy.ast.expr.FieldExpression
 import org.codehaus.groovy.ast.expr.GStringExpression
+import org.codehaus.groovy.ast.expr.LambdaExpression
 import org.codehaus.groovy.ast.expr.ListExpression
 import org.codehaus.groovy.ast.expr.MapEntryExpression
 import org.codehaus.groovy.ast.expr.MapExpression
 import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.expr.MethodPointerExpression
+import org.codehaus.groovy.ast.expr.MethodReferenceExpression
 import org.codehaus.groovy.ast.expr.NamedArgumentListExpression
 import org.codehaus.groovy.ast.expr.NotExpression
 import org.codehaus.groovy.ast.expr.PostfixExpression
@@ -632,8 +634,17 @@ class TreeNodeBuildingVisitor extends CodeVisitorSupport {
     @Override
     void visitClosureExpression(ClosureExpression node) {
         addNode(node, ClosureExpression, { 
-          it.parameters?.each { parameter -> visitParameter(parameter) }
-          super.visitClosureExpression(it) 
+            it.parameters?.each { parameter -> visitParameter(parameter) }
+            super.visitClosureExpression(it)
+        })
+    }
+
+    @Override
+    void visitLambdaExpression(LambdaExpression node) {
+        addNode(node, LambdaExpression, {
+            // params will be catered for by super call
+            //it.parameters?.each { parameter -> visitParameter(parameter) }
+            super.visitLambdaExpression(it)
         })
     }
 
@@ -642,9 +653,9 @@ class TreeNodeBuildingVisitor extends CodeVisitorSupport {
      */
     void visitParameter(Parameter node) {
         addNode(node, Parameter, {
-          if (node.initialExpression) {
-            node.initialExpression?.visit(this)
-          }
+            if (node.initialExpression) {
+                node.initialExpression?.visit(this)
+            }
         })
     }
 
@@ -694,6 +705,11 @@ class TreeNodeBuildingVisitor extends CodeVisitorSupport {
     }
 
     @Override
+    void visitMethodReferenceExpression(MethodReferenceExpression node) {
+        addNode(node, MethodReferenceExpression, { super.visitMethodReferenceExpression(it) })
+    }
+
+    @Override
     void visitUnaryMinusExpression(UnaryMinusExpression node) {
         addNode(node, UnaryMinusExpression, { super.visitUnaryMinusExpression(it) })
     }
diff --git a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy
index 4c2583d..a4a5616 100644
--- a/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy
+++ b/subprojects/parser-antlr4/src/test/groovy/org/apache/groovy/parser/antlr4/util/AstDumper.groovy
@@ -58,6 +58,7 @@ import org.codehaus.groovy.ast.expr.MapEntryExpression
 import org.codehaus.groovy.ast.expr.MapExpression
 import org.codehaus.groovy.ast.expr.MethodCallExpression
 import org.codehaus.groovy.ast.expr.MethodPointerExpression
+import org.codehaus.groovy.ast.expr.MethodReferenceExpression
 import org.codehaus.groovy.ast.expr.NotExpression
 import org.codehaus.groovy.ast.expr.PostfixExpression
 import org.codehaus.groovy.ast.expr.PrefixExpression
@@ -106,7 +107,7 @@ import java.lang.reflect.Modifier
 class AstDumper {
     private ModuleNode ast;
 
-    public AstDumper(ModuleNode ast) {
+    AstDumper(ModuleNode ast) {
         this.ast = ast;
     }
 
@@ -115,7 +116,7 @@ class AstDumper {
      *
      * @return the groovy source code
      */
-    public String gen() {
+    String gen() {
         StringWriter out = new StringWriter();
 
         try {
@@ -156,7 +157,7 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
     boolean showScriptClass
     boolean scriptHasBeenVisited
 
-    def AstNodeToScriptVisitor(Writer writer, boolean showScriptFreeForm = true, boolean showScriptClass = true) {
+    AstNodeToScriptVisitor(Writer writer, boolean showScriptFreeForm = true, boolean showScriptClass = true) {
         this._out = writer
         this.showScriptFreeForm = showScriptFreeForm
         this.showScriptClass = showScriptClass
@@ -733,9 +734,18 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
         print '}'
     }
 
-    //@Override
+    @Override
     void visitLambdaExpression(LambdaExpression expression) {
-        visitClosureExpression(expression)
+        print '( '
+        if (expression?.parameters) {
+            visitParameters(expression?.parameters)
+        }
+        print ') -> {'
+        printLineBreak()
+        indented {
+            expression?.code?.visit this
+        }
+        print '}'
     }
 
     @Override
@@ -1075,6 +1085,13 @@ class AstNodeToScriptVisitor extends CompilationUnit.PrimaryClassNodeOperation i
     }
 
     @Override
+    void visitMethodReferenceExpression(MethodReferenceExpression expression) {
+        expression?.expression?.visit this
+        print '::'
+        expression?.methodName?.visit this
+    }
+
+    @Override
     void visitArrayExpression(ArrayExpression expression) {
         print 'new '
         visitType expression?.elementType