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