You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2020/12/10 20:57:35 UTC

[groovy] 01/05: refactor shared logic

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

emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit f9db0da914657386d222907c5ba867da3ff7a02c
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Dec 9 10:47:46 2020 -0600

    refactor shared logic
---
 .../groovy/classgen/InnerClassVisitorHelper.java   | 118 +++++++++------------
 1 file changed, 50 insertions(+), 68 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
index bc9292a..d90e159 100644
--- a/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/InnerClassVisitorHelper.java
@@ -24,117 +24,99 @@ import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.InnerClassNode;
 import org.codehaus.groovy.ast.Parameter;
-import org.codehaus.groovy.ast.expr.ArgumentListExpression;
-import org.codehaus.groovy.ast.expr.BinaryExpression;
 import org.codehaus.groovy.ast.expr.ConstantExpression;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.expr.GStringExpression;
-import org.codehaus.groovy.ast.expr.MethodCallExpression;
-import org.codehaus.groovy.ast.expr.PropertyExpression;
 import org.codehaus.groovy.ast.expr.SpreadExpression;
-import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.codehaus.groovy.ast.stmt.BlockStatement;
-import org.codehaus.groovy.ast.stmt.ExpressionStatement;
-import org.codehaus.groovy.ast.stmt.ReturnStatement;
-import org.codehaus.groovy.syntax.Token;
-import org.codehaus.groovy.syntax.Types;
 import org.objectweb.asm.Opcodes;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
 
 public abstract class InnerClassVisitorHelper extends ClassCodeVisitorSupport {
 
-    protected static void setPropertyGetterDispatcher(BlockStatement block, Expression thiz, Parameter[] parameters) {
-        List<ConstantExpression> gStringStrings = new ArrayList<ConstantExpression>();
-        gStringStrings.add(new ConstantExpression(""));
-        gStringStrings.add(new ConstantExpression(""));
-        List<Expression> gStringValues = new ArrayList<Expression>();
-        gStringValues.add(new VariableExpression(parameters[0]));
+    protected static void addFieldInit(final Parameter p, final FieldNode fn, final BlockStatement block) {
+        block.addStatement(assignS(fieldX(fn), varX(p)));
+    }
+
+    protected static void setPropertyGetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
         block.addStatement(
-                new ReturnStatement(
-                        new PropertyExpression(
-                                thiz,
-                                new GStringExpression("$name", gStringStrings, gStringValues)
+                returnS(
+                        propX(
+                                target,
+                                dynName(parameters[0])
                         )
                 )
         );
     }
 
-    protected static void setPropertySetterDispatcher(BlockStatement block, Expression thiz, Parameter[] parameters) {
-        List<ConstantExpression> gStringStrings = new ArrayList<ConstantExpression>();
-        gStringStrings.add(new ConstantExpression(""));
-        gStringStrings.add(new ConstantExpression(""));
-        List<Expression> gStringValues = new ArrayList<Expression>();
-        gStringValues.add(new VariableExpression(parameters[0]));
+    protected static void setPropertySetterDispatcher(final BlockStatement block, final Expression target, final Parameter[] parameters) {
         block.addStatement(
-                new ExpressionStatement(
-                        new BinaryExpression(
-                                new PropertyExpression(
-                                        thiz,
-                                        new GStringExpression("$name", gStringStrings, gStringValues)
+                stmt(
+                        assignX(
+                                propX(
+                                        target,
+                                        dynName(parameters[0])
                                 ),
-                                Token.newSymbol(Types.ASSIGN, -1, -1),
-                                new VariableExpression(parameters[1])
+                                varX(parameters[1])
                         )
                 )
         );
     }
 
-    protected static void setMethodDispatcherCode(BlockStatement block, Expression thiz, Parameter[] parameters) {
-        List<ConstantExpression> gStringStrings = new ArrayList<ConstantExpression>();
-        gStringStrings.add(new ConstantExpression(""));
-        gStringStrings.add(new ConstantExpression(""));
-        List<Expression> gStringValues = new ArrayList<Expression>();
-        gStringValues.add(new VariableExpression(parameters[0]));
+    protected static void setMethodDispatcherCode(final BlockStatement block, final Expression target, final Parameter[] parameters) {
         block.addStatement(
-                new ReturnStatement(
-                        new MethodCallExpression(
-                                thiz,
-                                new GStringExpression("$name", gStringStrings, gStringValues),
-                                new ArgumentListExpression(
-                                        new SpreadExpression(new VariableExpression(parameters[1]))
-                                )
+                returnS(
+                        callX(
+                                target,
+                                dynName(parameters[0]),
+                                args(new SpreadExpression(varX(parameters[1])))
                         )
                 )
         );
     }
 
-    protected static boolean isStatic(InnerClassNode node) {
-        return node.getDeclaredField("this$0") == null;
+    private static Expression dynName(final Parameter p) {
+        List<ConstantExpression> gStringStrings = new ArrayList<>();
+        gStringStrings.add(new ConstantExpression(""));
+        gStringStrings.add(new ConstantExpression(""));
+
+        List<Expression> gStringValues = new ArrayList<>();
+        gStringValues.add(varX(p));
+
+        return new GStringExpression("$name", gStringStrings, gStringValues);
+    }
+
+    protected static boolean isStatic(final InnerClassNode cn) {
+        return cn.getDeclaredField("this$0") == null;
     }
 
-    protected static ClassNode getClassNode(ClassNode node, boolean isStatic) {
-        if (isStatic) node = ClassHelper.CLASS_Type;
-        return node;
+    protected static ClassNode getClassNode(final ClassNode cn, final boolean isStatic) {
+        return isStatic ? ClassHelper.CLASS_Type : cn; // TODO: Set class type parameter?
     }
 
-    protected static int getObjectDistance(ClassNode node) {
+    protected static int getObjectDistance(ClassNode cn) {
         int count = 0;
-        while (node != null && node != ClassHelper.OBJECT_TYPE) {
-            count++;
-            node = node.getSuperClass();
+        while (cn != null && cn != ClassHelper.OBJECT_TYPE) {
+            cn = cn.getSuperClass();
+            count += 1;
         }
         return count;
     }
 
-    protected static void addFieldInit(Parameter p, FieldNode fn, BlockStatement block) {
-        block.addStatement(assignS(fieldX(fn), varX(p)));
-    }
-
-    protected static boolean shouldHandleImplicitThisForInnerClass(ClassNode cn) {
-        if (cn.isEnum() || cn.isInterface()) return false;
-        if ((cn.getModifiers() & Opcodes.ACC_STATIC) != 0) return false;
-
-        if (!(cn instanceof InnerClassNode)) return false;
-        InnerClassNode innerClass = (InnerClassNode) cn;
-        // scope != null means aic, we don't handle that here
-        if (innerClass.getVariableScope() != null) return false;
-        // static inner classes don't need this$0
-        return (innerClass.getModifiers() & Opcodes.ACC_STATIC) == 0;
+    protected static boolean shouldHandleImplicitThisForInnerClass(final ClassNode cn) {
+        final int explicitOrImplicitStatic = Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ENUM;
+        return (cn.getModifiers() & explicitOrImplicitStatic) == 0 && (cn instanceof InnerClassNode && !((InnerClassNode) cn).isAnonymous());
     }
 }