You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by bl...@apache.org on 2017/01/26 20:26:47 UTC
[2/2] groovy git commit: GROOVY-8023: changing O(n^2) time complexity
of transformMethodCall in SuperCallTraitTransformer to O(n)
GROOVY-8023: changing O(n^2) time complexity of transformMethodCall in SuperCallTraitTransformer to O(n)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/c29f252f
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/c29f252f
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/c29f252f
Branch: refs/heads/GROOVY_2_4_X
Commit: c29f252f35cc83c2e77c7eabc79f2d7e8623a65c
Parents: 8cff58c
Author: Jochen Theodorou <bl...@gmx.org>
Authored: Thu Jan 26 21:01:35 2017 +0100
Committer: Jochen Theodorou <bl...@gmx.org>
Committed: Thu Jan 26 21:16:08 2017 +0100
----------------------------------------------------------------------
.../trait/SuperCallTraitTransformer.java | 40 ++++++++++++++------
.../codehaus/groovy/transform/trait/Traits.java | 2 +-
2 files changed, 29 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/c29f252f/src/main/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java b/src/main/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
index e403a2c..6ebc5f2 100644
--- a/src/main/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
+++ b/src/main/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
@@ -19,6 +19,7 @@
package org.codehaus.groovy.transform.trait;
import groovy.lang.MetaProperty;
+import java.util.List;
import org.codehaus.groovy.ast.ClassCodeExpressionTransformer;
import org.codehaus.groovy.ast.ClassNode;
import org.codehaus.groovy.ast.MethodNode;
@@ -34,8 +35,6 @@ import org.codehaus.groovy.ast.expr.VariableExpression;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.syntax.Types;
-import java.util.List;
-
/**
* This transformer is used to transform calls to <code>SomeTrait.super.foo()</code> into the appropriate trait call.
*
@@ -56,9 +55,6 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
@Override
public Expression transform(final Expression exp) {
- if (exp instanceof PropertyExpression) {
- return transformPropertyExpression((PropertyExpression) exp);
- }
if (exp instanceof MethodCallExpression) {
return transformMethodCallExpression((MethodCallExpression)exp);
}
@@ -74,12 +70,17 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
BinaryExpression bin = (BinaryExpression) trn;
Expression leftExpression = bin.getLeftExpression();
if (bin.getOperation().getType() == Types.EQUAL && leftExpression instanceof PropertyExpression) {
- ClassNode traitReceiver = ((PropertyExpression) leftExpression).getObjectExpression().getNodeMetaData(SuperCallTraitTransformer.class);
+ ClassNode traitReceiver = null;
+ PropertyExpression leftPropertyExpression = (PropertyExpression) leftExpression;
+ if (isTraitSuperPropertyExpression(leftPropertyExpression.getObjectExpression())) {
+ PropertyExpression pexp = (PropertyExpression) leftPropertyExpression.getObjectExpression();
+ traitReceiver = pexp.getObjectExpression().getType();
+ }
if (traitReceiver!=null) {
// A.super.foo = ...
TraitHelpersTuple helpers = Traits.findHelpers(traitReceiver);
ClassNode helper = helpers.getHelper();
- String setterName = MetaProperty.getSetterName(((PropertyExpression) leftExpression).getPropertyAsString());
+ String setterName = MetaProperty.getSetterName(leftPropertyExpression.getPropertyAsString());
List<MethodNode> methods = helper.getMethods(setterName);
for (MethodNode method : methods) {
Parameter[] parameters = method.getParameters();
@@ -106,9 +107,10 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
}
private Expression transformMethodCallExpression(final MethodCallExpression exp) {
- Expression objectExpression = transform(exp.getObjectExpression());
- ClassNode traitReceiver = objectExpression.getNodeMetaData(SuperCallTraitTransformer.class);
- if (traitReceiver!=null) {
+ if (isTraitSuperPropertyExpression(exp.getObjectExpression())) {
+ Expression objectExpression = exp.getObjectExpression();
+ ClassNode traitReceiver = ((PropertyExpression) objectExpression).getObjectExpression().getType();
+
TraitHelpersTuple helpers = Traits.findHelpers(traitReceiver);
// (SomeTrait.super).foo() --> SomeTrait$Helper.foo(this)
ClassExpression receiver = new ClassExpression(
@@ -123,11 +125,11 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
newArgs.addExpression(transform(expression));
}
} else {
- newArgs.addExpression(arguments);
+ newArgs.addExpression(transform(arguments));
}
MethodCallExpression result = new MethodCallExpression(
receiver,
- exp.getMethod(),
+ transform(exp.getMethod()),
newArgs
);
result.setImplicitThis(false);
@@ -150,4 +152,18 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
}
return super.transform(expression);
}
+
+ private boolean isTraitSuperPropertyExpression(Expression exp) {
+ if (exp instanceof PropertyExpression) {
+ PropertyExpression pexp = (PropertyExpression) exp;
+ Expression objectExpression = pexp.getObjectExpression();
+ if (objectExpression instanceof ClassExpression) {
+ ClassNode type = objectExpression.getType();
+ if (Traits.isTrait(type) && "super".equals(pexp.getPropertyAsString())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/c29f252f/src/main/org/codehaus/groovy/transform/trait/Traits.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/trait/Traits.java b/src/main/org/codehaus/groovy/transform/trait/Traits.java
index 4a0ac91..b1c9537 100644
--- a/src/main/org/codehaus/groovy/transform/trait/Traits.java
+++ b/src/main/org/codehaus/groovy/transform/trait/Traits.java
@@ -136,7 +136,7 @@ public abstract class Traits {
try {
final ClassLoader classLoader = trait.getTypeClass().getClassLoader();
String helperClassName = Traits.helperClassName(trait);
- helperClassNode = ClassHelper.make(classLoader.loadClass(helperClassName));
+ helperClassNode = ClassHelper.make(Class.forName(helperClassName, false, classLoader));
try {
fieldHelperClassNode = ClassHelper.make(classLoader.loadClass(Traits.fieldHelperClassName(trait)));
} catch (ClassNotFoundException e) {