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);