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/04/18 02:21:07 UTC
[2/2] groovy git commit: GROOVY-8132: Owner properties should be
preferred over properties of @Delegate (port to GROOVY_2_4_X)
GROOVY-8132: Owner properties should be preferred over properties of @Delegate (port to GROOVY_2_4_X)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/715e99a5
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/715e99a5
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/715e99a5
Branch: refs/heads/GROOVY_2_4_X
Commit: 715e99a5844639595b9b90c7351eba5616ae8770
Parents: 1ca681c
Author: paulk <pa...@asert.com.au>
Authored: Tue Apr 18 12:20:46 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Tue Apr 18 12:20:46 2017 +1000
----------------------------------------------------------------------
.../transform/DelegateASTTransformation.java | 36 ++++++++++++++------
1 file changed, 25 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/715e99a5/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 6be955c..dc23b7a 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;
@@ -47,6 +48,7 @@ import java.util.Set;
import static org.codehaus.groovy.ast.ClassHelper.make;
import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.getAllMethods;
import static org.codehaus.groovy.ast.tools.GeneralUtils.getAllProperties;
@@ -158,7 +160,7 @@ public class DelegateASTTransformation extends AbstractASTTransformation {
private void addSetterIfNeeded(FieldNode fieldNode, ClassNode owner, PropertyNode prop, String name, List<String> includes, List<String> excludes) {
String setterName = "set" + Verifier.capitalize(name);
if ((prop.getModifiers() & ACC_FINAL) == 0
- && owner.getSetterMethod(setterName) == null
+ && owner.getSetterMethod(setterName) == null && owner.getProperty(name) == null
&& !shouldSkipPropertyMethod(name, setterName, excludes, includes)) {
owner.addMethod(setterName,
ACC_PUBLIC,
@@ -183,22 +185,34 @@ 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(owner, name, ownerWillHaveGetAccessor, ownerWillHaveIsAccessor);
+
for (String prefix : new String[]{"get", "is"}) {
String getterName = prefix + suffix;
- if (owner.getGetterMethod(getterName) == null
+ if ((prefix.equals("get") && willHaveGetAccessor && !ownerWillHaveGetAccessor.get()
+ || prefix.equals("is") && willHaveIsAccessor && !ownerWillHaveIsAccessor.get())
&& !shouldSkipPropertyMethod(name, getterName, excludes, includes)) {
- if (prefix.equals("get") && willHaveGetAccessor || prefix.equals("is") && willHaveIsAccessor) {
- owner.addMethod(getterName,
- ACC_PUBLIC,
- GenericsUtils.nonGeneric(prop.getType()),
- Parameter.EMPTY_ARRAY,
- null,
- returnS(propX(varX(fieldNode), name)));
- }
+ owner.addMethod(getterName,
+ ACC_PUBLIC,
+ GenericsUtils.nonGeneric(prop.getType()),
+ Parameter.EMPTY_ARRAY,
+ null,
+ returnS(propX(varX(fieldNode), 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 boolean shouldSkipPropertyMethod(String propertyName, String methodName, List<String> excludes, List<String> includes) {
return (deemedInternalName(propertyName)
|| excludes != null && (excludes.contains(propertyName) || excludes.contains(methodName))