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 13:03:41 UTC

[groovy] branch master updated: Trivial refactoring for GINQ transformation

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 828b554  Trivial refactoring for GINQ transformation
828b554 is described below

commit 828b554dbaa4c564c62d9d8fb0f3c9cca7d335df
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sun Jul 25 21:03:09 2021 +0800

    Trivial refactoring for GINQ transformation
---
 .../ginq/transform/GinqASTTransformation.java      | 61 ++++++++++------------
 1 file changed, 27 insertions(+), 34 deletions(-)

diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/transform/GinqASTTransformation.java b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/transform/GinqASTTransformation.java
index cd93870..ac865a4 100644
--- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/transform/GinqASTTransformation.java
+++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/transform/GinqASTTransformation.java
@@ -19,7 +19,6 @@
 package org.apache.groovy.ginq.transform;
 
 import groovy.ginq.transform.GQ;
-import org.apache.groovy.ginq.GinqGroovyMethods;
 import org.codehaus.groovy.GroovyBugError;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.AnnotatedNode;
@@ -40,12 +39,14 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import static java.util.Collections.unmodifiableMap;
+import static org.apache.groovy.ginq.GinqGroovyMethods.CONF_LIST;
 import static org.apache.groovy.ginq.GinqGroovyMethods.transformGinqCode;
 import static org.codehaus.groovy.ast.ClassHelper.make;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.block;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.mapX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
 
 /**
  * Handles generation of code for the {@code @GQ} annotation.
@@ -58,21 +59,19 @@ public class GinqASTTransformation extends AbstractASTTransformation {
     @Override
     public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {
         init(nodes, sourceUnit);
-        AnnotatedNode parent = (AnnotatedNode) nodes[1];
-        AnnotationNode node = (AnnotationNode) nodes[0];
-        if (!GQ_CLASS_NODE.equals(node.getClassNode())) return;
+        AnnotatedNode annotatedNode = (AnnotatedNode) nodes[1];
+        AnnotationNode annotationNode = (AnnotationNode) nodes[0];
+        if (!GQ_CLASS_NODE.equals(annotationNode.getClassNode())) return;
 
-        if (parent instanceof MethodNode) {
-            MethodNode methodNode = (MethodNode) parent;
+        if (annotatedNode instanceof MethodNode) {
+            MethodNode methodNode = (MethodNode) annotatedNode;
             if (methodNode.isAbstract()) {
                 addError("Error during " + GQ_CLASS_NODE.getName() + " processing: annotation not allowed on abstract method '" + methodNode.getName() + "'", methodNode);
                 return;
             }
             BlockStatement origCode = (BlockStatement) methodNode.getCode();
-            MapExpression ginqConfigurationMapExpression = makeGinqConfigurationMapExpression(methodNode);
-            BlockStatement newCode = block(
-                    returnS(transformGinqCode(sourceUnit, ginqConfigurationMapExpression, origCode))
-            );
+            MapExpression ginqConfigurationMapExpression = makeGinqConfigurationMapExpression(annotationNode);
+            BlockStatement newCode = block(stmt(transformGinqCode(sourceUnit, ginqConfigurationMapExpression, origCode)));
             newCode.setSourcePosition(origCode);
             methodNode.setCode(newCode);
             VariableScopeVisitor variableScopeVisitor = new VariableScopeVisitor(sourceUnit);
@@ -80,29 +79,23 @@ public class GinqASTTransformation extends AbstractASTTransformation {
         }
     }
 
-    private MapExpression makeGinqConfigurationMapExpression(MethodNode m) {
-        Map<String, Expression> resultMembers = new HashMap<>();
-        Map<String, Expression> defaultMembers = GinqGroovyMethods.CONF_LIST.stream().collect(Collectors.toMap(
-                c -> c,
-                c -> {
-                    try {
-                        return constX(GQ_CLASS_NODE.getTypeClass().getMethod(c).getDefaultValue());
-                    } catch (NoSuchMethodException e) {
-                        throw new GroovyBugError("Unknown GINQ option: " + c, e);
-                    }
-                }
-        ));
-        resultMembers.putAll(defaultMembers);
-
-        AnnotationNode gqAnnotationNode = m.getAnnotations(GQ_CLASS_NODE).get(0);
-        Map<String, Expression> members = gqAnnotationNode.getMembers();
-        resultMembers.putAll(members);
-
-        MapExpression ginqConfigurationMapExpression =
-                        mapX(resultMembers.entrySet().stream()
-                                .map(e -> new MapEntryExpression(constX(e.getKey()), constX(e.getValue().getText())))
-                                .collect(Collectors.toList()));
+    private MapExpression makeGinqConfigurationMapExpression(AnnotationNode annotationNode) {
+        Map<String, Expression> resultMembers = new HashMap<>(DEFAULT_OPTION_MAP);
+        resultMembers.putAll(annotationNode.getMembers());
 
-        return ginqConfigurationMapExpression;
+        return mapX(resultMembers.entrySet().stream()
+                    .map(e -> new MapEntryExpression(constX(e.getKey()), constX(e.getValue().getText())))
+                    .collect(Collectors.toList()));
     }
+
+    private static final Map<String, Expression> DEFAULT_OPTION_MAP = unmodifiableMap(CONF_LIST.stream().collect(Collectors.toMap(
+            c -> c,
+            c -> {
+                try {
+                    return constX(GQ_CLASS_NODE.getTypeClass().getMethod(c).getDefaultValue());
+                } catch (NoSuchMethodException e) {
+                    throw new GroovyBugError("Unknown GINQ option: " + c, e);
+                }
+            }
+    )));
 }