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 2021/04/01 04:30:46 UTC

[groovy] 09/10: GROOVY-9993: Field and a property with the same name: clarification of boundary cases (adjust verifier to know about copying annotations for split properties)

This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit e93cb4ce8c22b4f2ab2fe96447e72fa7cc749d04
Author: Paul King <pa...@asert.com.au>
AuthorDate: Tue Mar 30 21:08:54 2021 +1000

    GROOVY-9993: Field and a property with the same name: clarification of boundary cases (adjust verifier to know about copying annotations for split properties)
---
 .../java/org/codehaus/groovy/classgen/Verifier.java | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index 4db0de2..9bdd9a6 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -97,6 +97,7 @@ import static org.apache.groovy.ast.tools.ExpressionUtils.transformInlineConstan
 import static org.apache.groovy.ast.tools.MethodNodeUtils.getCodeAsBlock;
 import static org.apache.groovy.ast.tools.MethodNodeUtils.getPropertyName;
 import static org.apache.groovy.ast.tools.MethodNodeUtils.methodDescriptorWithoutReturnType;
+import static org.codehaus.groovy.ast.AnnotationNode.METHOD_TARGET;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.binX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.block;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.bytecodeX;
@@ -712,13 +713,13 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
             getterModifiers &= ~ACC_FINAL;
         }
         if (getterBlock != null) {
-            visitGetter(node, getterBlock, getterModifiers, getterName);
+            visitGetter(node, field, getterBlock, getterModifiers, getterName);
 
             if (node.getGetterName() == null && getterName.startsWith("get") && (node.getType().equals(ClassHelper.boolean_TYPE) || node.getType().equals(ClassHelper.Boolean_TYPE))) {
                 String altGetterName = "is" + capitalize(name);
                 MethodNode altGetter = classNode.getGetterMethod(altGetterName, !node.isStatic());
                 if (methodNeedsReplacement(altGetter)) {
-                    visitGetter(node, getterBlock, getterModifiers, altGetterName);
+                    visitGetter(node, field, getterBlock, getterModifiers, altGetterName);
                 }
             }
         }
@@ -727,17 +728,31 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
             MethodNode setter = new MethodNode(setterName, accessorModifiers, ClassHelper.VOID_TYPE, setterParameterTypes, ClassNode.EMPTY_ARRAY, setterBlock);
             setter.setSynthetic(true);
             addPropertyMethod(setter);
+            if (!field.isSynthetic()) {
+                copyMethodAnnotations(node, setter);
+            }
             visitMethod(setter);
         }
     }
 
-    private void visitGetter(final PropertyNode node, final Statement getterBlock, final int getterModifiers, final String getterName) {
+    private void visitGetter(final PropertyNode node, final FieldNode field, final Statement getterBlock, final int getterModifiers, final String getterName) {
         MethodNode getter = new MethodNode(getterName, getterModifiers, node.getType(), Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, getterBlock);
         getter.setSynthetic(true);
         addPropertyMethod(getter);
+        if (!field.isSynthetic()) {
+            copyMethodAnnotations(node, getter);
+        }
         visitMethod(getter);
     }
 
+    private void copyMethodAnnotations(PropertyNode node, MethodNode accessor) {
+        for (AnnotationNode annotationNode : node.getAnnotations()) {
+            if (annotationNode.isTargetAllowed(METHOD_TARGET)) {
+                accessor.addAnnotation(annotationNode);
+            }
+        }
+    }
+
     protected void addPropertyMethod(final MethodNode method) {
         classNode.addMethod(method);
         markAsGenerated(classNode, method);