From 2ba65d105ddfce54690a64f93cbc5c55480ef364 Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Fri, 25 Sep 2020 00:13:50 +0200 Subject: Cache hashCode: - Fix bug where 0 would be returned once - Fix Eclipse position error - Don't initialize field with default value 0 --- .../eclipse/handlers/HandleEqualsAndHashCode.java | 44 +++++++++++++++------- .../javac/handlers/HandleEqualsAndHashCode.java | 22 ++++++----- .../after-delombok/EqualsAndHashCodeCache.java | 31 ++++++++------- .../resource/after-ecj/EqualsAndHashCodeCache.java | 36 +++++++++++------- 4 files changed, 84 insertions(+), 49 deletions(-) diff --git a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java index 2f0ce227..deb19c00 100755 --- a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java +++ b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java @@ -246,12 +246,11 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler member : members) { @@ -345,14 +344,17 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler>> 32 ^ $d); result = result * PRIME + (this.b ? 79 : 97); - this.$hashCodeCache = result != 0 ? result : java.lang.Integer.MIN_VALUE; + if (result == 0) result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } final class EqualsAndHashCode3 extends EqualsAndHashCode { @java.lang.SuppressWarnings("all") - private transient int $hashCodeCache = 0; + private transient int $hashCodeCache; @java.lang.Override @java.lang.SuppressWarnings("all") public boolean equals(final java.lang.Object o) { @@ -103,14 +105,15 @@ final class EqualsAndHashCode3 extends EqualsAndHashCode { @java.lang.SuppressWarnings("all") public int hashCode() { if (this.$hashCodeCache != 0) return this.$hashCodeCache; - final int result = 1; - this.$hashCodeCache = result != 0 ? result : java.lang.Integer.MIN_VALUE; + int result = 1; + if (result == 0) result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } class EqualsAndHashCode4 extends EqualsAndHashCode { @java.lang.SuppressWarnings("all") - private transient int $hashCodeCache = 0; + private transient int $hashCodeCache; @java.lang.Override @java.lang.SuppressWarnings("all") public boolean equals(final java.lang.Object o) { @@ -129,14 +132,15 @@ class EqualsAndHashCode4 extends EqualsAndHashCode { @java.lang.SuppressWarnings("all") public int hashCode() { if (this.$hashCodeCache != 0) return this.$hashCodeCache; - final int result = super.hashCode(); - this.$hashCodeCache = result != 0 ? result : java.lang.Integer.MIN_VALUE; + int result = super.hashCode(); + if (result == 0) result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } final class EqualsAndHashCode5 extends EqualsAndHashCode { @java.lang.SuppressWarnings("all") - private transient int $hashCodeCache = 0; + private transient int $hashCodeCache; @java.lang.Override @java.lang.SuppressWarnings("all") public boolean equals(final java.lang.Object o) { @@ -155,8 +159,9 @@ final class EqualsAndHashCode5 extends EqualsAndHashCode { @java.lang.SuppressWarnings("all") public int hashCode() { if (this.$hashCodeCache != 0) return this.$hashCodeCache; - final int result = super.hashCode(); - this.$hashCodeCache = result != 0 ? result : java.lang.Integer.MIN_VALUE; + int result = super.hashCode(); + if (result == 0) result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } diff --git a/test/transform/resource/after-ecj/EqualsAndHashCodeCache.java b/test/transform/resource/after-ecj/EqualsAndHashCodeCache.java index b29fd6b3..7094b636 100644 --- a/test/transform/resource/after-ecj/EqualsAndHashCodeCache.java +++ b/test/transform/resource/after-ecj/EqualsAndHashCodeCache.java @@ -1,5 +1,5 @@ @lombok.EqualsAndHashCode(cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode { - private transient @java.lang.SuppressWarnings("all") int $hashCodeCache = 0; + private transient @java.lang.SuppressWarnings("all") int $hashCodeCache; int x; boolean[] y; Object[] z; @@ -47,12 +47,14 @@ result = ((result * PRIME) + (($a == null) ? 43 : $a.hashCode())); final java.lang.Object $b = this.b; result = ((result * PRIME) + (($b == null) ? 43 : $b.hashCode())); - this.$hashCodeCache = ((result != 0) ? result : java.lang.Integer.MIN_VALUE); + if ((result == 0)) + result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } final @lombok.EqualsAndHashCode(cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode2 { - private transient @java.lang.SuppressWarnings("all") int $hashCodeCache = 0; + private transient @java.lang.SuppressWarnings("all") int $hashCodeCache; int x; long y; float f; @@ -91,12 +93,14 @@ final @lombok.EqualsAndHashCode(cacheStrategy = lombok.EqualsAndHashCode.CacheSt final long $d = java.lang.Double.doubleToLongBits(this.d); result = ((result * PRIME) + (int) ($d ^ ($d >>> 32))); result = ((result * PRIME) + (this.b ? 79 : 97)); - this.$hashCodeCache = ((result != 0) ? result : java.lang.Integer.MIN_VALUE); + if ((result == 0)) + result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } final @lombok.EqualsAndHashCode(callSuper = false,cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode3 extends EqualsAndHashCode { - private transient @java.lang.SuppressWarnings("all") int $hashCodeCache = 0; + private transient @java.lang.SuppressWarnings("all") int $hashCodeCache; EqualsAndHashCode3() { super(); } @@ -116,13 +120,15 @@ final @lombok.EqualsAndHashCode(callSuper = false,cacheStrategy = lombok.EqualsA public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() { if ((this.$hashCodeCache != 0)) return this.$hashCodeCache; - final int result = 1; - this.$hashCodeCache = ((result != 0) ? result : java.lang.Integer.MIN_VALUE); + int result = 1; + if ((result == 0)) + result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } @lombok.EqualsAndHashCode(callSuper = true,cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode4 extends EqualsAndHashCode { - private transient @java.lang.SuppressWarnings("all") int $hashCodeCache = 0; + private transient @java.lang.SuppressWarnings("all") int $hashCodeCache; EqualsAndHashCode4() { super(); } @@ -144,13 +150,15 @@ final @lombok.EqualsAndHashCode(callSuper = false,cacheStrategy = lombok.EqualsA public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() { if ((this.$hashCodeCache != 0)) return this.$hashCodeCache; - final int result = super.hashCode(); - this.$hashCodeCache = ((result != 0) ? result : java.lang.Integer.MIN_VALUE); + int result = super.hashCode(); + if ((result == 0)) + result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } final @lombok.EqualsAndHashCode(callSuper = true,cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode5 extends EqualsAndHashCode { - private transient @java.lang.SuppressWarnings("all") int $hashCodeCache = 0; + private transient @java.lang.SuppressWarnings("all") int $hashCodeCache; EqualsAndHashCode5() { super(); } @@ -172,8 +180,10 @@ final @lombok.EqualsAndHashCode(callSuper = true,cacheStrategy = lombok.EqualsAn public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() { if ((this.$hashCodeCache != 0)) return this.$hashCodeCache; - final int result = super.hashCode(); - this.$hashCodeCache = ((result != 0) ? result : java.lang.Integer.MIN_VALUE); + int result = super.hashCode(); + if ((result == 0)) + result = java.lang.Integer.MIN_VALUE; + this.$hashCodeCache = result; return result; } } -- cgit