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:43 UTC

[1/3] groovy git commit: fix groovy7797 - assign correct receiver in closure

Repository: groovy
Updated Branches:
  refs/heads/master 5d3f7477e -> ec3179a45


fix groovy7797 - assign correct receiver in closure


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

Branch: refs/heads/master
Commit: 1ed615a2a770d7539c8a62d198a7d432ba5050f1
Parents: 5d3f747
Author: zhangbo <zh...@nanchao.org>
Authored: Wed Nov 2 13:33:32 2016 +0800
Committer: paulk <pa...@asert.com.au>
Committed: Thu Mar 2 18:59:12 2017 +1000

----------------------------------------------------------------------
 src/test/groovy/bugs/Groovy7797Bug.groovy | 38 ++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/1ed615a2/src/test/groovy/bugs/Groovy7797Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/Groovy7797Bug.groovy b/src/test/groovy/bugs/Groovy7797Bug.groovy
new file mode 100644
index 0000000..892b6eb
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy7797Bug.groovy
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy.bugs
+
+class Groovy7797Bug extends GroovyTestCase {
+    void test() {
+        new GroovyShell().evaluate('''
+trait MyTrait {
+    void greeter() {
+        { ->doGreeting("hi") }.call()
+        //doGreeting("hi")
+    }
+
+    private void doGreeting(String message) { println message }
+}
+
+class MyClass implements MyTrait {}
+new MyClass().greeter()
+''')
+    }
+}
+


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

Posted by pa...@apache.org.
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);
     }


[3/3] groovy git commit: refactor a huge monster method which is over 100 lines (closes #455)

Posted by pa...@apache.org.
refactor a huge monster method which is over 100 lines (closes #455)


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

Branch: refs/heads/master
Commit: ec3179a45582fc57077ca1ffe87e0ed60545681e
Parents: ed981a7
Author: zhangbo <zh...@nanchao.org>
Authored: Wed Nov 2 13:46:33 2016 +0800
Committer: paulk <pa...@asert.com.au>
Committed: Thu Mar 2 19:02:57 2017 +1000

----------------------------------------------------------------------
 .../transform/trait/TraitASTTransformation.java     | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/ec3179a4/src/main/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/trait/TraitASTTransformation.java b/src/main/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
index 5ff3bb7..99d1c0d 100644
--- a/src/main/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
+++ b/src/main/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
@@ -192,7 +192,7 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
                             methodNode.getLineNumber(), methodNode.getColumnNumber()));
                     return;
                 }
-                helper.addMethod(processMethod(cNode, methodNode, fieldHelper, fieldNames));
+                helper.addMethod(processMethod(cNode, helper, methodNode, fieldHelper, fieldNames));
                 if (methodNode.isPrivate() || methodNode.isStatic()) {
                     nonPublicAPIMethods.add(methodNode);
                 }
@@ -386,9 +386,9 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
         return true;
     }
 
-
     private void processField(final FieldNode field, final MethodNode initializer, final MethodNode staticInitializer,
-                              final ClassNode fieldHelper, final ClassNode helper, final ClassNode trait, final Set<String> knownFields) {
+                              final ClassNode fieldHelper, final ClassNode helper, final ClassNode trait,
+                              final Set<String> knownFields) {
         if (field.isProtected()) {
             unit.addError(new SyntaxException("Cannot have protected field in a trait (" + trait.getName() + "#" + field.getName() + ")",
                     field.getLineNumber(), field.getColumnNumber()));
@@ -412,7 +412,7 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
             } else {
                 VariableExpression thisObject = new VariableExpression(selectedMethod.getParameters()[0]);
                 ExpressionStatement initCode = new ExpressionStatement(initialExpression);
-                processBody(thisObject, selectedMethod, initCode, trait, fieldHelper, knownFields);
+                processBody(thisObject, initCode, trait, helper, fieldHelper, knownFields);
                 BlockStatement code = (BlockStatement) selectedMethod.getCode();
                 MethodCallExpression mce;
                 if (field.isStatic()) {
@@ -476,7 +476,7 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
         fieldHelper.addField(dummyField);
     }
 
-    private MethodNode processMethod(ClassNode traitClass, MethodNode methodNode, ClassNode fieldHelper, Collection<String> knownFields) {
+    private MethodNode processMethod(ClassNode traitClass, ClassNode traitHelperClass, MethodNode methodNode, ClassNode fieldHelper, Collection<String> knownFields) {
         Parameter[] initialParams = methodNode.getParameters();
         Parameter[] newParams = new Parameter[initialParams.length + 1];
         newParams[0] = createSelfParameter(traitClass, methodNode.isStatic());
@@ -488,7 +488,7 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
                 methodNode.getReturnType(),
                 newParams,
                 methodNode.getExceptions(),
-                processBody(new VariableExpression(newParams[0]), methodNode, methodNode.getCode(), traitClass, fieldHelper, knownFields)
+                processBody(new VariableExpression(newParams[0]), methodNode.getCode(), traitClass, traitHelperClass, fieldHelper, knownFields)
         );
         mNode.setSourcePosition(methodNode);
         mNode.addAnnotations(filterAnnotations(methodNode.getAnnotations()));
@@ -538,13 +538,13 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
         return type;
     }
 
-    private Statement processBody(VariableExpression thisObject, MethodNode methodNode, Statement code, ClassNode trait, ClassNode fieldHelper, Collection<String> knownFields) {
+    private Statement processBody(VariableExpression thisObject, Statement code, ClassNode trait, ClassNode traitHelper, ClassNode fieldHelper, Collection<String> knownFields) {
         if (code == null) return null;
         NAryOperationRewriter operationRewriter = new NAryOperationRewriter(unit, knownFields);
         code.visit(operationRewriter);
         SuperCallTraitTransformer superTrn = new SuperCallTraitTransformer(unit);
         code.visit(superTrn);
-        TraitReceiverTransformer trn = new TraitReceiverTransformer(thisObject, unit, trait, fieldHelper, knownFields);
+        TraitReceiverTransformer trn = new TraitReceiverTransformer(thisObject, unit, trait, traitHelper, fieldHelper, knownFields);
         code.visit(trn);
         return code;
     }