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;
}