From b439e4ce771813a12300c3006f9fcc12f25678d7 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Tue, 16 Jul 2019 01:24:18 +0200 Subject: [Fixes #2115] builder fields tracking a property that has a default set is now called `$value` in order to convey that you shouldnt manually mess with it. --- .../resource/after-delombok/BuilderDefaults.java | 20 ++++++++-------- .../after-delombok/BuilderDefaultsGenerics.java | 28 +++++++++++----------- .../ConstructorsWithBuilderDefaults.java | 12 +++++----- .../ConstructorsWithBuilderDefaults2.java | 20 ++++++++-------- .../after-delombok/SuperBuilderWithDefaults.java | 22 ++++++++--------- .../after-delombok/SuperBuilderWithNonNull.java | 8 +++---- .../resource/after-ecj/BuilderDefaults.java | 12 +++++----- .../after-ecj/BuilderDefaultsGenerics.java | 16 ++++++------- .../after-ecj/ConstructorsWithBuilderDefaults.java | 8 +++---- .../ConstructorsWithBuilderDefaults2.java | 12 +++++----- .../after-ecj/SuperBuilderWithDefaults.java | 22 ++++++++--------- .../after-ecj/SuperBuilderWithNonNull.java | 8 +++---- 12 files changed, 94 insertions(+), 94 deletions(-) (limited to 'test/transform') diff --git a/test/transform/resource/after-delombok/BuilderDefaults.java b/test/transform/resource/after-delombok/BuilderDefaults.java index b916b725..475b3f3c 100644 --- a/test/transform/resource/after-delombok/BuilderDefaults.java +++ b/test/transform/resource/after-delombok/BuilderDefaults.java @@ -21,19 +21,19 @@ public final class BuilderDefaults { @java.lang.SuppressWarnings("all") private boolean x$set; @java.lang.SuppressWarnings("all") - private int x; + private int x$value; @java.lang.SuppressWarnings("all") private String name; @java.lang.SuppressWarnings("all") private boolean z$set; @java.lang.SuppressWarnings("all") - private long z; + private long z$value; @java.lang.SuppressWarnings("all") BuilderDefaultsBuilder() { } @java.lang.SuppressWarnings("all") public BuilderDefaultsBuilder x(final int x) { - this.x = x; + this.x$value = x; x$set = true; return this; } @@ -44,22 +44,22 @@ public final class BuilderDefaults { } @java.lang.SuppressWarnings("all") public BuilderDefaultsBuilder z(final long z) { - this.z = z; + this.z$value = z; z$set = true; return this; } @java.lang.SuppressWarnings("all") public BuilderDefaults build() { - int x = this.x; - if (!x$set) x = BuilderDefaults.$default$x(); - long z = this.z; - if (!z$set) z = BuilderDefaults.$default$z(); - return new BuilderDefaults(x, name, z); + int x$value = this.x$value; + if (!x$set) x$value = BuilderDefaults.$default$x(); + long z$value = this.z$value; + if (!z$set) z$value = BuilderDefaults.$default$z(); + return new BuilderDefaults(x$value, name, z$value); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "BuilderDefaults.BuilderDefaultsBuilder(x=" + this.x + ", name=" + this.name + ", z=" + this.z + ")"; + return "BuilderDefaults.BuilderDefaultsBuilder(x$value=" + this.x$value + ", name=" + this.name + ", z$value=" + this.z$value + ")"; } } @java.lang.SuppressWarnings("all") diff --git a/test/transform/resource/after-delombok/BuilderDefaultsGenerics.java b/test/transform/resource/after-delombok/BuilderDefaultsGenerics.java index b88a61be..46fcd6b4 100644 --- a/test/transform/resource/after-delombok/BuilderDefaultsGenerics.java +++ b/test/transform/resource/after-delombok/BuilderDefaultsGenerics.java @@ -26,50 +26,50 @@ public class BuilderDefaultsGenerics> { @java.lang.SuppressWarnings("all") private boolean callable$set; @java.lang.SuppressWarnings("all") - private java.util.concurrent.Callable callable; + private java.util.concurrent.Callable callable$value; @java.lang.SuppressWarnings("all") private boolean tee$set; @java.lang.SuppressWarnings("all") - private T tee; + private T tee$value; @java.lang.SuppressWarnings("all") private boolean arrr$set; @java.lang.SuppressWarnings("all") - private R arrr; + private R arrr$value; @java.lang.SuppressWarnings("all") BuilderDefaultsGenericsBuilder() { } @java.lang.SuppressWarnings("all") public BuilderDefaultsGenericsBuilder callable(final java.util.concurrent.Callable callable) { - this.callable = callable; + this.callable$value = callable; callable$set = true; return this; } @java.lang.SuppressWarnings("all") public BuilderDefaultsGenericsBuilder tee(final T tee) { - this.tee = tee; + this.tee$value = tee; tee$set = true; return this; } @java.lang.SuppressWarnings("all") public BuilderDefaultsGenericsBuilder arrr(final R arrr) { - this.arrr = arrr; + this.arrr$value = arrr; arrr$set = true; return this; } @java.lang.SuppressWarnings("all") public BuilderDefaultsGenerics build() { - java.util.concurrent.Callable callable = this.callable; - if (!callable$set) callable = BuilderDefaultsGenerics.$default$callable(); - T tee = this.tee; - if (!tee$set) tee = BuilderDefaultsGenerics.$default$tee(); - R arrr = this.arrr; - if (!arrr$set) arrr = BuilderDefaultsGenerics.$default$arrr(); - return new BuilderDefaultsGenerics(callable, tee, arrr); + java.util.concurrent.Callable callable$value = this.callable$value; + if (!callable$set) callable$value = BuilderDefaultsGenerics.$default$callable(); + T tee$value = this.tee$value; + if (!tee$set) tee$value = BuilderDefaultsGenerics.$default$tee(); + R arrr$value = this.arrr$value; + if (!arrr$set) arrr$value = BuilderDefaultsGenerics.$default$arrr(); + return new BuilderDefaultsGenerics(callable$value, tee$value, arrr$value); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder(callable=" + this.callable + ", tee=" + this.tee + ", arrr=" + this.arrr + ")"; + return "BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder(callable$value=" + this.callable$value + ", tee$value=" + this.tee$value + ", arrr$value=" + this.arrr$value + ")"; } } @java.lang.SuppressWarnings("all") diff --git a/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults.java b/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults.java index 91f5b8be..f37c68af 100644 --- a/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults.java +++ b/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults.java @@ -10,7 +10,7 @@ final class ConstructorsWithBuilderDefaults { @java.lang.SuppressWarnings("all") private boolean x$set; @java.lang.SuppressWarnings("all") - private int x; + private int x$value; @java.lang.SuppressWarnings("all") private int y; @java.lang.SuppressWarnings("all") @@ -18,7 +18,7 @@ final class ConstructorsWithBuilderDefaults { } @java.lang.SuppressWarnings("all") public ConstructorsWithBuilderDefaultsBuilder x(final int x) { - this.x = x; + this.x$value = x; x$set = true; return this; } @@ -29,14 +29,14 @@ final class ConstructorsWithBuilderDefaults { } @java.lang.SuppressWarnings("all") public ConstructorsWithBuilderDefaults build() { - int x = this.x; - if (!x$set) x = ConstructorsWithBuilderDefaults.$default$x(); - return new ConstructorsWithBuilderDefaults(x, y); + int x$value = this.x$value; + if (!x$set) x$value = ConstructorsWithBuilderDefaults.$default$x(); + return new ConstructorsWithBuilderDefaults(x$value, y); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(x=" + this.x + ", y=" + this.y + ")"; + return "ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(x$value=" + this.x$value + ", y=" + this.y + ")"; } } @java.lang.SuppressWarnings("all") diff --git a/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults2.java b/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults2.java index 8a9c9b48..7816b0c8 100644 --- a/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults2.java +++ b/test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults2.java @@ -23,11 +23,11 @@ final class ConstructorsWithBuilderDefaults { @java.lang.SuppressWarnings("all") private boolean z$set; @java.lang.SuppressWarnings("all") - private java.util.List z; + private java.util.List z$value; @java.lang.SuppressWarnings("all") private boolean x$set; @java.lang.SuppressWarnings("all") - private T x; + private T x$value; @java.lang.SuppressWarnings("all") private T q; @java.lang.SuppressWarnings("all") @@ -35,13 +35,13 @@ final class ConstructorsWithBuilderDefaults { } @java.lang.SuppressWarnings("all") public ConstructorsWithBuilderDefaultsBuilder z(final java.util.List z) { - this.z = z; + this.z$value = z; z$set = true; return this; } @java.lang.SuppressWarnings("all") public ConstructorsWithBuilderDefaultsBuilder x(final T x) { - this.x = x; + this.x$value = x; x$set = true; return this; } @@ -53,16 +53,16 @@ final class ConstructorsWithBuilderDefaults { @java.lang.SuppressWarnings("all") public ConstructorsWithBuilderDefaults build() { - java.util.List z = this.z; - if (!z$set) z = ConstructorsWithBuilderDefaults.$default$z(); - T x = this.x; - if (!x$set) x = ConstructorsWithBuilderDefaults.$default$x(); - return new ConstructorsWithBuilderDefaults(z, x, q); + java.util.List z$value = this.z$value; + if (!z$set) z$value = ConstructorsWithBuilderDefaults.$default$z(); + T x$value = this.x$value; + if (!x$set) x$value = ConstructorsWithBuilderDefaults.$default$x(); + return new ConstructorsWithBuilderDefaults(z$value, x$value, q); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(z=" + this.z + ", x=" + this.x + ", q=" + this.q + ")"; + return "ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(z$value=" + this.z$value + ", x$value=" + this.x$value + ", q=" + this.q + ")"; } } @java.lang.SuppressWarnings("all") diff --git a/test/transform/resource/after-delombok/SuperBuilderWithDefaults.java b/test/transform/resource/after-delombok/SuperBuilderWithDefaults.java index 842b7e55..2ac3d1b7 100644 --- a/test/transform/resource/after-delombok/SuperBuilderWithDefaults.java +++ b/test/transform/resource/after-delombok/SuperBuilderWithDefaults.java @@ -16,31 +16,31 @@ public class SuperBuilderWithDefaults { @java.lang.SuppressWarnings("all") private boolean millis$set; @java.lang.SuppressWarnings("all") - private long millis; + private long millis$value; @java.lang.SuppressWarnings("all") private boolean numberField$set; @java.lang.SuppressWarnings("all") - private N numberField; + private N numberField$value; @java.lang.SuppressWarnings("all") protected abstract B self(); @java.lang.SuppressWarnings("all") public abstract C build(); @java.lang.SuppressWarnings("all") public B millis(final long millis) { - this.millis = millis; + this.millis$value = millis; millis$set = true; return self(); } @java.lang.SuppressWarnings("all") public B numberField(final N numberField) { - this.numberField = numberField; + this.numberField$value = numberField; numberField$set = true; return self(); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "SuperBuilderWithDefaults.Parent.ParentBuilder(millis=" + this.millis + ", numberField=" + this.numberField + ")"; + return "SuperBuilderWithDefaults.Parent.ParentBuilder(millis$value=" + this.millis$value + ", numberField$value=" + this.numberField$value + ")"; } } @java.lang.SuppressWarnings("all") @@ -61,9 +61,9 @@ public class SuperBuilderWithDefaults { } @java.lang.SuppressWarnings("all") protected Parent(final ParentBuilder b) { - if (b.millis$set) this.millis = b.millis; + if (b.millis$set) this.millis = b.millis$value; else this.millis = Parent.$default$millis(); - if (b.numberField$set) this.numberField = b.numberField; + if (b.numberField$set) this.numberField = b.numberField$value; else this.numberField = Parent.$default$numberField(); } @java.lang.SuppressWarnings("all") @@ -82,7 +82,7 @@ public class SuperBuilderWithDefaults { @java.lang.SuppressWarnings("all") private boolean doubleField$set; @java.lang.SuppressWarnings("all") - private double doubleField; + private double doubleField$value; @java.lang.Override @java.lang.SuppressWarnings("all") protected abstract B self(); @@ -91,14 +91,14 @@ public class SuperBuilderWithDefaults { public abstract C build(); @java.lang.SuppressWarnings("all") public B doubleField(final double doubleField) { - this.doubleField = doubleField; + this.doubleField$value = doubleField; doubleField$set = true; return self(); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "SuperBuilderWithDefaults.Child.ChildBuilder(super=" + super.toString() + ", doubleField=" + this.doubleField + ")"; + return "SuperBuilderWithDefaults.Child.ChildBuilder(super=" + super.toString() + ", doubleField$value=" + this.doubleField$value + ")"; } } @java.lang.SuppressWarnings("all") @@ -120,7 +120,7 @@ public class SuperBuilderWithDefaults { @java.lang.SuppressWarnings("all") protected Child(final ChildBuilder b) { super(b); - if (b.doubleField$set) this.doubleField = b.doubleField; + if (b.doubleField$set) this.doubleField = b.doubleField$value; else this.doubleField = Child.$default$doubleField(); } @java.lang.SuppressWarnings("all") diff --git a/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java b/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java index ce5c838c..52328780 100644 --- a/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java +++ b/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java @@ -12,7 +12,7 @@ public class SuperBuilderWithNonNull { @java.lang.SuppressWarnings("all") private boolean nonNullParentField$set; @java.lang.SuppressWarnings("all") - private String nonNullParentField; + private String nonNullParentField$value; @java.lang.SuppressWarnings("all") protected abstract B self(); @java.lang.SuppressWarnings("all") @@ -22,14 +22,14 @@ public class SuperBuilderWithNonNull { if (nonNullParentField == null) { throw new java.lang.NullPointerException("nonNullParentField is marked non-null but is null"); } - this.nonNullParentField = nonNullParentField; + this.nonNullParentField$value = nonNullParentField; nonNullParentField$set = true; return self(); } @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "SuperBuilderWithNonNull.Parent.ParentBuilder(nonNullParentField=" + this.nonNullParentField + ")"; + return "SuperBuilderWithNonNull.Parent.ParentBuilder(nonNullParentField$value=" + this.nonNullParentField$value + ")"; } } @java.lang.SuppressWarnings("all") @@ -50,7 +50,7 @@ public class SuperBuilderWithNonNull { } @java.lang.SuppressWarnings("all") protected Parent(final ParentBuilder b) { - if (b.nonNullParentField$set) this.nonNullParentField = b.nonNullParentField; + if (b.nonNullParentField$set) this.nonNullParentField = b.nonNullParentField$value; else this.nonNullParentField = Parent.$default$nonNullParentField(); if (nonNullParentField == null) { throw new java.lang.NullPointerException("nonNullParentField is marked non-null but is null"); diff --git a/test/transform/resource/after-ecj/BuilderDefaults.java b/test/transform/resource/after-ecj/BuilderDefaults.java index 1a0f1168..b9588386 100644 --- a/test/transform/resource/after-ecj/BuilderDefaults.java +++ b/test/transform/resource/after-ecj/BuilderDefaults.java @@ -2,16 +2,16 @@ import lombok.Builder; import lombok.Value; public final @Value @Builder class BuilderDefaults { public static @java.lang.SuppressWarnings("all") class BuilderDefaultsBuilder { - private @java.lang.SuppressWarnings("all") int x; + private @java.lang.SuppressWarnings("all") int x$value; private @java.lang.SuppressWarnings("all") boolean x$set; private @java.lang.SuppressWarnings("all") String name; - private @java.lang.SuppressWarnings("all") long z; + private @java.lang.SuppressWarnings("all") long z$value; private @java.lang.SuppressWarnings("all") boolean z$set; @java.lang.SuppressWarnings("all") BuilderDefaultsBuilder() { super(); } public @java.lang.SuppressWarnings("all") BuilderDefaultsBuilder x(final int x) { - this.x = x; + this.x$value = x; x$set = true; return this; } @@ -20,15 +20,15 @@ public final @Value @Builder class BuilderDefaults { return this; } public @java.lang.SuppressWarnings("all") BuilderDefaultsBuilder z(final long z) { - this.z = z; + this.z$value = z; z$set = true; return this; } public @java.lang.SuppressWarnings("all") BuilderDefaults build() { - return new BuilderDefaults((x$set ? x : BuilderDefaults.$default$x()), name, (z$set ? z : BuilderDefaults.$default$z())); + return new BuilderDefaults((x$set ? x$value : BuilderDefaults.$default$x()), name, (z$set ? z$value : BuilderDefaults.$default$z())); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (((((("BuilderDefaults.BuilderDefaultsBuilder(x=" + this.x) + ", name=") + this.name) + ", z=") + this.z) + ")"); + return (((((("BuilderDefaults.BuilderDefaultsBuilder(x$value=" + this.x$value) + ", name=") + this.name) + ", z$value=") + this.z$value) + ")"); } } private final @Builder.Default int x; diff --git a/test/transform/resource/after-ecj/BuilderDefaultsGenerics.java b/test/transform/resource/after-ecj/BuilderDefaultsGenerics.java index a8f81afa..8f9da4b3 100644 --- a/test/transform/resource/after-ecj/BuilderDefaultsGenerics.java +++ b/test/transform/resource/after-ecj/BuilderDefaultsGenerics.java @@ -2,35 +2,35 @@ import lombok.Builder; import java.util.*; public @Builder class BuilderDefaultsGenerics> { public static @java.lang.SuppressWarnings("all") class BuilderDefaultsGenericsBuilder> { - private @java.lang.SuppressWarnings("all") java.util.concurrent.Callable callable; + private @java.lang.SuppressWarnings("all") java.util.concurrent.Callable callable$value; private @java.lang.SuppressWarnings("all") boolean callable$set; - private @java.lang.SuppressWarnings("all") T tee; + private @java.lang.SuppressWarnings("all") T tee$value; private @java.lang.SuppressWarnings("all") boolean tee$set; - private @java.lang.SuppressWarnings("all") R arrr; + private @java.lang.SuppressWarnings("all") R arrr$value; private @java.lang.SuppressWarnings("all") boolean arrr$set; @java.lang.SuppressWarnings("all") BuilderDefaultsGenericsBuilder() { super(); } public @java.lang.SuppressWarnings("all") BuilderDefaultsGenericsBuilder callable(final java.util.concurrent.Callable callable) { - this.callable = callable; + this.callable$value = callable; callable$set = true; return this; } public @java.lang.SuppressWarnings("all") BuilderDefaultsGenericsBuilder tee(final T tee) { - this.tee = tee; + this.tee$value = tee; tee$set = true; return this; } public @java.lang.SuppressWarnings("all") BuilderDefaultsGenericsBuilder arrr(final R arrr) { - this.arrr = arrr; + this.arrr$value = arrr; arrr$set = true; return this; } public @java.lang.SuppressWarnings("all") BuilderDefaultsGenerics build() { - return new BuilderDefaultsGenerics((callable$set ? callable : BuilderDefaultsGenerics.$default$callable()), (tee$set ? tee : BuilderDefaultsGenerics.$default$tee()), (arrr$set ? arrr : BuilderDefaultsGenerics.$default$arrr())); + return new BuilderDefaultsGenerics((callable$set ? callable$value : BuilderDefaultsGenerics.$default$callable()), (tee$set ? tee$value : BuilderDefaultsGenerics.$default$tee()), (arrr$set ? arrr$value : BuilderDefaultsGenerics.$default$arrr())); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (((((("BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder(callable=" + this.callable) + ", tee=") + this.tee) + ", arrr=") + this.arrr) + ")"); + return (((((("BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder(callable$value=" + this.callable$value) + ", tee$value=") + this.tee$value) + ", arrr$value=") + this.arrr$value) + ")"); } } private @Builder.Default java.util.concurrent.Callable callable; diff --git a/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults.java b/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults.java index 9d4c42c1..fd860c69 100644 --- a/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults.java +++ b/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults.java @@ -4,14 +4,14 @@ import lombok.Value; import lombok.Builder; final @NoArgsConstructor(force = true) @AllArgsConstructor @Builder @Value class ConstructorsWithBuilderDefaults { public static @java.lang.SuppressWarnings("all") class ConstructorsWithBuilderDefaultsBuilder { - private @java.lang.SuppressWarnings("all") int x; + private @java.lang.SuppressWarnings("all") int x$value; private @java.lang.SuppressWarnings("all") boolean x$set; private @java.lang.SuppressWarnings("all") int y; @java.lang.SuppressWarnings("all") ConstructorsWithBuilderDefaultsBuilder() { super(); } public @java.lang.SuppressWarnings("all") ConstructorsWithBuilderDefaultsBuilder x(final int x) { - this.x = x; + this.x$value = x; x$set = true; return this; } @@ -20,10 +20,10 @@ final @NoArgsConstructor(force = true) @AllArgsConstructor @Builder @Value class return this; } public @java.lang.SuppressWarnings("all") ConstructorsWithBuilderDefaults build() { - return new ConstructorsWithBuilderDefaults((x$set ? x : ConstructorsWithBuilderDefaults.$default$x()), y); + return new ConstructorsWithBuilderDefaults((x$set ? x$value : ConstructorsWithBuilderDefaults.$default$x()), y); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (((("ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(x=" + this.x) + ", y=") + this.y) + ")"); + return (((("ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(x$value=" + this.x$value) + ", y=") + this.y) + ")"); } } private final @Builder.Default int x; diff --git a/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults2.java b/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults2.java index cc96c674..776899fb 100644 --- a/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults2.java +++ b/test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults2.java @@ -3,21 +3,21 @@ import lombok.Value; import lombok.Builder; final @Builder @Value class ConstructorsWithBuilderDefaults { public static @java.lang.SuppressWarnings("all") class ConstructorsWithBuilderDefaultsBuilder { - private @java.lang.SuppressWarnings("all") java.util.List z; + private @java.lang.SuppressWarnings("all") java.util.List z$value; private @java.lang.SuppressWarnings("all") boolean z$set; - private @java.lang.SuppressWarnings("all") T x; + private @java.lang.SuppressWarnings("all") T x$value; private @java.lang.SuppressWarnings("all") boolean x$set; private @java.lang.SuppressWarnings("all") T q; @java.lang.SuppressWarnings("all") ConstructorsWithBuilderDefaultsBuilder() { super(); } public @java.lang.SuppressWarnings("all") ConstructorsWithBuilderDefaultsBuilder z(final java.util.List z) { - this.z = z; + this.z$value = z; z$set = true; return this; } public @java.lang.SuppressWarnings("all") ConstructorsWithBuilderDefaultsBuilder x(final T x) { - this.x = x; + this.x$value = x; x$set = true; return this; } @@ -26,10 +26,10 @@ final @Builder @Value class ConstructorsWithBuilderDefaults { return this; } public @java.lang.SuppressWarnings("all") ConstructorsWithBuilderDefaults build() { - return new ConstructorsWithBuilderDefaults((z$set ? z : ConstructorsWithBuilderDefaults.$default$z()), (x$set ? x : ConstructorsWithBuilderDefaults.$default$x()), q); + return new ConstructorsWithBuilderDefaults((z$set ? z$value : ConstructorsWithBuilderDefaults.$default$z()), (x$set ? x$value : ConstructorsWithBuilderDefaults.$default$x()), q); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (((((("ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(z=" + this.z) + ", x=") + this.x) + ", q=") + this.q) + ")"); + return (((((("ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(z$value=" + this.z$value) + ", x$value=") + this.x$value) + ", q=") + this.q) + ")"); } } private final @Builder.Default java.util.List z; diff --git a/test/transform/resource/after-ecj/SuperBuilderWithDefaults.java b/test/transform/resource/after-ecj/SuperBuilderWithDefaults.java index e259b68d..ff1b5931 100644 --- a/test/transform/resource/after-ecj/SuperBuilderWithDefaults.java +++ b/test/transform/resource/after-ecj/SuperBuilderWithDefaults.java @@ -2,9 +2,9 @@ import java.util.List; public class SuperBuilderWithDefaults { public static @lombok.experimental.SuperBuilder class Parent { public static abstract @java.lang.SuppressWarnings("all") class ParentBuilder, B extends ParentBuilder> { - private @java.lang.SuppressWarnings("all") long millis; + private @java.lang.SuppressWarnings("all") long millis$value; private @java.lang.SuppressWarnings("all") boolean millis$set; - private @java.lang.SuppressWarnings("all") N numberField; + private @java.lang.SuppressWarnings("all") N numberField$value; private @java.lang.SuppressWarnings("all") boolean numberField$set; public ParentBuilder() { super(); @@ -12,17 +12,17 @@ public class SuperBuilderWithDefaults { protected abstract @java.lang.SuppressWarnings("all") B self(); public abstract @java.lang.SuppressWarnings("all") C build(); public @java.lang.SuppressWarnings("all") B millis(final long millis) { - this.millis = millis; + this.millis$value = millis; millis$set = true; return self(); } public @java.lang.SuppressWarnings("all") B numberField(final N numberField) { - this.numberField = numberField; + this.numberField$value = numberField; numberField$set = true; return self(); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (((("SuperBuilderWithDefaults.Parent.ParentBuilder(millis=" + this.millis) + ", numberField=") + this.numberField) + ")"); + return (((("SuperBuilderWithDefaults.Parent.ParentBuilder(millis$value=" + this.millis$value) + ", numberField$value=") + this.numberField$value) + ")"); } } private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl extends ParentBuilder, ParentBuilderImpl> { @@ -47,11 +47,11 @@ public class SuperBuilderWithDefaults { protected @java.lang.SuppressWarnings("all") Parent(final ParentBuilder b) { super(); if (b.millis$set) - this.millis = b.millis; + this.millis = b.millis$value; else this.millis = Parent.$default$millis(); if (b.numberField$set) - this.numberField = b.numberField; + this.numberField = b.numberField$value; else this.numberField = Parent.$default$numberField(); } @@ -61,7 +61,7 @@ public class SuperBuilderWithDefaults { } public static @lombok.experimental.SuperBuilder class Child extends Parent { public static abstract @java.lang.SuppressWarnings("all") class ChildBuilder> extends Parent.ParentBuilder { - private @java.lang.SuppressWarnings("all") double doubleField; + private @java.lang.SuppressWarnings("all") double doubleField$value; private @java.lang.SuppressWarnings("all") boolean doubleField$set; public ChildBuilder() { super(); @@ -69,12 +69,12 @@ public class SuperBuilderWithDefaults { protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B self(); public abstract @java.lang.Override @java.lang.SuppressWarnings("all") C build(); public @java.lang.SuppressWarnings("all") B doubleField(final double doubleField) { - this.doubleField = doubleField; + this.doubleField$value = doubleField; doubleField$set = true; return self(); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (((("SuperBuilderWithDefaults.Child.ChildBuilder(super=" + super.toString()) + ", doubleField=") + this.doubleField) + ")"); + return (((("SuperBuilderWithDefaults.Child.ChildBuilder(super=" + super.toString()) + ", doubleField$value=") + this.doubleField$value) + ")"); } } private static final @java.lang.SuppressWarnings("all") class ChildBuilderImpl extends ChildBuilder { @@ -95,7 +95,7 @@ public class SuperBuilderWithDefaults { protected @java.lang.SuppressWarnings("all") Child(final ChildBuilder b) { super(b); if (b.doubleField$set) - this.doubleField = b.doubleField; + this.doubleField = b.doubleField$value; else this.doubleField = Child.$default$doubleField(); } diff --git a/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java b/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java index 616d7083..31198ee1 100644 --- a/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java +++ b/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java @@ -2,7 +2,7 @@ import java.util.List; public class SuperBuilderWithNonNull { public static @lombok.experimental.SuperBuilder class Parent { public static abstract @java.lang.SuppressWarnings("all") class ParentBuilder> { - private @java.lang.SuppressWarnings("all") String nonNullParentField; + private @java.lang.SuppressWarnings("all") String nonNullParentField$value; private @java.lang.SuppressWarnings("all") boolean nonNullParentField$set; public ParentBuilder() { super(); @@ -14,12 +14,12 @@ public class SuperBuilderWithNonNull { { throw new java.lang.NullPointerException("nonNullParentField is marked non-null but is null"); } - this.nonNullParentField = nonNullParentField; + this.nonNullParentField$value = nonNullParentField; nonNullParentField$set = true; return self(); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (("SuperBuilderWithNonNull.Parent.ParentBuilder(nonNullParentField=" + this.nonNullParentField) + ")"); + return (("SuperBuilderWithNonNull.Parent.ParentBuilder(nonNullParentField$value=" + this.nonNullParentField$value) + ")"); } } private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl extends ParentBuilder { @@ -40,7 +40,7 @@ public class SuperBuilderWithNonNull { protected @java.lang.SuppressWarnings("all") Parent(final ParentBuilder b) { super(); if (b.nonNullParentField$set) - this.nonNullParentField = b.nonNullParentField; + this.nonNullParentField = b.nonNullParentField$value; else this.nonNullParentField = Parent.$default$nonNullParentField(); if ((nonNullParentField == null)) -- cgit From e1d1415d6e147edacaa50d8954737a168fbdafb5 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Tue, 16 Jul 2019 01:50:16 +0200 Subject: [fixes #2168] Added JsonSetter as a copyable annotation --- src/core/lombok/core/handlers/HandlerUtil.java | 1 + test/stubs/com/fasterxml/jackson/annotation/JsonSetter.java | 12 ++++++++++++ test/stubs/com/fasterxml/jackson/annotation/Nulls.java | 5 +++++ .../resource/after-delombok/JacksonJsonProperty.java | 5 +++++ test/transform/resource/after-ecj/JacksonJsonProperty.java | 8 +++++--- test/transform/resource/before/JacksonJsonProperty.java | 3 +++ 6 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 test/stubs/com/fasterxml/jackson/annotation/JsonSetter.java create mode 100644 test/stubs/com/fasterxml/jackson/annotation/Nulls.java (limited to 'test/transform') diff --git a/src/core/lombok/core/handlers/HandlerUtil.java b/src/core/lombok/core/handlers/HandlerUtil.java index 6e28f65d..21a3a216 100644 --- a/src/core/lombok/core/handlers/HandlerUtil.java +++ b/src/core/lombok/core/handlers/HandlerUtil.java @@ -302,6 +302,7 @@ public class HandlerUtil { })); COPY_TO_SETTER_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(new String[] { "com.fasterxml.jackson.annotation.JsonProperty", + "com.fasterxml.jackson.annotation.JsonSetter", })); } diff --git a/test/stubs/com/fasterxml/jackson/annotation/JsonSetter.java b/test/stubs/com/fasterxml/jackson/annotation/JsonSetter.java new file mode 100644 index 00000000..2886a6f4 --- /dev/null +++ b/test/stubs/com/fasterxml/jackson/annotation/JsonSetter.java @@ -0,0 +1,12 @@ +package com.fasterxml.jackson.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface JsonSetter { + Nulls nulls(); +} diff --git a/test/stubs/com/fasterxml/jackson/annotation/Nulls.java b/test/stubs/com/fasterxml/jackson/annotation/Nulls.java new file mode 100644 index 00000000..d40bd46d --- /dev/null +++ b/test/stubs/com/fasterxml/jackson/annotation/Nulls.java @@ -0,0 +1,5 @@ +package com.fasterxml.jackson.annotation; + +public enum Nulls { + SKIP; +} diff --git a/test/transform/resource/after-delombok/JacksonJsonProperty.java b/test/transform/resource/after-delombok/JacksonJsonProperty.java index 842ba298..16a8039e 100644 --- a/test/transform/resource/after-delombok/JacksonJsonProperty.java +++ b/test/transform/resource/after-delombok/JacksonJsonProperty.java @@ -1,6 +1,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; public class JacksonJsonProperty { @JsonProperty("kebab-case-prop") + @JsonSetter(nulls = Nulls.SKIP) public String kebabCaseProp; @java.lang.SuppressWarnings("all") JacksonJsonProperty(final String kebabCaseProp) { @@ -14,6 +17,7 @@ public class JacksonJsonProperty { JacksonJsonPropertyBuilder() { } @JsonProperty("kebab-case-prop") + @JsonSetter(nulls = Nulls.SKIP) @java.lang.SuppressWarnings("all") public JacksonJsonPropertyBuilder kebabCaseProp(final String kebabCaseProp) { this.kebabCaseProp = kebabCaseProp; @@ -34,6 +38,7 @@ public class JacksonJsonProperty { return new JacksonJsonPropertyBuilder(); } @JsonProperty("kebab-case-prop") + @JsonSetter(nulls = Nulls.SKIP) @java.lang.SuppressWarnings("all") public void setKebabCaseProp(final String kebabCaseProp) { this.kebabCaseProp = kebabCaseProp; diff --git a/test/transform/resource/after-ecj/JacksonJsonProperty.java b/test/transform/resource/after-ecj/JacksonJsonProperty.java index 73049b2a..c0485251 100644 --- a/test/transform/resource/after-ecj/JacksonJsonProperty.java +++ b/test/transform/resource/after-ecj/JacksonJsonProperty.java @@ -1,4 +1,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import lombok.Builder; import lombok.Setter; public @Builder class JacksonJsonProperty { @@ -7,7 +9,7 @@ public @Builder class JacksonJsonProperty { @java.lang.SuppressWarnings("all") JacksonJsonPropertyBuilder() { super(); } - public @JsonProperty("kebab-case-prop") @java.lang.SuppressWarnings("all") JacksonJsonPropertyBuilder kebabCaseProp(final String kebabCaseProp) { + public @JsonProperty("kebab-case-prop") @JsonSetter(nulls = Nulls.SKIP) @java.lang.SuppressWarnings("all") JacksonJsonPropertyBuilder kebabCaseProp(final String kebabCaseProp) { this.kebabCaseProp = kebabCaseProp; return this; } @@ -18,7 +20,7 @@ public @Builder class JacksonJsonProperty { return (("JacksonJsonProperty.JacksonJsonPropertyBuilder(kebabCaseProp=" + this.kebabCaseProp) + ")"); } } - public @JsonProperty("kebab-case-prop") @Setter String kebabCaseProp; + public @JsonProperty("kebab-case-prop") @JsonSetter(nulls = Nulls.SKIP) @Setter String kebabCaseProp; @java.lang.SuppressWarnings("all") JacksonJsonProperty(final String kebabCaseProp) { super(); this.kebabCaseProp = kebabCaseProp; @@ -26,7 +28,7 @@ public @Builder class JacksonJsonProperty { public static @java.lang.SuppressWarnings("all") JacksonJsonPropertyBuilder builder() { return new JacksonJsonPropertyBuilder(); } - public @JsonProperty("kebab-case-prop") @java.lang.SuppressWarnings("all") void setKebabCaseProp(final String kebabCaseProp) { + public @JsonProperty("kebab-case-prop") @JsonSetter(nulls = Nulls.SKIP) @java.lang.SuppressWarnings("all") void setKebabCaseProp(final String kebabCaseProp) { this.kebabCaseProp = kebabCaseProp; } } \ No newline at end of file diff --git a/test/transform/resource/before/JacksonJsonProperty.java b/test/transform/resource/before/JacksonJsonProperty.java index f002dc48..f0b7b2f2 100644 --- a/test/transform/resource/before/JacksonJsonProperty.java +++ b/test/transform/resource/before/JacksonJsonProperty.java @@ -1,10 +1,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import lombok.Builder; import lombok.Setter; @Builder public class JacksonJsonProperty { @JsonProperty("kebab-case-prop") + @JsonSetter(nulls = Nulls.SKIP) @Setter public String kebabCaseProp; } -- cgit From aa80e1baf92f3327383b36466a771e92d8a91b05 Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Tue, 16 Jul 2019 02:04:11 +0200 Subject: Fixes #1197, add Objects.requireNonNull and Preconditions.checkkNotNull to supported null-check styles --- doc/changelog.markdown | 2 + .../core/configuration/NullCheckExceptionType.java | 38 ++++++++++- .../eclipse/handlers/EclipseHandlerUtil.java | 79 ++++++++++++++-------- .../lombok/eclipse/handlers/HandleNonNull.java | 22 +++++- src/core/lombok/javac/handlers/HandleNonNull.java | 32 ++++++++- .../lombok/javac/handlers/JavacHandlerUtil.java | 6 ++ .../resource/after-delombok/NonNullWithGuava.java | 35 ++++++++++ .../resource/after-delombok/NonNullWithJdk.java | 36 ++++++++++ .../resource/after-ecj/NonNullWithGuava.java | 36 ++++++++++ .../resource/after-ecj/NonNullWithJdk.java | 37 ++++++++++ .../resource/before/NonNullWithGuava.java | 33 +++++++++ test/transform/resource/before/NonNullWithJdk.java | 34 ++++++++++ 12 files changed, 356 insertions(+), 34 deletions(-) create mode 100644 test/transform/resource/after-delombok/NonNullWithGuava.java create mode 100644 test/transform/resource/after-delombok/NonNullWithJdk.java create mode 100644 test/transform/resource/after-ecj/NonNullWithGuava.java create mode 100644 test/transform/resource/after-ecj/NonNullWithJdk.java create mode 100644 test/transform/resource/before/NonNullWithGuava.java create mode 100644 test/transform/resource/before/NonNullWithJdk.java (limited to 'test/transform') diff --git a/doc/changelog.markdown b/doc/changelog.markdown index 0c6bc584..0e489dd3 100644 --- a/doc/changelog.markdown +++ b/doc/changelog.markdown @@ -7,11 +7,13 @@ Lombok Changelog * ENHANCEMENT: `val` is now capable of decoding the type of convoluted expressions (particularly if the right hand side involves lambdas and conditional (ternary) expressions). [Pull Request #2109](https://github.com/rzwitserloot/lombok/pull/2109) and [Pull Request #2138](https://github.com/rzwitserloot/lombok/pull/2138) with thanks to Alexander Bulgakov. * ENHANCEMENT: You can now configure the generated builder class name via the config system, using key `lombok.builder.className`. See the [Builder documentation](https://projectlombok.org/features/Builder) and [SuperBuilder documentation](https://projectlombok.org/features/experimental/SuperBuilder) * ENHANCEMENT: If you mix up eclipse's non-null support, such as `@NonNullByDefault`, with lombok's `@NonNull`, you get a bunch of warnings about dead code that are inappropriate. These warnings are now suppressed, thanks to a contribution from Till Brychcy! [Pull Request #2155](https://github.com/rzwitserloot/lombok/pull/2155) +* ENHANCEMENT: `@NonNull` can now also generate checks using jdk's `Objects.requireNonNull` or Guava's `Preconditions.checkNotNull`. [Issue #1197](https://github.com/rzwitserloot/lombok/issues/1197) * BUGFIX: Delombok would turn something like `List...` in a method parameter to `List...` [Issue #2140](https://github.com/rzwitserloot/lombok/issues/2140) * BUGFIX: Javac would generate the wrong equals and hashCode if a type-use annotation was put on an array type field [Issue #2165](https://github.com/rzwitserloot/lombok/issues/2165) * BUGFIX: Eclipse 2019-06 + JDK-12 compatibility + an `@Singular` builder entry would produce a cascade of error dialogs. [Issue #2169](https://github.com/rzwitserloot/lombok/issues/2169) * IMPROBABLE BREAKING CHANGE: Stricter validation of configuration keys dealing with identifiers and types (`lombok.log.fieldName`, `lombok.fieldNameConstants.innerTypeName`, `lombok.copyableAnnotations`). * IMPROBABLE BREAKING CHANGE: The fields generated inside builders for fields with defaults (with `@Builder` on a class with fields marked `@Default`) now have `$value` as the name; direct manipulation of these fields is not advised because there is an associated `$set` variable that also needs to be taken into account. [Issue #2115](https://github.com/rzwitserloot/lombok/issues/2115) + ### v1.18.8 (May 7th, 2019) * FEATURE: You can now configure `@FieldNameConstants` to `CONSTANT_CASE` the generated constants, using a `lombok.config` option. See the [FieldNameConstants documentation](https://projectlombok.org/features/experimental/FieldNameConstants). [Issue #2092](https://github.com/rzwitserloot/lombok/issues/2092). * FEATURE: You can now suppress generation of the `builder` method when using `@Builder`; usually because you're only interested in the `toBuilder` method. As a convenience we won't emit warnings about missing `@Builder.Default` annotations when you do this. [Issue #2046](https://github.com/rzwitserloot/lombok/issues/2046) diff --git a/src/core/lombok/core/configuration/NullCheckExceptionType.java b/src/core/lombok/core/configuration/NullCheckExceptionType.java index d226c0a8..3c9e325d 100644 --- a/src/core/lombok/core/configuration/NullCheckExceptionType.java +++ b/src/core/lombok/core/configuration/NullCheckExceptionType.java @@ -21,28 +21,64 @@ */ package lombok.core.configuration; +import lombok.core.LombokImmutableList; -@ExampleValueString("[NullPointerException | IllegalArgumentException | Assertion]") +@ExampleValueString("[NullPointerException | IllegalArgumentException | Assertion | JDK | GUAVA]") public enum NullCheckExceptionType { ILLEGAL_ARGUMENT_EXCEPTION { @Override public String getExceptionType() { return "java.lang.IllegalArgumentException"; } + + @Override public LombokImmutableList getMethod() { + return null; + } }, NULL_POINTER_EXCEPTION { @Override public String getExceptionType() { return "java.lang.NullPointerException"; } + + @Override public LombokImmutableList getMethod() { + return null; + } }, ASSERTION { @Override public String getExceptionType() { return null; } + + @Override public LombokImmutableList getMethod() { + return null; + } + }, + JDK { + @Override public String getExceptionType() { + return null; + } + + @Override public LombokImmutableList getMethod() { + return METHOD_JDK; + } + }, + GUAVA { + @Override public String getExceptionType() { + return null; + } + + @Override public LombokImmutableList getMethod() { + return METHOD_GUAVA; + } }; + private static final LombokImmutableList METHOD_JDK = LombokImmutableList.of("java", "util", "Objects", "requireNonNull"); + private static final LombokImmutableList METHOD_GUAVA = LombokImmutableList.of("com", "google", "common", "base", "Preconditions", "checkNotNull"); + public String toExceptionMessage(String fieldName) { return fieldName + " is marked non-null but is null"; } public abstract String getExceptionType(); + + public abstract LombokImmutableList getMethod(); } diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java index 37976ae3..11a2b9bd 100644 --- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java +++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java @@ -38,26 +38,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import lombok.AccessLevel; -import lombok.ConfigurationKeys; -import lombok.Data; -import lombok.Getter; -import lombok.Lombok; -import lombok.core.AST.Kind; -import lombok.core.AnnotationValues; -import lombok.core.AnnotationValues.AnnotationValue; -import lombok.core.TypeResolver; -import lombok.core.configuration.NullCheckExceptionType; -import lombok.core.configuration.TypeName; -import lombok.core.debug.ProblemReporter; -import lombok.core.handlers.HandlerUtil; -import lombok.eclipse.Eclipse; -import lombok.eclipse.EclipseAST; -import lombok.eclipse.EclipseNode; -import lombok.experimental.Accessors; -import lombok.experimental.Tolerate; -import lombok.permit.Permit; - import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; @@ -121,6 +101,28 @@ import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.lookup.TypeIds; import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; +import lombok.AccessLevel; +import lombok.ConfigurationKeys; +import lombok.Data; +import lombok.Getter; +import lombok.Lombok; +import lombok.core.AST.Kind; +import lombok.core.AnnotationValues; +import lombok.core.AnnotationValues.AnnotationValue; +import lombok.core.LombokImmutableList; +import lombok.core.TypeResolver; +import lombok.core.configuration.NullCheckExceptionType; +import lombok.core.configuration.TypeName; +import lombok.core.debug.ProblemReporter; +import lombok.core.handlers.HandlerUtil; +import lombok.core.handlers.HandlerUtil.FieldAccess; +import lombok.eclipse.Eclipse; +import lombok.eclipse.EclipseAST; +import lombok.eclipse.EclipseNode; +import lombok.experimental.Accessors; +import lombok.experimental.Tolerate; +import lombok.permit.Permit; + /** * Container for static utility methods useful to handlers written for eclipse. */ @@ -1818,8 +1820,6 @@ public class EclipseHandlerUtil { /** * Generates a new statement that checks if the given local variable is null, and if so, throws a specified exception with the * variable name as message. - * - * @param exName The name of the exception to throw; normally {@code java.lang.NullPointerException}. */ public static Statement generateNullCheck(TypeReference type, char[] variable, EclipseNode sourceNode) { NullCheckExceptionType exceptionType = sourceNode.getAst().readConfiguration(ConfigurationKeys.NON_NULL_EXCEPTION_TYPE); @@ -1828,24 +1828,44 @@ public class EclipseHandlerUtil { ASTNode source = sourceNode.get(); int pS = source.sourceStart, pE = source.sourceEnd; - long p = (long)pS << 32 | pE; + long p = (long) pS << 32 | pE; if (isPrimitive(type)) return null; + SingleNameReference varName = new SingleNameReference(variable, p); + setGeneratedBy(varName, source); + + StringLiteral message = new StringLiteral(exceptionType.toExceptionMessage(new String(variable)).toCharArray(), pS, pE, 0); + setGeneratedBy(message, source); + + LombokImmutableList method = exceptionType.getMethod(); + if (method != null) { + + MessageSend invocation = new MessageSend(); + invocation.sourceStart = pS; invocation.sourceEnd = pE; + setGeneratedBy(invocation, source); + + char[][] utilityTypeName = new char[method.size() - 1][]; + for (int i = 0; i < method.size() - 1; i++) { + utilityTypeName[i] = method.get(i).toCharArray(); + } + + invocation.receiver = new QualifiedNameReference(utilityTypeName, new long[method.size()], pS, pE); + setGeneratedBy(invocation.receiver, source); + invocation.selector = method.get(method.size() - 1).toCharArray(); + invocation.arguments = new Expression[] {varName, message}; + return invocation; + } + AllocationExpression exception = new AllocationExpression(); setGeneratedBy(exception, source); - SingleNameReference varName = new SingleNameReference(variable, p); - setGeneratedBy(varName, source); NullLiteral nullLiteral = new NullLiteral(pS, pE); setGeneratedBy(nullLiteral, source); - + int equalOperator = exceptionType == NullCheckExceptionType.ASSERTION ? OperatorIds.NOT_EQUAL : OperatorIds.EQUAL_EQUAL; EqualExpression equalExpression = new EqualExpression(varName, nullLiteral, equalOperator); equalExpression.sourceStart = pS; equalExpression.statementEnd = equalExpression.sourceEnd = pE; setGeneratedBy(equalExpression, source); - - StringLiteral message = new StringLiteral(exceptionType.toExceptionMessage(new String(variable)).toCharArray(), pS, pE, 0); - setGeneratedBy(message, source); if (exceptionType == NullCheckExceptionType.ASSERTION) { Statement assertStatement = new AssertStatement(message, equalExpression, pS); @@ -1865,7 +1885,6 @@ public class EclipseHandlerUtil { ThrowStatement throwStatement = new ThrowStatement(exception, pS, pE); setGeneratedBy(throwStatement, source); - Block throwBlock = new Block(0); throwBlock.statements = new Statement[] {throwStatement}; throwBlock.sourceStart = pS; throwBlock.sourceEnd = pE; diff --git a/src/core/lombok/eclipse/handlers/HandleNonNull.java b/src/core/lombok/eclipse/handlers/HandleNonNull.java index 77c77e1e..c61ce02d 100644 --- a/src/core/lombok/eclipse/handlers/HandleNonNull.java +++ b/src/core/lombok/eclipse/handlers/HandleNonNull.java @@ -33,10 +33,12 @@ import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.Argument; import org.eclipse.jdt.internal.compiler.ast.AssertStatement; +import org.eclipse.jdt.internal.compiler.ast.Assignment; import org.eclipse.jdt.internal.compiler.ast.Block; import org.eclipse.jdt.internal.compiler.ast.EqualExpression; import org.eclipse.jdt.internal.compiler.ast.Expression; import org.eclipse.jdt.internal.compiler.ast.IfStatement; +import org.eclipse.jdt.internal.compiler.ast.MessageSend; import org.eclipse.jdt.internal.compiler.ast.NullLiteral; import org.eclipse.jdt.internal.compiler.ast.OperatorIds; import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; @@ -61,6 +63,9 @@ import lombok.eclipse.EclipseNode; @ProviderFor(EclipseAnnotationHandler.class) @HandlerPriority(value = 512) // 2^9; onParameter=@__(@NonNull) has to run first. public class HandleNonNull extends EclipseAnnotationHandler { + private static final char[] REQUIRE_NON_NULL = "requireNonNull".toCharArray(); + private static final char[] CHECK_NOT_NULL = "checkNotNull".toCharArray(); + public static final HandleNonNull INSTANCE = new HandleNonNull(); public void fix(EclipseNode method) { @@ -193,7 +198,22 @@ public class HandleNonNull extends EclipseAnnotationHandler { public char[] returnVarNameIfNullCheck(Statement stat) { boolean isIf = stat instanceof IfStatement; - if (!isIf && !(stat instanceof AssertStatement)) return null; + boolean isExpression = stat instanceof Expression; + if (!isIf && !(stat instanceof AssertStatement) && !isExpression) return null; + + if (isExpression) { + /* Check if the statements contains a call to checkNotNull or requireNonNull */ + Expression expression = (Expression) stat; + if (expression instanceof Assignment) expression = ((Assignment) expression).expression; + if (!(expression instanceof MessageSend)) return null; + + MessageSend invocation = (MessageSend) expression; + if (!Arrays.equals(invocation.selector, CHECK_NOT_NULL) && !Arrays.equals(invocation.selector, REQUIRE_NON_NULL)) return null; + if (invocation.arguments == null || invocation.arguments.length == 0) return null; + Expression firstArgument = invocation.arguments[0]; + if (!(firstArgument instanceof SingleNameReference)) return null; + return ((SingleNameReference) firstArgument).token; + } if (isIf) { /* Check that the if's statement is a throw statement, possibly in a block. */ diff --git a/src/core/lombok/javac/handlers/HandleNonNull.java b/src/core/lombok/javac/handlers/HandleNonNull.java index 49b987ce..079d5b04 100644 --- a/src/core/lombok/javac/handlers/HandleNonNull.java +++ b/src/core/lombok/javac/handlers/HandleNonNull.java @@ -31,13 +31,17 @@ import org.mangosdk.spi.ProviderFor; import com.sun.tools.javac.tree.JCTree.JCAnnotation; import com.sun.tools.javac.tree.JCTree.JCAssert; +import com.sun.tools.javac.tree.JCTree.JCAssign; import com.sun.tools.javac.tree.JCTree.JCBinary; import com.sun.tools.javac.tree.JCTree.JCBlock; import com.sun.tools.javac.tree.JCTree.JCExpression; +import com.sun.tools.javac.tree.JCTree.JCExpressionStatement; +import com.sun.tools.javac.tree.JCTree.JCFieldAccess; import com.sun.tools.javac.tree.JCTree.JCIdent; import com.sun.tools.javac.tree.JCTree.JCIf; import com.sun.tools.javac.tree.JCTree.JCLiteral; import com.sun.tools.javac.tree.JCTree.JCMethodDecl; +import com.sun.tools.javac.tree.JCTree.JCMethodInvocation; import com.sun.tools.javac.tree.JCTree.JCParens; import com.sun.tools.javac.tree.JCTree.JCStatement; import com.sun.tools.javac.tree.JCTree.JCSynchronized; @@ -45,6 +49,7 @@ import com.sun.tools.javac.tree.JCTree.JCThrow; import com.sun.tools.javac.tree.JCTree.JCTry; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.Name; import lombok.ConfigurationKeys; import lombok.NonNull; @@ -167,8 +172,31 @@ public class HandleNonNull extends JavacAnnotationHandler { * If it is not of this form, returns null. */ public String returnVarNameIfNullCheck(JCStatement stat) { - boolean isIf = stat instanceof JCIf; - if (!isIf && !(stat instanceof JCAssert)) return null; + boolean isIf = stat instanceof JCIf; + boolean isExpression = stat instanceof JCExpressionStatement; + if (!isIf && !(stat instanceof JCAssert) && !isExpression) return null; + + if (isExpression) { + /* Check if the statements contains a call to checkNotNull or requireNonNull */ + JCExpression expression = ((JCExpressionStatement) stat).expr; + if (expression instanceof JCAssign) expression = ((JCAssign) expression).rhs; + if (!(expression instanceof JCMethodInvocation)) return null; + + JCMethodInvocation invocation = (JCMethodInvocation) expression; + JCExpression method = invocation.meth; + Name name = null; + if (method instanceof JCFieldAccess) { + name = ((JCFieldAccess) method).name; + } else if (method instanceof JCIdent) { + name = ((JCIdent) method).name; + } + if (name == null || (!name.contentEquals("checkNotNull") && !name.contentEquals("requireNonNull"))) return null; + + if (invocation.args.isEmpty()) return null; + JCExpression firstArgument = invocation.args.head; + if (!(firstArgument instanceof JCIdent)) return null; + return ((JCIdent) firstArgument).toString(); + } if (isIf) { /* Check that the if's statement is a throw statement, possibly in a block. */ diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java index 76f3c1ad..5f0f39b0 100644 --- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java +++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java @@ -1529,6 +1529,12 @@ public class JavacHandlerUtil { if (isPrimitive(typeNode)) return null; JCLiteral message = maker.Literal(exceptionType.toExceptionMessage(varName.toString())); + + LombokImmutableList method = exceptionType.getMethod(); + if (method != null) { + return maker.Exec(maker.Apply(List.nil(), chainDots(source, method), List.of(maker.Ident(varName), message))); + } + if (exceptionType == NullCheckExceptionType.ASSERTION) { return maker.Assert(maker.Binary(CTC_NOT_EQUAL, maker.Ident(varName), maker.Literal(CTC_BOT, null)), message); } diff --git a/test/transform/resource/after-delombok/NonNullWithGuava.java b/test/transform/resource/after-delombok/NonNullWithGuava.java new file mode 100644 index 00000000..b3c13d30 --- /dev/null +++ b/test/transform/resource/after-delombok/NonNullWithGuava.java @@ -0,0 +1,35 @@ +import static com.google.common.base.Preconditions.*; +public class NonNullWithGuava { + @lombok.NonNull + private String test; + public void testMethod(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + System.out.println(arg); + } + public void testMethodWithCheck1(@lombok.NonNull String arg) { + checkNotNull(arg); + } + public void testMethodWithCheckAssign(@lombok.NonNull String arg) { + test = checkNotNull(arg); + } + public void testMethodWithCheck2(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg); + } + public void testMethodWithFakeCheck1(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + checkNotNull(""); + } + public void testMethodWithFakeCheck2(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + com.google.common.base.Preconditions.checkNotNull(test); + } + public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + test = checkNotNull(test); + } + @java.lang.SuppressWarnings("all") + public void setTest(@lombok.NonNull final String test) { + com.google.common.base.Preconditions.checkNotNull(test, "test is marked non-null but is null"); + this.test = test; + } +} \ No newline at end of file diff --git a/test/transform/resource/after-delombok/NonNullWithJdk.java b/test/transform/resource/after-delombok/NonNullWithJdk.java new file mode 100644 index 00000000..d7e2958c --- /dev/null +++ b/test/transform/resource/after-delombok/NonNullWithJdk.java @@ -0,0 +1,36 @@ +//version 7: +import static java.util.Objects.*; +public class NonNullWithJdk { + @lombok.NonNull + private String test; + public void testMethod(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + System.out.println(arg); + } + public void testMethodWithCheck1(@lombok.NonNull String arg) { + requireNonNull(arg); + } + public void testMethodWithCheckAssign(@lombok.NonNull String arg) { + test = requireNonNull(arg); + } + public void testMethodWithCheck2(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg); + } + public void testMethodWithFakeCheck1(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + requireNonNull(""); + } + public void testMethodWithFakeCheck2(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + java.util.Objects.requireNonNull(test); + } + public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + test = requireNonNull(test); + } + @java.lang.SuppressWarnings("all") + public void setTest(@lombok.NonNull final String test) { + java.util.Objects.requireNonNull(test, "test is marked non-null but is null"); + this.test = test; + } +} \ No newline at end of file diff --git a/test/transform/resource/after-ecj/NonNullWithGuava.java b/test/transform/resource/after-ecj/NonNullWithGuava.java new file mode 100644 index 00000000..c7f5a7fe --- /dev/null +++ b/test/transform/resource/after-ecj/NonNullWithGuava.java @@ -0,0 +1,36 @@ +import static com.google.common.base.Preconditions.*; +public class NonNullWithGuava { + private @lombok.NonNull @lombok.Setter String test; + public NonNullWithGuava() { + super(); + } + public void testMethod(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + System.out.println(arg); + } + public void testMethodWithCheck1(@lombok.NonNull String arg) { + checkNotNull(arg); + } + public void testMethodWithCheckAssign(@lombok.NonNull String arg) { + test = checkNotNull(arg); + } + public void testMethodWithCheck2(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg); + } + public void testMethodWithFakeCheck1(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + checkNotNull(""); + } + public void testMethodWithFakeCheck2(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + com.google.common.base.Preconditions.checkNotNull(test); + } + public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg, "arg is marked non-null but is null"); + test = checkNotNull(test); + } + public @java.lang.SuppressWarnings("all") void setTest(final @lombok.NonNull String test) { + com.google.common.base.Preconditions.checkNotNull(test, "test is marked non-null but is null"); + this.test = test; + } +} diff --git a/test/transform/resource/after-ecj/NonNullWithJdk.java b/test/transform/resource/after-ecj/NonNullWithJdk.java new file mode 100644 index 00000000..7d522260 --- /dev/null +++ b/test/transform/resource/after-ecj/NonNullWithJdk.java @@ -0,0 +1,37 @@ +//version 7: +import static java.util.Objects.*; +public class NonNullWithJdk { + private @lombok.NonNull @lombok.Setter String test; + public NonNullWithJdk() { + super(); + } + public void testMethod(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + System.out.println(arg); + } + public void testMethodWithCheck1(@lombok.NonNull String arg) { + requireNonNull(arg); + } + public void testMethodWithCheckAssign(@lombok.NonNull String arg) { + test = requireNonNull(arg); + } + public void testMethodWithCheck2(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg); + } + public void testMethodWithFakeCheck1(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + requireNonNull(""); + } + public void testMethodWithFakeCheck2(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + java.util.Objects.requireNonNull(test); + } + public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg, "arg is marked non-null but is null"); + test = requireNonNull(test); + } + public @java.lang.SuppressWarnings("all") void setTest(final @lombok.NonNull String test) { + java.util.Objects.requireNonNull(test, "test is marked non-null but is null"); + this.test = test; + } +} diff --git a/test/transform/resource/before/NonNullWithGuava.java b/test/transform/resource/before/NonNullWithGuava.java new file mode 100644 index 00000000..dc877daa --- /dev/null +++ b/test/transform/resource/before/NonNullWithGuava.java @@ -0,0 +1,33 @@ +//CONF: lombok.nonNull.exceptionType = Guava +import static com.google.common.base.Preconditions.*; +public class NonNullWithGuava { + @lombok.NonNull @lombok.Setter private String test; + + public void testMethod(@lombok.NonNull String arg) { + System.out.println(arg); + } + + public void testMethodWithCheck1(@lombok.NonNull String arg) { + checkNotNull(arg); + } + + public void testMethodWithCheckAssign(@lombok.NonNull String arg) { + test = checkNotNull(arg); + } + + public void testMethodWithCheck2(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(arg); + } + + public void testMethodWithFakeCheck1(@lombok.NonNull String arg) { + checkNotNull(""); + } + + public void testMethodWithFakeCheck2(@lombok.NonNull String arg) { + com.google.common.base.Preconditions.checkNotNull(test); + } + + public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) { + test = checkNotNull(test); + } +} diff --git a/test/transform/resource/before/NonNullWithJdk.java b/test/transform/resource/before/NonNullWithJdk.java new file mode 100644 index 00000000..c8cbf2ee --- /dev/null +++ b/test/transform/resource/before/NonNullWithJdk.java @@ -0,0 +1,34 @@ +//version 7: +//CONF: lombok.nonNull.exceptionType = Jdk +import static java.util.Objects.*; +public class NonNullWithJdk { + @lombok.NonNull @lombok.Setter private String test; + + public void testMethod(@lombok.NonNull String arg) { + System.out.println(arg); + } + + public void testMethodWithCheck1(@lombok.NonNull String arg) { + requireNonNull(arg); + } + + public void testMethodWithCheckAssign(@lombok.NonNull String arg) { + test = requireNonNull(arg); + } + + public void testMethodWithCheck2(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(arg); + } + + public void testMethodWithFakeCheck1(@lombok.NonNull String arg) { + requireNonNull(""); + } + + public void testMethodWithFakeCheck2(@lombok.NonNull String arg) { + java.util.Objects.requireNonNull(test); + } + + public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) { + test = requireNonNull(test); + } +} -- cgit