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