This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
new 32d0ea6 GROOVY-9739: check knownFields for accessedVariable in
FieldNode case
32d0ea6 is described below
commit 32d0ea629912021e186b205f49893adbf4f2afd6
Author: Eric Milles <[email protected]>
AuthorDate: Tue Sep 15 12:14:41 2020 -0500
GROOVY-9739: check knownFields for accessedVariable in FieldNode case
Conflicts:
src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
---
.../transform/trait/TraitReceiverTransformer.java | 35 +++++++++-------------
.../traitx/TraitASTTransformationTest.groovy | 31 +++++++++++++++++++
2 files changed, 45 insertions(+), 21 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
index 8cb68af..dfb3476 100644
---
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
+++
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
@@ -49,6 +49,7 @@ import org.codehaus.groovy.syntax.SyntaxException;
import org.codehaus.groovy.syntax.Token;
import org.codehaus.groovy.syntax.Types;
+import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.List;
@@ -120,27 +121,19 @@ class TraitReceiverTransformer extends
ClassCodeExpressionTransformer {
} else if (exp instanceof VariableExpression) {
VariableExpression vexp = (VariableExpression) exp;
Variable accessedVariable = vexp.getAccessedVariable();
- if (accessedVariable instanceof FieldNode) {
- FieldNode fn = (FieldNode) accessedVariable;
- Expression receiver = createFieldHelperReceiver();
- MethodCallExpression mce;
- boolean isStatic = fn.isStatic();
- if (isStatic) {
- receiver = createStaticReceiver(receiver);
- }
- mce = new MethodCallExpression(
- receiver,
- Traits.helperGetterName(fn),
- ArgumentListExpression.EMPTY_ARGUMENTS
- );
- mce.setSourcePosition(exp);
- mce.setImplicitThis(false);
- markDynamicCall(mce, fn, isStatic);
- return mce;
- } else if (accessedVariable instanceof PropertyNode) {
- String propName = accessedVariable.getName();
- if (knownFields.contains(propName)) {
- return createFieldHelperCall(exp, weavedType, propName);
+ if (accessedVariable instanceof FieldNode || accessedVariable
instanceof PropertyNode) {
+ if (knownFields.contains(accessedVariable.getName())) {
+ boolean isStatic =
Modifier.isStatic(accessedVariable.getModifiers());
+ Expression receiver = createFieldHelperReceiver();
+ if (isStatic) {
+ receiver = createStaticReceiver(receiver);
+ }
+ FieldNode fn = accessedVariable instanceof FieldNode ?
(FieldNode) accessedVariable : ((PropertyNode) accessedVariable).getField();
+ MethodCallExpression mce = new
MethodCallExpression(receiver, Traits.helperGetterName(fn),
ArgumentListExpression.EMPTY_ARGUMENTS);
+ mce.setImplicitThis(false);
+ mce.setSourcePosition(exp);
+ markDynamicCall(mce, fn, isStatic);
+ return mce;
} else {
PropertyExpression propertyExpression = new
PropertyExpression(
new VariableExpression(weaved),
accessedVariable.getName());
diff --git
a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index a0da8e7..2962db6 100644
---
a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++
b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -1375,6 +1375,37 @@ assert p.get(0) == 'bar'
'''
}
+ // GROOVY-9739
+ void testTraitExtendsTraitWithDelegate() {
+ assertScript '''
+ class Main implements ClientSupport {
+ static main(args) {
+ def tester = new Main(client: new Client())
+
+ assert tester.isReady()
+ assert tester.client.getValue() == 'works'
+ }
+ }
+
+ class Client {
+ def getValue() { 'works' }
+ boolean waitForServer(int seconds) { true }
+ }
+
+ trait ClientDelegate {
+ @Delegate Client client
+ }
+
+ trait ClientSupport implements ClientDelegate {
+ boolean isReady() {
+ boolean ready = client.waitForServer(60)
+ // assert, log, etc.
+ return ready
+ }
+ }
+ '''
+ }
+
void testAnnotationShouldBeCarriedOver() {
assertScript '''import groovy.transform.ASTTest