You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2017/04/22 01:19:16 UTC
[09/40] groovy git commit: GROOVY-8132: Owner properties should be
preferred over properties of @Delegate field (closes #518) * Add test for
method delegation precedence
GROOVY-8132: Owner properties should be preferred over properties of @Delegate field (closes #518)
* Add test for method delegation precedence
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/ca83d508
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/ca83d508
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/ca83d508
Branch: refs/heads/parrot
Commit: ca83d508bf4d670a5654f10bc253f30b6caf4c16
Parents: a1fac74
Author: Shil Sinha <sh...@gmail.com>
Authored: Wed Mar 22 13:26:24 2017 -0400
Committer: Shil Sinha <sh...@apache.org>
Committed: Sat Apr 15 16:15:21 2017 -0400
----------------------------------------------------------------------
.../transform/DelegateASTTransformation.java | 33 ++++++++++++++------
.../transform/DelegateTransformTest.groovy | 30 ++++++++++++++++++
2 files changed, 53 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/ca83d508/src/main/org/codehaus/groovy/transform/DelegateASTTransformation.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/DelegateASTTransformation.java b/src/main/org/codehaus/groovy/transform/DelegateASTTransformation.java
index 949a260..8e1daa5 100644
--- a/src/main/org/codehaus/groovy/transform/DelegateASTTransformation.java
+++ b/src/main/org/codehaus/groovy/transform/DelegateASTTransformation.java
@@ -22,6 +22,7 @@ import groovy.lang.Delegate;
import groovy.lang.GroovyObject;
import groovy.lang.Lazy;
+import groovy.lang.Reference;
import org.codehaus.groovy.ast.ASTNode;
import org.codehaus.groovy.ast.AnnotatedNode;
import org.codehaus.groovy.ast.AnnotationNode;
@@ -187,7 +188,7 @@ public class DelegateASTTransformation extends AbstractASTTransformation {
private static void addSetterIfNeeded(DelegateDescription delegate, PropertyNode prop, String name, boolean allNames) {
String setterName = "set" + Verifier.capitalize(name);
if ((prop.getModifiers() & ACC_FINAL) == 0
- && delegate.owner.getSetterMethod(setterName) == null
+ && delegate.owner.getSetterMethod(setterName) == null && delegate.owner.getProperty(name) == null
&& !shouldSkipPropertyMethod(name, setterName, delegate.excludes, delegate.includes, allNames)) {
delegate.owner.addMethod(setterName,
ACC_PUBLIC,
@@ -212,21 +213,33 @@ public class DelegateASTTransformation extends AbstractASTTransformation {
if (cNode.getGetterMethod("get" + suffix) != null && cNode.getGetterMethod("is" + suffix) == null)
willHaveIsAccessor = false;
}
+ Reference<Boolean> ownerWillHaveGetAccessor = new Reference<Boolean>();
+ Reference<Boolean> ownerWillHaveIsAccessor = new Reference<Boolean>();
+ extractAccessorInfo(delegate.owner, name, ownerWillHaveGetAccessor, ownerWillHaveIsAccessor);
+
for (String prefix : new String[]{"get", "is"}) {
String getterName = prefix + suffix;
- if (delegate.owner.getGetterMethod(getterName) == null
+ if ((prefix.equals("get") && willHaveGetAccessor && !ownerWillHaveGetAccessor.get()
+ || prefix.equals("is") && willHaveIsAccessor && !ownerWillHaveIsAccessor.get())
&& !shouldSkipPropertyMethod(name, getterName, delegate.excludes, delegate.includes, allNames)) {
- if (prefix.equals("get") && willHaveGetAccessor || prefix.equals("is") && willHaveIsAccessor) {
- delegate.owner.addMethod(getterName,
- ACC_PUBLIC,
- GenericsUtils.nonGeneric(prop.getType()),
- Parameter.EMPTY_ARRAY,
- null,
- returnS(propX(delegate.getOp, name)));
- }
+ delegate.owner.addMethod(getterName,
+ ACC_PUBLIC,
+ GenericsUtils.nonGeneric(prop.getType()),
+ Parameter.EMPTY_ARRAY,
+ null,
+ returnS(propX(delegate.getOp, name)));
}
}
}
+
+ private static void extractAccessorInfo(ClassNode owner, String name, Reference<Boolean> willHaveGetAccessor, Reference<Boolean> willHaveIsAccessor) {
+ String suffix = Verifier.capitalize(name);
+ boolean hasGetAccessor = owner.getGetterMethod("get" + suffix) != null;
+ boolean hasIsAccessor = owner.getGetterMethod("is" + suffix) != null;
+ PropertyNode prop = owner.getProperty(name);
+ willHaveGetAccessor.set(hasGetAccessor || (prop != null && !hasIsAccessor));
+ willHaveIsAccessor.set(hasIsAccessor || (prop != null && !hasGetAccessor && prop.getOriginType().equals(ClassHelper.boolean_TYPE)));
+ }
private static boolean shouldSkipPropertyMethod(String propertyName, String methodName, List<String> excludes, List<String> includes, boolean allNames) {
return ((!allNames && deemedInternalName(propertyName))
http://git-wip-us.apache.org/repos/asf/groovy/blob/ca83d508/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy b/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy
index 646223a..7b5964a 100644
--- a/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/DelegateTransformTest.groovy
@@ -780,6 +780,36 @@ assert foo.dm.x == '123'
assert b.getC()
"""
}
+
+ void testOwnerPropertyPreferredToDelegateProperty() {
+ assertScript '''
+ class Foo {
+ String pls
+ @groovy.lang.Delegate
+ Bar bar
+ }
+
+ class Bar {
+ String pls
+ }
+ assert new Foo(pls: 'ok').pls == 'ok'
+ '''
+ }
+
+ void testOwnerMethodPreferredToDelegateMethod() {
+ assertScript '''
+ class Foo {
+ String pls() { 'foo pls' }
+ @groovy.lang.Delegate
+ Bar bar
+ }
+
+ class Bar {
+ String pls() { 'bar pls' }
+ }
+ assert new Foo(bar: new Bar()).pls() == 'foo pls'
+ '''
+ }
}
interface DelegateFoo {