ecj: fix duplicate jackson annotation copying when generating setter

This commit is contained in:
Jan Rieke authored and Reinier Zwitserloot committed 2026-04-21 23:08:35 +02:00
1 parent 2927eff997
commit 0cc5e054a3
4 files changed
+188 -13

No files matched your search

@@ -111,13 +111,6 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
return;
}
// If a fluent setter should be generated, force-copy annotations from the field.
AnnotationValues<Accessors> accessorsForField = EclipseHandlerUtil.getAccessorsForField(fieldNode);
// Copying Jackson annotations is required for fluent accessors (otherwise Jackson would not find the accessor).
Annotation[] copyableToSetterAnnotations = findCopyableToSetterAnnotations(fieldNode, accessorsForField.isExplicit("fluent"));
onMethod = new ArrayList<Annotation>(onMethod);
onMethod.addAll(Arrays.asList(copyableToSetterAnnotations));
createSetterForField(level, fieldNode, sourceNode, false, onMethod, onParam);
}
@@ -170,7 +163,7 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
AnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);
String setterName = toSetterName(fieldNode, isBoolean, accessors);
boolean shouldReturnThis = shouldReturnThis(fieldNode, accessors);
boolean fluent = accessors.isExplicit("fluent");
if (setterName == null) {
fieldNode.addWarning("Not generating setter for this field: It does not fit your @Accessors prefix list.");
return;
@@ -196,11 +189,11 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
}
}
MethodDeclaration method = createSetter((TypeDeclaration) fieldNode.up().get(), false, fieldNode, setterName, null, null, shouldReturnThis, modifier, sourceNode, onMethod, onParam);
MethodDeclaration method = createSetter((TypeDeclaration) fieldNode.up().get(), false, fieldNode, setterName, null, null, shouldReturnThis, modifier, sourceNode, onMethod, onParam, fluent);
injectMethod(fieldNode.up(), method);
}
static MethodDeclaration createSetter(TypeDeclaration parent, boolean deprecate, EclipseNode fieldNode, String name, char[] paramName, char[] booleanFieldToSet, boolean shouldReturnThis, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam) {
static MethodDeclaration createSetter(TypeDeclaration parent, boolean deprecate, EclipseNode fieldNode, String name, char[] paramName, char[] booleanFieldToSet, boolean shouldReturnThis, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam, boolean fluent) {
ASTNode source = sourceNode.get();
int pS = source.sourceStart, pE = source.sourceEnd;
@@ -213,11 +206,11 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
returnThis = new ReturnStatement(thisRef, pS, pE);
}
MethodDeclaration d = createSetter(parent, deprecate, fieldNode, name, paramName, booleanFieldToSet, returnType, returnThis, modifier, sourceNode, onMethod, onParam);
MethodDeclaration d = createSetter(parent, deprecate, fieldNode, name, paramName, booleanFieldToSet, returnType, returnThis, modifier, sourceNode, onMethod, onParam, fluent);
return d;
}
static MethodDeclaration createSetter(TypeDeclaration parent, boolean deprecate, EclipseNode fieldNode, String name, char[] paramName, char[] booleanFieldToSet, TypeReference returnType, Statement returnStatement, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam) {
static MethodDeclaration createSetter(TypeDeclaration parent, boolean deprecate, EclipseNode fieldNode, String name, char[] paramName, char[] booleanFieldToSet, TypeReference returnType, Statement returnStatement, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam, boolean fluent) {
FieldDeclaration field = (FieldDeclaration) fieldNode.get();
if (paramName == null) paramName = field.name;
ASTNode source = sourceNode.get();
@@ -237,7 +230,8 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
if (isFieldDeprecated(fieldNode) || deprecate) {
deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };
}
method.annotations = copyAnnotations(source, onMethod.toArray(new Annotation[0]), deprecated, findCopyableToSetterAnnotations(fieldNode, false));
// Copying Jackson annotations is required for fluent accessors (otherwise Jackson would not find the accessor).
method.annotations = copyAnnotations(source, onMethod.toArray(new Annotation[0]), deprecated, findCopyableToSetterAnnotations(fieldNode, fluent));
Argument param = new Argument(paramName, p, copyType(field.type, source), Modifier.FINAL);
param.sourceStart = pS; param.sourceEnd = pE;
method.arguments = new Argument[] { param };
@@ -0,0 +1,103 @@
//CONF: lombok.copyJacksonAnnotationsToAccessors = true
//version 8: Jackson deps are at least Java7+.
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
public class JacksonJsonProperty3 {
@JsonProperty("a")
String propertyOne;
@JsonProperty("b")
int propertyTwo;
Map<String, Object> additional = new HashMap<>();
@java.lang.SuppressWarnings("all")
@lombok.Generated
public JacksonJsonProperty3() {
}
@JsonProperty("a")
@java.lang.SuppressWarnings("all")
@lombok.Generated
public String getPropertyOne() {
return this.propertyOne;
}
@JsonProperty("b")
@java.lang.SuppressWarnings("all")
@lombok.Generated
public int getPropertyTwo() {
return this.propertyTwo;
}
@java.lang.SuppressWarnings("all")
@lombok.Generated
public Map<String, Object> getAdditional() {
return this.additional;
}
@JsonProperty("a")
@java.lang.SuppressWarnings("all")
@lombok.Generated
public void setPropertyOne(final String propertyOne) {
this.propertyOne = propertyOne;
}
@JsonProperty("b")
@java.lang.SuppressWarnings("all")
@lombok.Generated
public void setPropertyTwo(final int propertyTwo) {
this.propertyTwo = propertyTwo;
}
@java.lang.SuppressWarnings("all")
@lombok.Generated
public void setAdditional(final Map<String, Object> additional) {
this.additional = additional;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@lombok.Generated
public boolean equals(final java.lang.Object o) {
if (o == this) return true;
if (!(o instanceof JacksonJsonProperty3)) return false;
final JacksonJsonProperty3 other = (JacksonJsonProperty3) o;
if (!other.canEqual((java.lang.Object) this)) return false;
if (this.getPropertyTwo() != other.getPropertyTwo()) return false;
final java.lang.Object this$propertyOne = this.getPropertyOne();
final java.lang.Object other$propertyOne = other.getPropertyOne();
if (this$propertyOne == null ? other$propertyOne != null : !this$propertyOne.equals(other$propertyOne)) return false;
final java.lang.Object this$additional = this.getAdditional();
final java.lang.Object other$additional = other.getAdditional();
if (this$additional == null ? other$additional != null : !this$additional.equals(other$additional)) return false;
return true;
}
@java.lang.SuppressWarnings("all")
@lombok.Generated
protected boolean canEqual(final java.lang.Object other) {
return other instanceof JacksonJsonProperty3;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@lombok.Generated
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + this.getPropertyTwo();
final java.lang.Object $propertyOne = this.getPropertyOne();
result = result * PRIME + ($propertyOne == null ? 43 : $propertyOne.hashCode());
final java.lang.Object $additional = this.getAdditional();
result = result * PRIME + ($additional == null ? 43 : $additional.hashCode());
return result;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
@lombok.Generated
public java.lang.String toString() {
return "JacksonJsonProperty3(propertyOne=" + this.getPropertyOne() + ", propertyTwo=" + this.getPropertyTwo() + ", additional=" + this.getAdditional() + ")";
}
}
@@ -0,0 +1,66 @@
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
public @Data class JacksonJsonProperty3 {
@JsonProperty("a") String propertyOne;
@JsonProperty("b") int propertyTwo;
Map<String, Object> additional = new HashMap<>();
public @JsonProperty("a") @java.lang.SuppressWarnings("all") @lombok.Generated String getPropertyOne() {
return this.propertyOne;
}
public @JsonProperty("b") @java.lang.SuppressWarnings("all") @lombok.Generated int getPropertyTwo() {
return this.propertyTwo;
}
public @java.lang.SuppressWarnings("all") @lombok.Generated Map<String, Object> getAdditional() {
return this.additional;
}
public @JsonProperty("a") @java.lang.SuppressWarnings("all") @lombok.Generated void setPropertyOne(final String propertyOne) {
this.propertyOne = propertyOne;
}
public @JsonProperty("b") @java.lang.SuppressWarnings("all") @lombok.Generated void setPropertyTwo(final int propertyTwo) {
this.propertyTwo = propertyTwo;
}
public @java.lang.SuppressWarnings("all") @lombok.Generated void setAdditional(final Map<String, Object> additional) {
this.additional = additional;
}
public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
if ((! (o instanceof JacksonJsonProperty3)))
return false;
final JacksonJsonProperty3 other = (JacksonJsonProperty3) o;
if ((! other.canEqual((java.lang.Object) this)))
return false;
if ((this.getPropertyTwo() != other.getPropertyTwo()))
return false;
final java.lang.Object this$propertyOne = this.getPropertyOne();
final java.lang.Object other$propertyOne = other.getPropertyOne();
if (((this$propertyOne == null) ? (other$propertyOne != null) : (! this$propertyOne.equals(other$propertyOne))))
return false;
final java.lang.Object this$additional = this.getAdditional();
final java.lang.Object other$additional = other.getAdditional();
if (((this$additional == null) ? (other$additional != null) : (! this$additional.equals(other$additional))))
return false;
return true;
}
protected @java.lang.SuppressWarnings("all") @lombok.Generated boolean canEqual(final java.lang.Object other) {
return (other instanceof JacksonJsonProperty3);
}
public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated int hashCode() {
final int PRIME = 59;
int result = 1;
result = ((result * PRIME) + this.getPropertyTwo());
final java.lang.Object $propertyOne = this.getPropertyOne();
result = ((result * PRIME) + (($propertyOne == null) ? 43 : $propertyOne.hashCode()));
final java.lang.Object $additional = this.getAdditional();
result = ((result * PRIME) + (($additional == null) ? 43 : $additional.hashCode()));
return result;
}
public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated java.lang.String toString() {
return (((((("JacksonJsonProperty3(propertyOne=" + this.getPropertyOne()) + ", propertyTwo=") + this.getPropertyTwo()) + ", additional=") + this.getAdditional()) + ")");
}
public @java.lang.SuppressWarnings("all") @lombok.Generated JacksonJsonProperty3() {
super();
}
}
@@ -0,0 +1,12 @@
//CONF: lombok.copyJacksonAnnotationsToAccessors = true
//version 8: Jackson deps are at least Java7+.
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data public class JacksonJsonProperty3 {
@JsonProperty("a") String propertyOne;
@JsonProperty("b") int propertyTwo;
Map<String, Object> additional = new HashMap<>();
}