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 2017/03/02 09:03:44 UTC

[2/3] groovy git commit: refactor to remove duplicate code

refactor to remove duplicate code


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/ed981a72
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/ed981a72
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/ed981a72

Branch: refs/heads/master
Commit: ed981a7212c855c0be50686fed3558e08dd8fa27
Parents: 1ed615a
Author: zhangbo <zh...@nanchao.org>
Authored: Wed Nov 2 13:39:06 2016 +0800
Committer: paulk <pa...@asert.com.au>
Committed: Thu Mar 2 18:59:48 2017 +1000

----------------------------------------------------------------------
 .../trait/TraitReceiverTransformer.java         | 97 +++++++++++++-------
 1 file changed, 64 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/ed981a72/src/main/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java b/src/main/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
index 42729b0..e89c3f7 100644
--- a/src/main/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
+++ b/src/main/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
@@ -54,7 +54,8 @@ import java.util.List;
 /**
  * This expression transformer is used internally by the {@link org.codehaus.groovy.transform.trait.TraitASTTransformation
  * trait} AST transformation to change the receiver of a message on "this" into a static method call on the trait helper
- * class. <p></p> In a nutshell, code like this one in a trait:<p></p> <code>void foo() { this.bar() }</code> is
+ * class. <p></p>
+ * In a nutshell, code like the following method definition in a trait:<p></p> <code>void foo() { this.bar() }</code> is
  * transformed into: <code>void foo() { TraitHelper$bar(this) }</code>
  *
  * @author Cedric Champeau
@@ -65,15 +66,18 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
     private final VariableExpression weaved;
     private final SourceUnit unit;
     private final ClassNode traitClass;
+    private final ClassNode traitHelperClass;
     private final ClassNode fieldHelper;
     private final Collection<String> knownFields;
 
     private boolean inClosure;
 
-    public TraitReceiverTransformer(VariableExpression thisObject, SourceUnit unit, final ClassNode traitClass, ClassNode fieldHelper, Collection<String> knownFields) {
+    public TraitReceiverTransformer(VariableExpression thisObject, SourceUnit unit, final ClassNode traitClass,
+                                    final ClassNode traitHelperClass, ClassNode fieldHelper, Collection<String> knownFields) {
         this.weaved = thisObject;
         this.unit = unit;
         this.traitClass = traitClass;
+        this.traitHelperClass = traitHelperClass;
         this.fieldHelper = fieldHelper;
         this.knownFields = knownFields;
     }
@@ -136,15 +140,7 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
             } else if (accessedVariable instanceof PropertyNode) {
                 String propName = accessedVariable.getName();
                 if (knownFields.contains(propName)) {
-                    String method = Traits.helperGetterName(new FieldNode(propName, 0, ClassHelper.OBJECT_TYPE, weavedType, null));
-                    MethodCallExpression mce = new MethodCallExpression(
-                            createFieldHelperReceiver(),
-                            method,
-                            ArgumentListExpression.EMPTY_ARGUMENTS
-                    );
-                    mce.setSourcePosition(exp);
-                    mce.setImplicitThis(false);
-                    return mce;
+                    return createFieldHelperCall(exp, weavedType, propName);
                 } else {
                     return new PropertyExpression(
                             new VariableExpression(weaved),
@@ -171,15 +167,7 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
             if (pexp.isImplicitThis() || "this".equals(object.getText())) {
                 String propName = pexp.getPropertyAsString();
                 if (knownFields.contains(propName)) {
-                    String method = Traits.helperGetterName(new FieldNode(propName, 0, ClassHelper.OBJECT_TYPE, weavedType, null));
-                    MethodCallExpression mce = new MethodCallExpression(
-                            createFieldHelperReceiver(),
-                            method,
-                            ArgumentListExpression.EMPTY_ARGUMENTS
-                    );
-                    mce.setSourcePosition(exp);
-                    mce.setImplicitThis(false);
-                    return mce;
+                    return createFieldHelperCall(exp, weavedType, propName);
                 }
             }
         } else if (exp instanceof ClosureExpression) {
@@ -209,6 +197,18 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
         return super.transform(exp);
     }
 
+    private Expression createFieldHelperCall(Expression exp, ClassNode weavedType, String propName) {
+        String method = Traits.helperGetterName(new FieldNode(propName, 0, ClassHelper.OBJECT_TYPE, weavedType, null));
+        MethodCallExpression mce = new MethodCallExpression(
+                createFieldHelperReceiver(),
+                method,
+                ArgumentListExpression.EMPTY_ARGUMENTS
+        );
+        mce.setSourcePosition(exp);
+        mce.setImplicitThis(false);
+        return mce;
+    }
+
     private Expression transformFieldExpression(final FieldExpression exp) {
         FieldNode field = exp.getField();
         MethodCallExpression mce = new MethodCallExpression(
@@ -294,7 +294,8 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
         );
     }
 
-    private BinaryExpression createAssignmentToField(final Expression rightExpression, final Token operation, final String fieldName) {
+    private BinaryExpression createAssignmentToField(final Expression rightExpression,
+                                                     final Token operation, final String fieldName) {
         return new BinaryExpression(
                 new PropertyExpression(
                         new VariableExpression(weaved),
@@ -357,23 +358,24 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
             List<MethodNode> methods = traitClass.getMethods(methodName);
             for (MethodNode methodNode : methods) {
                 if (methodName.equals(methodNode.getName()) && methodNode.isPrivate()) {
-                    return transformPrivateMethodCall(call, arguments, methodName);
+                    if (inClosure) {
+                        return transformPrivateMethodCallOnThisInClosure(call, arguments, methodName);
+                    }
+                    return transformPrivateMethodCallOnThis(call, arguments, methodName);
                 }
             }
         }
+
         if (inClosure) {
-            MethodCallExpression transformed = new MethodCallExpression(
-                    (Expression) call.getReceiver(),
-                    call.getMethod(),
-                    transform(call.getArguments())
-            );
-            transformed.setSourcePosition(call);
-            transformed.setSafe(call.isSafe());
-            transformed.setSpreadSafe(call.isSpreadSafe());
-            transformed.setImplicitThis(call.isImplicitThis());
-            return transformed;
+            return transformMethodCallOnThisInClosure(call);
         }
 
+        return transformMethodCallOnThisFallBack(call, method, arguments);
+
+    }
+
+    private Expression transformMethodCallOnThisFallBack(final MethodCallExpression call,
+                                                         final Expression method, final Expression arguments) {
         MethodCallExpression transformed = new MethodCallExpression(
                 weaved,
                 method,
@@ -386,7 +388,21 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
         return transformed;
     }
 
-    private Expression transformPrivateMethodCall(final MethodCallExpression call, final Expression arguments, final String methodName) {
+    private Expression transformMethodCallOnThisInClosure(final MethodCallExpression call) {
+        MethodCallExpression transformed = new MethodCallExpression(
+                (Expression) call.getReceiver(),
+                call.getMethod(),
+                transform(call.getArguments())
+        );
+        transformed.setSourcePosition(call);
+        transformed.setSafe(call.isSafe());
+        transformed.setSpreadSafe(call.isSpreadSafe());
+        transformed.setImplicitThis(call.isImplicitThis());
+        return transformed;
+    }
+
+    private Expression transformPrivateMethodCallOnThis(final MethodCallExpression call,
+                                                        final Expression arguments, final String methodName) {
         ArgumentListExpression newArgs = createArgumentList(arguments);
         MethodCallExpression transformed = new MethodCallExpression(
                 new VariableExpression("this"),
@@ -400,6 +416,21 @@ class TraitReceiverTransformer extends ClassCodeExpressionTransformer {
         return transformed;
     }
 
+    private Expression transformPrivateMethodCallOnThisInClosure(final MethodCallExpression call,
+                                                                 final Expression arguments, final String methodName) {
+        ArgumentListExpression newArgs = createArgumentList(arguments);
+        MethodCallExpression transformed = new MethodCallExpression(
+                new ClassExpression(traitHelperClass),
+                methodName,
+                newArgs
+        );
+        transformed.setSourcePosition(call);
+        transformed.setSafe(call.isSafe());
+        transformed.setSpreadSafe(call.isSpreadSafe());
+        transformed.setImplicitThis(true);
+        return transformed;
+    }
+
     private Expression createFieldHelperReceiver() {
         return ClassHelper.CLASS_Type.equals(weaved.getOriginType()) ? weaved : new CastExpression(fieldHelper, weaved);
     }