aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java202
-rw-r--r--src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java1
-rw-r--r--test/transform/resource/after-ecj/DataExtended.java9
-rw-r--r--test/transform/resource/after-ecj/DataIgnore.java9
-rw-r--r--test/transform/resource/after-ecj/DataOnLocalClass.java27
-rw-r--r--test/transform/resource/after-ecj/DataPlain.java31
-rw-r--r--test/transform/resource/after-ecj/DataWithGetter.java9
-rw-r--r--test/transform/resource/after-ecj/DataWithGetterNone.java9
8 files changed, 202 insertions, 95 deletions
diff --git a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
index e501c3f1..ed13fd1b 100644
--- a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
@@ -47,6 +47,7 @@ import org.eclipse.jdt.internal.compiler.ast.Expression;
import org.eclipse.jdt.internal.compiler.ast.FalseLiteral;
import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
import org.eclipse.jdt.internal.compiler.ast.IfStatement;
+import org.eclipse.jdt.internal.compiler.ast.InstanceOfExpression;
import org.eclipse.jdt.internal.compiler.ast.IntLiteral;
import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
import org.eclipse.jdt.internal.compiler.ast.MessageSend;
@@ -202,9 +203,13 @@ public class HandleEqualsAndHashCode implements EclipseAnnotationHandler<EqualsA
}
}
+ boolean needsCanEqual = false;
switch (methodExists("equals", typeNode)) {
case NOT_EXISTS:
- MethodDeclaration equals = createEquals(typeNode, nodesForEquality, callSuper, errorNode.get(), useFieldsDirectly);
+ boolean isFinal = (typeDecl.modifiers & ClassFileConstants.AccFinal) != 0;
+ needsCanEqual = !isDirectDescendantOfObject || !isFinal;
+
+ MethodDeclaration equals = createEquals(typeNode, nodesForEquality, callSuper, errorNode.get(), useFieldsDirectly, needsCanEqual);
injectMethod(typeNode, equals);
break;
case EXISTS_BY_LOMBOK:
@@ -217,6 +222,19 @@ public class HandleEqualsAndHashCode implements EclipseAnnotationHandler<EqualsA
break;
}
+ if (needsCanEqual) {
+ switch (methodExists("canEqual", typeNode)) {
+ case NOT_EXISTS:
+ MethodDeclaration equals = createCanEqual(typeNode, errorNode.get());
+ injectMethod(typeNode, equals);
+ break;
+ case EXISTS_BY_LOMBOK:
+ case EXISTS_BY_USER:
+ default:
+ break;
+ }
+ }
+
switch (methodExists("hashCode", typeNode)) {
case NOT_EXISTS:
MethodDeclaration hashCode = createHashCode(typeNode, nodesForEquality, callSuper, errorNode.get(), useFieldsDirectly);
@@ -415,9 +433,10 @@ public class HandleEqualsAndHashCode implements EclipseAnnotationHandler<EqualsA
return method;
}
- private MethodDeclaration createEquals(EclipseNode type, Collection<EclipseNode> fields, boolean callSuper, ASTNode source, boolean useFieldsDirectly) {
+ private MethodDeclaration createEquals(EclipseNode type, Collection<EclipseNode> fields, boolean callSuper, ASTNode source, boolean useFieldsDirectly, boolean needsCanEqual) {
int pS = source.sourceStart; int pE = source.sourceEnd;
long p = (long)pS << 32 | pE;
+ TypeDeclaration typeDecl = (TypeDeclaration)type.get();
MethodDeclaration method = new MethodDeclaration(
((CompilationUnitDeclaration) type.top().get()).compilationResult);
@@ -458,75 +477,36 @@ public class HandleEqualsAndHashCode implements EclipseAnnotationHandler<EqualsA
statements.add(ifOtherEqualsThis);
}
- /* if (o == null) return false; */ {
+ /* if (!(o instanceof MyType) return false; */ {
SingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
Eclipse.setGeneratedBy(oRef, source);
- NullLiteral nullLiteral = new NullLiteral(pS, pE);
- Eclipse.setGeneratedBy(nullLiteral, source);
- EqualExpression otherEqualsNull = new EqualExpression(oRef, nullLiteral, OperatorIds.EQUAL_EQUAL);
- Eclipse.setGeneratedBy(otherEqualsNull, source);
+
+ SingleTypeReference typeReference = new SingleTypeReference(typeDecl.name, p);
+ Eclipse.setGeneratedBy(typeReference, source);
+
+ InstanceOfExpression instanceOf = new InstanceOfExpression(oRef, typeReference);
+ instanceOf.sourceStart = pS; instanceOf.sourceEnd = pE;
+ Eclipse.setGeneratedBy(instanceOf, source);
+
+ Expression notInstanceOf = new UnaryExpression(instanceOf, OperatorIds.NOT);
+ Eclipse.setGeneratedBy(notInstanceOf, source);
FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
Eclipse.setGeneratedBy(falseLiteral, source);
+
ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
Eclipse.setGeneratedBy(returnFalse, source);
- IfStatement ifOtherEqualsNull = new IfStatement(otherEqualsNull, returnFalse, pS, pE);
- Eclipse.setGeneratedBy(ifOtherEqualsNull, source);
- statements.add(ifOtherEqualsNull);
- }
-
- /* if (o.getClass() != getClass()) return false; */ {
- MessageSend otherGetClass = new MessageSend();
- otherGetClass.sourceStart = pS; otherGetClass.sourceEnd = pE;
- Eclipse.setGeneratedBy(otherGetClass, source);
- otherGetClass.receiver = new SingleNameReference(new char[] { 'o' }, p);
- Eclipse.setGeneratedBy(otherGetClass.receiver, source);
- otherGetClass.selector = "getClass".toCharArray();
- MessageSend thisGetClass = new MessageSend();
- thisGetClass.sourceStart = pS; thisGetClass.sourceEnd = pE;
- Eclipse.setGeneratedBy(thisGetClass, source);
- thisGetClass.receiver = new ThisReference(pS, pE);
- Eclipse.setGeneratedBy(thisGetClass.receiver, source);
- thisGetClass.selector = "getClass".toCharArray();
- EqualExpression classesNotEqual = new EqualExpression(otherGetClass, thisGetClass, OperatorIds.NOT_EQUAL);
- Eclipse.setGeneratedBy(classesNotEqual, source);
- FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
- Eclipse.setGeneratedBy(falseLiteral, source);
- ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
- Eclipse.setGeneratedBy(returnFalse, source);
- IfStatement ifClassesNotEqual = new IfStatement(classesNotEqual, returnFalse, pS, pE);
- Eclipse.setGeneratedBy(ifClassesNotEqual, source);
- statements.add(ifClassesNotEqual);
+
+ IfStatement ifNotInstanceOf = new IfStatement(notInstanceOf, returnFalse, pS, pE);
+ Eclipse.setGeneratedBy(ifNotInstanceOf, source);
+ statements.add(ifNotInstanceOf);
}
- char[] otherN = "other".toCharArray();
-
- /* if (!super.equals(o)) return false; */
- if (callSuper) {
- MessageSend callToSuper = new MessageSend();
- callToSuper.sourceStart = pS; callToSuper.sourceEnd = pE;
- Eclipse.setGeneratedBy(callToSuper, source);
- callToSuper.receiver = new SuperReference(pS, pE);
- Eclipse.setGeneratedBy(callToSuper.receiver, source);
- callToSuper.selector = "equals".toCharArray();
- SingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
- Eclipse.setGeneratedBy(oRef, source);
- callToSuper.arguments = new Expression[] {oRef};
- Expression superNotEqual = new UnaryExpression(callToSuper, OperatorIds.NOT);
- Eclipse.setGeneratedBy(superNotEqual, source);
- FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
- Eclipse.setGeneratedBy(falseLiteral, source);
- ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
- Eclipse.setGeneratedBy(returnFalse, source);
- IfStatement ifSuperEquals = new IfStatement(superNotEqual, returnFalse, pS, pE);
- Eclipse.setGeneratedBy(ifSuperEquals, source);
- statements.add(ifSuperEquals);
- }
+ char[] otherName = "other".toCharArray();
- TypeDeclaration typeDecl = (TypeDeclaration)type.get();
/* MyType<?> other = (MyType<?>) o; */ {
if (!fields.isEmpty()) {
- LocalDeclaration other = new LocalDeclaration(otherN, pS, pE);
+ LocalDeclaration other = new LocalDeclaration(otherName, pS, pE);
other.modifiers |= ClassFileConstants.AccFinal;
Eclipse.setGeneratedBy(other, source);
char[] typeName = typeDecl.name;
@@ -556,11 +536,63 @@ public class HandleEqualsAndHashCode implements EclipseAnnotationHandler<EqualsA
}
}
+ /* if (!other.canEqual(this)) return false; */ {
+ if (needsCanEqual) {
+ MessageSend otherCanEqual = new MessageSend();
+ otherCanEqual.sourceStart = pS; otherCanEqual.sourceEnd = pE;
+ Eclipse.setGeneratedBy(otherCanEqual, source);
+ otherCanEqual.receiver = new SingleNameReference(otherName, p);
+ Eclipse.setGeneratedBy(otherCanEqual.receiver, source);
+ otherCanEqual.selector = "canEqual".toCharArray();
+
+ ThisReference thisReference = new ThisReference(pS, pE);
+ Eclipse.setGeneratedBy(thisReference, source);
+
+ otherCanEqual.arguments = new Expression[] {thisReference};
+
+ Expression notOtherCanEqual = new UnaryExpression(otherCanEqual, OperatorIds.NOT);
+ Eclipse.setGeneratedBy(notOtherCanEqual, source);
+
+ FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
+ Eclipse.setGeneratedBy(falseLiteral, source);
+
+ ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
+ Eclipse.setGeneratedBy(returnFalse, source);
+
+ IfStatement ifNotCanEqual = new IfStatement(notOtherCanEqual, returnFalse, pS, pE);
+ Eclipse.setGeneratedBy(ifNotCanEqual, source);
+
+ statements.add(ifNotCanEqual);
+ }
+ }
+
+ /* if (!super.equals(o)) return false; */
+ if (callSuper) {
+ MessageSend callToSuper = new MessageSend();
+ callToSuper.sourceStart = pS; callToSuper.sourceEnd = pE;
+ Eclipse.setGeneratedBy(callToSuper, source);
+ callToSuper.receiver = new SuperReference(pS, pE);
+ Eclipse.setGeneratedBy(callToSuper.receiver, source);
+ callToSuper.selector = "equals".toCharArray();
+ SingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);
+ Eclipse.setGeneratedBy(oRef, source);
+ callToSuper.arguments = new Expression[] {oRef};
+ Expression superNotEqual = new UnaryExpression(callToSuper, OperatorIds.NOT);
+ Eclipse.setGeneratedBy(superNotEqual, source);
+ FalseLiteral falseLiteral = new FalseLiteral(pS, pE);
+ Eclipse.setGeneratedBy(falseLiteral, source);
+ ReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);
+ Eclipse.setGeneratedBy(returnFalse, source);
+ IfStatement ifSuperEquals = new IfStatement(superNotEqual, returnFalse, pS, pE);
+ Eclipse.setGeneratedBy(ifSuperEquals, source);
+ statements.add(ifSuperEquals);
+ }
+
for (EclipseNode field : fields) {
TypeReference fType = getFieldType(field, useFieldsDirectly);
char[] token = fType.getLastToken();
Expression thisFieldAccessor = createFieldAccessor(field, useFieldsDirectly, source);
- Expression otherFieldAccessor = createFieldAccessor(field, useFieldsDirectly, source, otherN);
+ Expression otherFieldAccessor = createFieldAccessor(field, useFieldsDirectly, source, otherName);
if (fType.dimensions() == 0 && token != null) {
if (Arrays.equals(TypeConstants.FLOAT, token)) {
@@ -589,7 +621,7 @@ public class HandleEqualsAndHashCode implements EclipseAnnotationHandler<EqualsA
Eclipse.setGeneratedBy(equalsCall, source);
equalsCall.receiver = createFieldAccessor(field, useFieldsDirectly, source);
equalsCall.selector = "equals".toCharArray();
- equalsCall.arguments = new Expression[] { createFieldAccessor(field, useFieldsDirectly, source, otherN) };
+ equalsCall.arguments = new Expression[] { createFieldAccessor(field, useFieldsDirectly, source, otherName) };
UnaryExpression fieldsNotEqual = new UnaryExpression(equalsCall, OperatorIds.NOT);
fieldsNotEqual.sourceStart = pS; fieldsNotEqual.sourceEnd = pE;
Eclipse.setGeneratedBy(fieldsNotEqual, source);
@@ -639,6 +671,54 @@ public class HandleEqualsAndHashCode implements EclipseAnnotationHandler<EqualsA
return method;
}
+
+ private MethodDeclaration createCanEqual(EclipseNode type, ASTNode source) {
+ /* public boolean canEquals(final java.lang.Object other) {
+ * return other instanceof MyType;
+ * }
+ */
+ int pS = source.sourceStart; int pE = source.sourceEnd;
+ long p = (long)pS << 32 | pE;
+
+ char[] otherName = "other".toCharArray();
+
+ MethodDeclaration method = new MethodDeclaration(
+ ((CompilationUnitDeclaration) type.top().get()).compilationResult);
+ Eclipse.setGeneratedBy(method, source);
+ method.modifiers = EclipseHandlerUtil.toEclipseModifier(AccessLevel.PUBLIC);
+ method.returnType = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);
+ method.returnType.sourceStart = pS; method.returnType.sourceEnd = pE;
+ Eclipse.setGeneratedBy(method.returnType, source);
+ method.selector = "canEqual".toCharArray();
+ method.thrownExceptions = null;
+ method.typeParameters = null;
+ method.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;
+ method.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;
+ method.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;
+ TypeReference objectRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, new long[] { p, p, p });
+ Eclipse.setGeneratedBy(objectRef, source);
+ method.arguments = new Argument[] {new Argument(otherName, 0, objectRef, Modifier.FINAL)};
+ method.arguments[0].sourceStart = pS; method.arguments[0].sourceEnd = pE;
+ Eclipse.setGeneratedBy(method.arguments[0], source);
+
+ SingleNameReference otherRef = new SingleNameReference(otherName, p);
+ Eclipse.setGeneratedBy(otherRef, source);
+
+ SingleTypeReference typeReference = new SingleTypeReference(((TypeDeclaration)type.get()).name, p);
+ Eclipse.setGeneratedBy(typeReference, source);
+
+ InstanceOfExpression instanceOf = new InstanceOfExpression(otherRef, typeReference);
+ instanceOf.sourceStart = pS; instanceOf.sourceEnd = pE;
+ Eclipse.setGeneratedBy(instanceOf, source);
+
+ ReturnStatement returnStatement = new ReturnStatement(instanceOf, pS, pE);
+ Eclipse.setGeneratedBy(returnStatement, source);
+
+ method.statements = new Statement[] {returnStatement};
+ return method;
+ }
+
+
private IfStatement generateCompareFloatOrDouble(Expression thisRef, Expression otherRef, char[] floatOrDouble, ASTNode source) {
int pS = source.sourceStart, pE = source.sourceEnd;
/* if (Float.compare(fieldName, other.fieldName) != 0) return false */
diff --git a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
index b2d64f05..c5475fb1 100644
--- a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
@@ -479,5 +479,4 @@ public class HandleEqualsAndHashCode implements JavacAnnotationHandler<EqualsAnd
private JCStatement returnBool(TreeMaker maker, boolean bool) {
return maker.Return(maker.Literal(TypeTags.BOOLEAN, bool ? 1 : 0));
}
-
}
diff --git a/test/transform/resource/after-ecj/DataExtended.java b/test/transform/resource/after-ecj/DataExtended.java
index b7be8bcf..10a66547 100644
--- a/test/transform/resource/after-ecj/DataExtended.java
+++ b/test/transform/resource/after-ecj/DataExtended.java
@@ -12,15 +12,18 @@
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof DataExtended)))
return false;
final DataExtended other = (DataExtended) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.getX() != other.getX()))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof DataExtended);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
diff --git a/test/transform/resource/after-ecj/DataIgnore.java b/test/transform/resource/after-ecj/DataIgnore.java
index df2254c8..13c8e2f7 100644
--- a/test/transform/resource/after-ecj/DataIgnore.java
+++ b/test/transform/resource/after-ecj/DataIgnore.java
@@ -11,15 +11,18 @@
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof DataIgnore)))
return false;
final DataIgnore other = (DataIgnore) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.getX() != other.getX()))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof DataIgnore);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
diff --git a/test/transform/resource/after-ecj/DataOnLocalClass.java b/test/transform/resource/after-ecj/DataOnLocalClass.java
index a17033c2..b987b967 100644
--- a/test/transform/resource/after-ecj/DataOnLocalClass.java
+++ b/test/transform/resource/after-ecj/DataOnLocalClass.java
@@ -23,17 +23,20 @@ class DataOnLocalClass1 {
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof Local)))
return false;
final Local other = (Local) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.getX() != other.getX()))
return false;
if (((this.getName() == null) ? (other.getName() != null) : (! this.getName().equals(other.getName()))))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof Local);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -69,15 +72,18 @@ class DataOnLocalClass2 {
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof InnerLocal)))
return false;
final InnerLocal other = (InnerLocal) o;
+ if ((! other.canEqual(this)))
+ return false;
if (((this.getName() == null) ? (other.getName() != null) : (! this.getName().equals(other.getName()))))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof InnerLocal);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -99,15 +105,18 @@ class DataOnLocalClass2 {
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof Local)))
return false;
final Local other = (Local) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.getX() != other.getX()))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof Local);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
diff --git a/test/transform/resource/after-ecj/DataPlain.java b/test/transform/resource/after-ecj/DataPlain.java
index b0af873f..d704a249 100644
--- a/test/transform/resource/after-ecj/DataPlain.java
+++ b/test/transform/resource/after-ecj/DataPlain.java
@@ -18,17 +18,20 @@ import lombok.Data;
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof Data1)))
return false;
final Data1 other = (Data1) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.getX() != other.getX()))
return false;
if (((this.getName() == null) ? (other.getName() != null) : (! this.getName().equals(other.getName()))))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof Data1);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -59,17 +62,20 @@ import lombok.Data;
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof Data2)))
return false;
final Data2 other = (Data2) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.getX() != other.getX()))
return false;
if (((this.getName() == null) ? (other.getName() != null) : (! this.getName().equals(other.getName()))))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof Data2);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -100,9 +106,7 @@ final @Data class Data3 {
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof Data3)))
return false;
final Data3 other = (Data3) o;
if ((this.getX() != other.getX()))
@@ -133,17 +137,20 @@ final @Data @lombok.EqualsAndHashCode(callSuper = true) class Data4 extends java
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
+ if ((! (o instanceof Data4)))
return false;
- if ((o.getClass() != this.getClass()))
+ final Data4 other = (Data4) o;
+ if ((! other.canEqual(this)))
return false;
if ((! super.equals(o)))
return false;
- final Data4 other = (Data4) o;
if ((this.getX() != other.getX()))
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof Data4);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
diff --git a/test/transform/resource/after-ecj/DataWithGetter.java b/test/transform/resource/after-ecj/DataWithGetter.java
index abf1dc64..904ae0fa 100644
--- a/test/transform/resource/after-ecj/DataWithGetter.java
+++ b/test/transform/resource/after-ecj/DataWithGetter.java
@@ -15,11 +15,11 @@
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof DataWithGetter)))
return false;
final DataWithGetter other = (DataWithGetter) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.getX() != other.getX()))
return false;
if ((this.getY() != other.getY()))
@@ -28,6 +28,9 @@
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof DataWithGetter);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;
diff --git a/test/transform/resource/after-ecj/DataWithGetterNone.java b/test/transform/resource/after-ecj/DataWithGetterNone.java
index 97509c07..0172f4f3 100644
--- a/test/transform/resource/after-ecj/DataWithGetterNone.java
+++ b/test/transform/resource/after-ecj/DataWithGetterNone.java
@@ -15,11 +15,11 @@
public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
if ((o == this))
return true;
- if ((o == null))
- return false;
- if ((o.getClass() != this.getClass()))
+ if ((! (o instanceof DataWithGetterNone)))
return false;
final DataWithGetterNone other = (DataWithGetterNone) o;
+ if ((! other.canEqual(this)))
+ return false;
if ((this.x != other.x))
return false;
if ((this.y != other.y))
@@ -28,6 +28,9 @@
return false;
return true;
}
+ public @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof DataWithGetterNone);
+ }
public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
final int PRIME = 31;
int result = 1;