Skip to content

Commit

Permalink
Fixes #3120
Browse files Browse the repository at this point in the history
  • Loading branch information
jopatai committed Feb 23, 2022
1 parent 560ded5 commit 22444b7
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 9 deletions.
7 changes: 7 additions & 0 deletions src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
Expand Up @@ -2608,6 +2608,13 @@ public static void createRelevantNullableAnnotation(EclipseNode typeNode, Argume
applyAnnotationToVarDecl(typeNode, arg, lib.getNullableAnnotation(), lib.isTypeUse());
}

public static void createRelevantNullableAnnotation(EclipseNode typeNode, Argument arg, List<NullAnnotationLibrary> applied) {
NullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);
if (lib == null || applied.contains(lib)) return;

applyAnnotationToVarDecl(typeNode, arg, lib.getNullableAnnotation(), lib.isTypeUse());
}

public static void createRelevantNonNullAnnotation(EclipseNode typeNode, Argument arg) {
NullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);
if (lib == null) return;
Expand Down
21 changes: 12 additions & 9 deletions src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
Expand Up @@ -44,6 +44,7 @@
import lombok.core.AnnotationValues;
import lombok.core.configuration.CallSuperType;
import lombok.core.configuration.CheckerFrameworkVersion;
import lombok.core.configuration.NullAnnotationLibrary;
import lombok.eclipse.Eclipse;
import lombok.eclipse.EclipseAnnotationHandler;
import lombok.eclipse.EclipseNode;
Expand Down Expand Up @@ -606,19 +607,20 @@ public MethodDeclaration createEquals(EclipseNode type, Collection<Included<Ecli
int pS = source.sourceStart; int pE = source.sourceEnd;
long p = (long) pS << 32 | pE;

Annotation[] onParamType = null;
List<NullAnnotationLibrary> applied = new ArrayList<NullAnnotationLibrary>();

Annotation[] onParamNullable = null;
String nearest = scanForNearestAnnotation(type, "javax.annotation.ParametersAreNullableByDefault", "javax.annotation.ParametersAreNonnullByDefault");
if ("javax.annotation.ParametersAreNonnullByDefault".equals(nearest)) {
onParamType = new Annotation[1];
onParamType[0] = new MarkerAnnotation(generateQualifiedTypeRef(source, JAVAX_ANNOTATION_NULLABLE), 0);
onParamNullable = new Annotation[] { new MarkerAnnotation(generateQualifiedTypeRef(source, JAVAX_ANNOTATION_NULLABLE), 0) };
applied.add(NullAnnotationLibrary.JAVAX);
}

Annotation[] onParamTypeNullable = null;
nearest = scanForNearestAnnotation(type, "org.eclipse.jdt.annotation.NonNullByDefault");
if (nearest != null) {
Annotation a = new MarkerAnnotation(generateQualifiedTypeRef(source, ORG_ECLIPSE_JDT_ANNOTATION_NULLABLE), 0);
if (onParamType != null) onParamType = new Annotation[] {onParamType[0], a};
else onParamType = new Annotation[] {a};
onParamTypeNullable = new Annotation[] { new MarkerAnnotation(generateQualifiedTypeRef(source, ORG_ECLIPSE_JDT_ANNOTATION_NULLABLE), 0) };
applied.add(NullAnnotationLibrary.ECLIPSE);
}

MethodDeclaration method = new MethodDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);
Expand All @@ -640,12 +642,13 @@ public MethodDeclaration createEquals(EclipseNode type, Collection<Included<Ecli
method.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;
method.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;
QualifiedTypeReference objectRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, new long[] { p, p, p });
if (onParamType != null) objectRef.annotations = new Annotation[][] {null, null, onParamType};
if (onParamTypeNullable != null) objectRef.annotations = new Annotation[][] {null, null, onParamTypeNullable};
setGeneratedBy(objectRef, source);
method.arguments = new Argument[] {new Argument(new char[] { 'o' }, 0, objectRef, Modifier.FINAL)};
method.arguments[0].sourceStart = pS; method.arguments[0].sourceEnd = pE;
if (!onParam.isEmpty()) method.arguments[0].annotations = onParam.toArray(new Annotation[0]);
EclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0]);
if (!onParam.isEmpty() || onParamNullable != null)
method.arguments[0].annotations = copyAnnotations(source, onParam.toArray(new Annotation[0]), onParamNullable);
EclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0], applied);
setGeneratedBy(method.arguments[0], source);

List<Statement> statements = new ArrayList<Statement>();
Expand Down
@@ -0,0 +1,45 @@
import javax.annotation.ParametersAreNonnullByDefault;
@ParametersAreNonnullByDefault
class EqualsAndHashCodeWithNonNullByDefault {
int x;
boolean[] y;
Object[] z;
String a;
String b;
@java.lang.Override
@java.lang.SuppressWarnings("all")
public boolean equals(@javax.annotation.Nullable final java.lang.Object o) {
if (o == this) return true;
if (!(o instanceof EqualsAndHashCodeWithNonNullByDefault)) return false;
final EqualsAndHashCodeWithNonNullByDefault other = (EqualsAndHashCodeWithNonNullByDefault) o;
if (!other.canEqual((java.lang.Object) this)) return false;
if (this.x != other.x) return false;
if (!java.util.Arrays.equals(this.y, other.y)) return false;
if (!java.util.Arrays.deepEquals(this.z, other.z)) return false;
final java.lang.Object this$a = this.a;
final java.lang.Object other$a = other.a;
if (this$a == null ? other$a != null : !this$a.equals(other$a)) return false;
final java.lang.Object this$b = this.b;
final java.lang.Object other$b = other.b;
if (this$b == null ? other$b != null : !this$b.equals(other$b)) return false;
return true;
}
@java.lang.SuppressWarnings("all")
protected boolean canEqual(@javax.annotation.Nullable final java.lang.Object other) {
return other instanceof EqualsAndHashCodeWithNonNullByDefault;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + this.x;
result = result * PRIME + java.util.Arrays.hashCode(this.y);
result = result * PRIME + java.util.Arrays.deepHashCode(this.z);
final java.lang.Object $a = this.a;
result = result * PRIME + ($a == null ? 43 : $a.hashCode());
final java.lang.Object $b = this.b;
result = result * PRIME + ($b == null ? 43 : $b.hashCode());
return result;
}
}
@@ -0,0 +1,50 @@
import javax.annotation.ParametersAreNonnullByDefault;
@lombok.EqualsAndHashCode @ParametersAreNonnullByDefault class EqualsAndHashCodeWithNonNullByDefault {
int x;
boolean[] y;
Object[] z;
String a;
String b;
EqualsAndHashCodeWithNonNullByDefault() {
super();
}
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final @javax.annotation.Nullable java.lang.Object o) {
if ((o == this))
return true;
if ((! (o instanceof EqualsAndHashCodeWithNonNullByDefault)))
return false;
final EqualsAndHashCodeWithNonNullByDefault other = (EqualsAndHashCodeWithNonNullByDefault) o;
if ((! other.canEqual((java.lang.Object) this)))
return false;
if ((this.x != other.x))
return false;
if ((! java.util.Arrays.equals(this.y, other.y)))
return false;
if ((! java.util.Arrays.deepEquals(this.z, other.z)))
return false;
final java.lang.Object this$a = this.a;
final java.lang.Object other$a = other.a;
if (((this$a == null) ? (other$a != null) : (! this$a.equals(other$a))))
return false;
final java.lang.Object this$b = this.b;
final java.lang.Object other$b = other.b;
if (((this$b == null) ? (other$b != null) : (! this$b.equals(other$b))))
return false;
return true;
}
protected @java.lang.SuppressWarnings("all") boolean canEqual(final @javax.annotation.Nullable java.lang.Object other) {
return (other instanceof EqualsAndHashCodeWithNonNullByDefault);
}
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 59;
int result = 1;
result = ((result * PRIME) + this.x);
result = ((result * PRIME) + java.util.Arrays.hashCode(this.y));
result = ((result * PRIME) + java.util.Arrays.deepHashCode(this.z));
final java.lang.Object $a = this.a;
result = ((result * PRIME) + (($a == null) ? 43 : $a.hashCode()));
final java.lang.Object $b = this.b;
result = ((result * PRIME) + (($b == null) ? 43 : $b.hashCode()));
return result;
}
}
@@ -0,0 +1,11 @@
//CONF: lombok.addNullAnnotations = javax
import javax.annotation.ParametersAreNonnullByDefault;
@lombok.EqualsAndHashCode
@ParametersAreNonnullByDefault
class EqualsAndHashCodeWithNonNullByDefault {
int x;
boolean[] y;
Object[] z;
String a;
String b;
}

0 comments on commit 22444b7

Please sign in to comment.