diff options
author | Eugene Susla <eugenesusla@google.com> | 2019-07-25 14:05:12 -0700 |
---|---|---|
committer | Eugene Susla <eugenesusla@google.com> | 2019-08-05 16:54:41 -0700 |
commit | 3156a4ce21cb4de46f84b8c7264a3dc31dd8db8b (patch) | |
tree | cf2a361a56d6f45de239da3ff5f4fa58e1d59431 /tests/Codegen/src/com/android/codegentest/SampleDataClass.java | |
parent | 2eaec69928b0394b7e6979c71a707d1b2418365c (diff) |
Addresses further review comments from ag/8000041
Including:
- An API to opt out of Int/StringDefs generation on per-field basis
- A way to customize Builder
- Non-optional fields are passed in Builder constructor
- Various adjustments to SampleDataclass examples, as requested
Test: . $ANDROID_BUILD_TOP/frameworks/base/tests/Codegen/runTest.sh
Change-Id: I32d2eec52f05d505ff07779d923e4793d3036579
Diffstat (limited to 'tests/Codegen/src/com/android/codegentest/SampleDataClass.java')
-rw-r--r-- | tests/Codegen/src/com/android/codegentest/SampleDataClass.java | 800 |
1 files changed, 533 insertions, 267 deletions
diff --git a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java index f69a092ed3f7..b30fde4e9c47 100644 --- a/tests/Codegen/src/com/android/codegentest/SampleDataClass.java +++ b/tests/Codegen/src/com/android/codegentest/SampleDataClass.java @@ -53,11 +53,13 @@ import java.util.regex.Pattern; // genAidl = true, // implied by `implements Parcelable` // genGetters = true, // on by default // genConstDefs = true, // implied by presence of constants with common prefix + genBuilder = true, // on by default if optional fields present, but suppressed by + // genConstructor + genConstructor = true, // on by default but normally suppressed by genBuilder genEqualsHashCode = true, - genBuilder = true, genToString = true, genForEachField = true, - genConstructor = true // on by default but normally suppressed by genBuilder + genSetters = true ) public final class SampleDataClass implements Parcelable { @@ -136,48 +138,53 @@ public final class SampleDataClass implements Parcelable { private int mNum4; /** - * {@link Nullable} fields are considered optional and will not throw an exception if omitted - * (or set to null) when creating an instance either via a {@link Builder} or constructor. + * {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields. */ private @Nullable String mName; /** - * Fields with default value expressions ("mFoo = ...") are also optional, and are automatically + * Fields with default value expressions ("mFoo = ...") are optional, and are automatically * initialized to the provided default expression, unless explicitly set. + * + * When using a {@link Builder} optional fields are passed via a {@link Builder#setName2 setter} + * while mandatory fields are passed via {@link Builder#Builder constructor}. */ - private String mName2 = "Bob"; + private @NonNull String mName2 = "Bob"; /** - * Fields without {@link Nullable} annotation or default value are considered required. - * - * {@link NonNull} annotation is recommended on such non-primitive fields for documentation. + * Alternatively, when default value computation is expensive, + * {@link #defaultName4 defaultFieldName()} can be defined to compute the default value. */ private @NonNull String mName4; + private static String defaultName4() { + // Expensive computation + return "Bob4"; + } /** * For parcelling, any field type supported by {@link Parcel} is supported out of the box. * E.g. {@link Parcelable} subclasses, {@link String}, {@link int}, {@link boolean}, etc. */ - private AccessibilityNodeInfo mOtherParcelable = null; + private @Nullable AccessibilityNodeInfo mOtherParcelable = null; /** * Additionally, support for parcelling other types can be added by implementing a * {@link Parcelling}, and referencing it in the {@link DataClass.ParcelWith} field annotation. * - * @see DateParcelling an example {@link Parcelling} implementation + * @see MyDateParcelling an example {@link Parcelling} implementation */ - @DataClass.ParcelWith(DateParcelling.class) - private Date mDate = new Date(42 * 42); + @DataClass.ParcelWith(MyDateParcelling.class) + private @NonNull Date mDate = new Date(42 * 42); /** * If a {@link Parcelling} is fairly common, consider putting it in {@link Parcelling.BuiltIn} * to encourage its reuse. */ @DataClass.ParcelWith(Parcelling.BuiltIn.ForPattern.class) - private Pattern mPattern = Pattern.compile(""); + private @NonNull Pattern mPattern = Pattern.compile(""); /** * For lists, when using a {@link Builder}, other than a regular * {@link Builder#setLinkAddresses2(List) setter}, and additional * {@link Builder#addLinkAddresses2(LinkAddress) add} method is generated for convenience. */ - private List<LinkAddress> mLinkAddresses2 = new ArrayList<>(); + private @NonNull List<LinkAddress> mLinkAddresses2 = new ArrayList<>(); /** * For aesthetics, you may want to consider providing a singular version of the plural field * name, which would be used for the {@link #mLinkAddresses2 above mentioned} "add" method. @@ -185,7 +192,7 @@ public final class SampleDataClass implements Parcelable { * @see Builder#addLinkAddress(LinkAddress) */ @DataClass.PluralOf("linkAddress") - private ArrayList<LinkAddress> mLinkAddresses = new ArrayList<>(); + private @NonNull ArrayList<LinkAddress> mLinkAddresses = new ArrayList<>(); /** * For array fields, when using a {@link Builder}, vararg argument format is used for * convenience. @@ -193,11 +200,6 @@ public final class SampleDataClass implements Parcelable { * @see Builder#setLinkAddresses4(LinkAddress...) */ private @Nullable LinkAddress[] mLinkAddresses4 = null; - /** - * For boolean fields, when using a {@link Builder}, in addition to a regular setter, methods - * like {@link Builder#markActive()} and {@link Builder#markNotActive()} are generated. - */ - private boolean mActive = true; /** * {@link IntDef}/{@link StringDef}-annotated fields propagate the annotation to @@ -206,7 +208,7 @@ public final class SampleDataClass implements Parcelable { * @see #getStateName * @see Builder#setStateName */ - private @StateName String mStateName = STATE_NAME_UNDEFINED; + private @StateName @NonNull String mStateName = STATE_NAME_UNDEFINED; /** * Fields annotated with {@link IntDef} annotations also get a proper {@link #toString()} value. */ @@ -220,11 +222,11 @@ public final class SampleDataClass implements Parcelable { /** * Making a field public will suppress getter generation in favor of accessing it directly. */ - public CharSequence charSeq = ""; + public @NonNull CharSequence charSeq = ""; /** * Final fields suppress generating a setter (when setters are requested). */ - private final LinkAddress[] mLinkAddresses5; + private final @Nullable LinkAddress[] mLinkAddresses5; /** * Transient fields are completely ignored and can be used for caching. */ @@ -261,7 +263,7 @@ public final class SampleDataClass implements Parcelable { * * @see AnnotationValidations#validate(Class, Size, int, String, int, String, int) */ - private @android.annotation.IntRange(from = 0, to = 4) int mLimited = 3; + private @android.annotation.IntRange(from = 0, to = 6) int mDayOfWeek = 3; /** * Unnamed validation annotation parameter gets supplied to the validating method named as * "value". @@ -272,6 +274,7 @@ public final class SampleDataClass implements Parcelable { * @see AnnotationValidations#validate(Class, Size, int, String, int) */ @Size(2) + @NonNull @Each @FloatRange(from = 0f) private float[] mCoords = new float[] {0f, 0f}; @@ -340,7 +343,6 @@ public final class SampleDataClass implements Parcelable { // Code below generated by codegen v1.0.0. - // on Jul 29, 2019, 2:50:21 PM PDT // // DO NOT MODIFY! // @@ -408,13 +410,9 @@ public final class SampleDataClass implements Parcelable { @DataClass.Generated.Member public @interface StateName {} - @DataClass.Generated( - time = 1564437021513L, - codegenVersion = "1.0.0", - sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleDataClass.java", - inputSignatures = "public static final java.lang.String STATE_NAME_UNDEFINED\npublic static final java.lang.String STATE_NAME_ON\npublic static final java.lang.String STATE_NAME_OFF\npublic static final int STATE_UNDEFINED\npublic static final int STATE_ON\npublic static final int STATE_OFF\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_AUGMENTED_REQUEST\nprivate int mNum\nprivate int mNum2\nprivate int mNum4\nprivate @android.annotation.Nullable java.lang.String mName\nprivate java.lang.String mName2\nprivate @android.annotation.NonNull java.lang.String mName4\nprivate android.view.accessibility.AccessibilityNodeInfo mOtherParcelable\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.codegentest.DateParcelling.class) java.util.Date mDate\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForPattern.class) java.util.regex.Pattern mPattern\nprivate java.util.List<android.net.LinkAddress> mLinkAddresses2\nprivate @com.android.internal.util.DataClass.PluralOf(\"linkAddress\") java.util.ArrayList<android.net.LinkAddress> mLinkAddresses\nprivate @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses4\nprivate boolean mActive\nprivate @com.android.codegentest.SampleDataClass.StateName java.lang.String mStateName\nprivate @com.android.codegentest.SampleDataClass.RequestFlags int mFlags\nprivate @com.android.codegentest.SampleDataClass.State int mState\npublic java.lang.CharSequence charSeq\nprivate final android.net.LinkAddress[] mLinkAddresses5\nprivate transient android.net.LinkAddress[] mLinkAddresses6\ntransient int[] mTmpStorage\nprivate @android.annotation.StringRes int mStringRes\nprivate @android.annotation.IntRange(from=0L, to=4L) int mLimited\nprivate @android.annotation.Size(2L) @com.android.internal.util.DataClass.Each @android.annotation.FloatRange(from=0.0) float[] mCoords\nprivate int[] lazyInitTmpStorage()\npublic android.net.LinkAddress[] getLinkAddresses4()\nprivate boolean patternEquals(java.util.regex.Pattern)\nprivate int patternHashCode()\nprivate void onConstructed()\npublic void dump(java.io.PrintWriter)") - -/** + /** + * Creates a new SampleDataClass. + * * @param num * Any property javadoc should go onto the field, and will be copied where appropriate, * including getters, constructor parameters, builder setters, etc. @@ -429,15 +427,16 @@ public final class SampleDataClass implements Parcelable { * {@code @hide} javadoc annotation is also propagated, which can be used to adjust the * desired public API surface. * @param name - * {@link Nullable} fields are considered optional and will not throw an exception if omitted - * (or set to null) when creating an instance either via a {@link Builder} or constructor. + * {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields. * @param name2 - * Fields with default value expressions ("mFoo = ...") are also optional, and are automatically + * Fields with default value expressions ("mFoo = ...") are optional, and are automatically * initialized to the provided default expression, unless explicitly set. - * @param name4 - * Fields without {@link Nullable} annotation or default value are considered required. * - * {@link NonNull} annotation is recommended on such non-primitive fields for documentation. + * When using a {@link Builder} optional fields are passed via a {@link Builder#setName2 setter} + * while mandatory fields are passed via {@link Builder#Builder constructor}. + * @param name4 + * Alternatively, when default value computation is expensive, + * {@link #defaultName4 defaultFieldName()} can be defined to compute the default value. * @param otherParcelable * For parcelling, any field type supported by {@link Parcel} is supported out of the box. * E.g. {@link Parcelable} subclasses, {@link String}, {@link int}, {@link boolean}, etc. @@ -457,9 +456,6 @@ public final class SampleDataClass implements Parcelable { * @param linkAddresses4 * For array fields, when using a {@link Builder}, vararg argument format is used for * convenience. - * @param active - * For boolean fields, when using a {@link Builder}, in addition to a regular setter, methods - * like {@link Builder#markActive()} and {@link Builder#markNotActive()} are generated. * @param stateName * {@link IntDef}/{@link StringDef}-annotated fields propagate the annotation to * getter/constructor/setter/builder parameters, making for a nicer api. @@ -480,7 +476,7 @@ public final class SampleDataClass implements Parcelable { * You can also extend support to your custom annotations by creating another corresponding * overloads like * {@link AnnotationValidations#validate(Class, UserIdInt, int)}. - * @param limited + * @param dayOfWeek * Validation annotations may also have parameters. * * Parameter values will be supplied to validation method as name-value pairs. @@ -497,50 +493,49 @@ public final class SampleDataClass implements Parcelable { int num2, int num4, @Nullable String name, - String name2, + @NonNull String name2, @NonNull String name4, - AccessibilityNodeInfo otherParcelable, - Date date, - Pattern pattern, - List<LinkAddress> linkAddresses2, - ArrayList<LinkAddress> linkAddresses, + @Nullable AccessibilityNodeInfo otherParcelable, + @NonNull Date date, + @NonNull Pattern pattern, + @NonNull List<LinkAddress> linkAddresses2, + @NonNull ArrayList<LinkAddress> linkAddresses, @Nullable LinkAddress[] linkAddresses4, - boolean active, - @StateName String stateName, + @StateName @NonNull String stateName, @RequestFlags int flags, @State int state, - CharSequence charSeq, - LinkAddress[] linkAddresses5, + @NonNull CharSequence charSeq, + @Nullable LinkAddress[] linkAddresses5, @StringRes int stringRes, - @android.annotation.IntRange(from = 0, to = 4) int limited, - @Size(2) @FloatRange(from = 0f) float[] coords) { + @android.annotation.IntRange(from = 0, to = 6) int dayOfWeek, + @Size(2) @NonNull @Each @FloatRange(from = 0f) float[] coords) { this.mNum = num; this.mNum2 = num2; this.mNum4 = num4; this.mName = name; this.mName2 = name2; - this.mName4 = Preconditions.checkNotNull(name4); + AnnotationValidations.validate( + NonNull.class, null, mName2); + this.mName4 = name4; + AnnotationValidations.validate( + NonNull.class, null, mName4); this.mOtherParcelable = otherParcelable; this.mDate = date; + AnnotationValidations.validate( + NonNull.class, null, mDate); this.mPattern = pattern; + AnnotationValidations.validate( + NonNull.class, null, mPattern); this.mLinkAddresses2 = linkAddresses2; + AnnotationValidations.validate( + NonNull.class, null, mLinkAddresses2); this.mLinkAddresses = linkAddresses; + AnnotationValidations.validate( + NonNull.class, null, mLinkAddresses); this.mLinkAddresses4 = linkAddresses4; - this.mActive = active; this.mStateName = stateName; - this.mFlags = flags; - this.mState = state; - this.charSeq = charSeq; - this.mLinkAddresses5 = linkAddresses5; - this.mStringRes = stringRes; - this.mLimited = limited; - this.mCoords = coords; - AnnotationValidations.validate( - NonNull.class, null, mName4); - //noinspection PointlessBooleanExpression - if (true - && !(Objects.equals(mStateName, STATE_NAME_UNDEFINED)) + if (!(Objects.equals(mStateName, STATE_NAME_UNDEFINED)) && !(Objects.equals(mStateName, STATE_NAME_ON)) && !(Objects.equals(mStateName, STATE_NAME_OFF))) { throw new java.lang.IllegalArgumentException( @@ -550,17 +545,18 @@ public final class SampleDataClass implements Parcelable { + "STATE_NAME_OFF(" + STATE_NAME_OFF + ")"); } + AnnotationValidations.validate( + NonNull.class, null, mStateName); + this.mFlags = flags; - //noinspection PointlessBitwiseExpression Preconditions.checkFlagsArgument( - mFlags, 0 - | FLAG_MANUAL_REQUEST + mFlags, + FLAG_MANUAL_REQUEST | FLAG_COMPATIBILITY_MODE_REQUEST | FLAG_AUGMENTED_REQUEST); + this.mState = state; - //noinspection PointlessBooleanExpression - if (true - && !(mState == STATE_UNDEFINED) + if (!(mState == STATE_UNDEFINED) && !(mState == STATE_ON) && !(mState == STATE_OFF)) { throw new java.lang.IllegalArgumentException( @@ -570,15 +566,24 @@ public final class SampleDataClass implements Parcelable { + "STATE_OFF(" + STATE_OFF + ")"); } + this.charSeq = charSeq; + AnnotationValidations.validate( + NonNull.class, null, charSeq); + this.mLinkAddresses5 = linkAddresses5; + this.mStringRes = stringRes; AnnotationValidations.validate( StringRes.class, null, mStringRes); + this.mDayOfWeek = dayOfWeek; AnnotationValidations.validate( - android.annotation.IntRange.class, null, mLimited, + android.annotation.IntRange.class, null, mDayOfWeek, "from", 0, - "to", 4); + "to", 6); + this.mCoords = coords; AnnotationValidations.validate( Size.class, null, mCoords.length, "value", 2); + AnnotationValidations.validate( + NonNull.class, null, mCoords); int coordsSize = mCoords.length; for (int i = 0; i < coordsSize; i++) { AnnotationValidations.validate( @@ -628,8 +633,7 @@ public final class SampleDataClass implements Parcelable { } /** - * {@link Nullable} fields are considered optional and will not throw an exception if omitted - * (or set to null) when creating an instance either via a {@link Builder} or constructor. + * {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields. */ @DataClass.Generated.Member public @Nullable String getName() { @@ -637,18 +641,20 @@ public final class SampleDataClass implements Parcelable { } /** - * Fields with default value expressions ("mFoo = ...") are also optional, and are automatically + * Fields with default value expressions ("mFoo = ...") are optional, and are automatically * initialized to the provided default expression, unless explicitly set. + * + * When using a {@link Builder} optional fields are passed via a {@link Builder#setName2 setter} + * while mandatory fields are passed via {@link Builder#Builder constructor}. */ @DataClass.Generated.Member - public String getName2() { + public @NonNull String getName2() { return mName2; } /** - * Fields without {@link Nullable} annotation or default value are considered required. - * - * {@link NonNull} annotation is recommended on such non-primitive fields for documentation. + * Alternatively, when default value computation is expensive, + * {@link #defaultName4 defaultFieldName()} can be defined to compute the default value. */ @DataClass.Generated.Member public @NonNull String getName4() { @@ -660,7 +666,7 @@ public final class SampleDataClass implements Parcelable { * E.g. {@link Parcelable} subclasses, {@link String}, {@link int}, {@link boolean}, etc. */ @DataClass.Generated.Member - public AccessibilityNodeInfo getOtherParcelable() { + public @Nullable AccessibilityNodeInfo getOtherParcelable() { return mOtherParcelable; } @@ -668,10 +674,10 @@ public final class SampleDataClass implements Parcelable { * Additionally, support for parcelling other types can be added by implementing a * {@link Parcelling}, and referencing it in the {@link DataClass.ParcelWith} field annotation. * - * @see DateParcelling an example {@link Parcelling} implementation + * @see MyDateParcelling an example {@link Parcelling} implementation */ @DataClass.Generated.Member - public Date getDate() { + public @NonNull Date getDate() { return mDate; } @@ -680,7 +686,7 @@ public final class SampleDataClass implements Parcelable { * to encourage its reuse. */ @DataClass.Generated.Member - public Pattern getPattern() { + public @NonNull Pattern getPattern() { return mPattern; } @@ -690,7 +696,7 @@ public final class SampleDataClass implements Parcelable { * {@link Builder#addLinkAddresses2(LinkAddress) add} method is generated for convenience. */ @DataClass.Generated.Member - public List<LinkAddress> getLinkAddresses2() { + public @NonNull List<LinkAddress> getLinkAddresses2() { return mLinkAddresses2; } @@ -701,20 +707,11 @@ public final class SampleDataClass implements Parcelable { * @see Builder#addLinkAddress(LinkAddress) */ @DataClass.Generated.Member - public ArrayList<LinkAddress> getLinkAddresses() { + public @NonNull ArrayList<LinkAddress> getLinkAddresses() { return mLinkAddresses; } /** - * For boolean fields, when using a {@link Builder}, in addition to a regular setter, methods - * like {@link Builder#markActive()} and {@link Builder#markNotActive()} are generated. - */ - @DataClass.Generated.Member - public boolean isActive() { - return mActive; - } - - /** * {@link IntDef}/{@link StringDef}-annotated fields propagate the annotation to * getter/constructor/setter/builder parameters, making for a nicer api. * @@ -722,7 +719,7 @@ public final class SampleDataClass implements Parcelable { * @see Builder#setStateName */ @DataClass.Generated.Member - public @StateName String getStateName() { + public @StateName @NonNull String getStateName() { return mStateName; } @@ -746,7 +743,7 @@ public final class SampleDataClass implements Parcelable { * Final fields suppress generating a setter (when setters are requested). */ @DataClass.Generated.Member - public LinkAddress[] getLinkAddresses5() { + public @Nullable LinkAddress[] getLinkAddresses5() { return mLinkAddresses5; } @@ -775,8 +772,8 @@ public final class SampleDataClass implements Parcelable { * @see AnnotationValidations#validate(Class, Size, int, String, int, String, int) */ @DataClass.Generated.Member - public @android.annotation.IntRange(from = 0, to = 4) int getLimited() { - return mLimited; + public @android.annotation.IntRange(from = 0, to = 6) int getDayOfWeek() { + return mDayOfWeek; } /** @@ -789,7 +786,7 @@ public final class SampleDataClass implements Parcelable { * @see AnnotationValidations#validate(Class, Size, int, String, int) */ @DataClass.Generated.Member - public @Size(2) @FloatRange(from = 0f) float[] getCoords() { + public @Size(2) @NonNull @Each @FloatRange(from = 0f) float[] getCoords() { return mCoords; } @@ -810,6 +807,282 @@ public final class SampleDataClass implements Parcelable { return tmpStorage; } + /** + * Any property javadoc should go onto the field, and will be copied where appropriate, + * including getters, constructor parameters, builder setters, etc. + * + * <p> + * This allows to avoid the burden of maintaining copies of the same documentation + * pieces in multiple places for each field. + */ + @DataClass.Generated.Member + public SampleDataClass setNum(int value) { + mNum = value; + return this; + } + + /** + * Various javadoc features should work as expected when copied, e.g {@code code}, + * {@link #mName links}, <a href="https://google.com">html links</a>, etc. + * + * @see #mNum2 ..and so should blocks at the bottom, e.g. {@code @see} blocks. + */ + @DataClass.Generated.Member + public SampleDataClass setNum2(int value) { + mNum2 = value; + return this; + } + + /** + * {@code @hide} javadoc annotation is also propagated, which can be used to adjust the + * desired public API surface. + * + * @see #getNum4() is hidden + * @see Builder#setNum4(int) also hidden + * @hide + */ + @DataClass.Generated.Member + public SampleDataClass setNum4(int value) { + mNum4 = value; + return this; + } + + /** + * {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields. + */ + @DataClass.Generated.Member + public SampleDataClass setName(@Nullable String value) { + mName = value; + return this; + } + + /** + * Fields with default value expressions ("mFoo = ...") are optional, and are automatically + * initialized to the provided default expression, unless explicitly set. + * + * When using a {@link Builder} optional fields are passed via a {@link Builder#setName2 setter} + * while mandatory fields are passed via {@link Builder#Builder constructor}. + */ + @DataClass.Generated.Member + public SampleDataClass setName2(@NonNull String value) { + mName2 = value; + AnnotationValidations.validate( + NonNull.class, null, mName2); + return this; + } + + /** + * Alternatively, when default value computation is expensive, + * {@link #defaultName4 defaultFieldName()} can be defined to compute the default value. + */ + @DataClass.Generated.Member + public SampleDataClass setName4(@NonNull String value) { + mName4 = value; + AnnotationValidations.validate( + NonNull.class, null, mName4); + return this; + } + + /** + * For parcelling, any field type supported by {@link Parcel} is supported out of the box. + * E.g. {@link Parcelable} subclasses, {@link String}, {@link int}, {@link boolean}, etc. + */ + @DataClass.Generated.Member + public SampleDataClass setOtherParcelable(@Nullable AccessibilityNodeInfo value) { + mOtherParcelable = value; + return this; + } + + /** + * Additionally, support for parcelling other types can be added by implementing a + * {@link Parcelling}, and referencing it in the {@link DataClass.ParcelWith} field annotation. + * + * @see MyDateParcelling an example {@link Parcelling} implementation + */ + @DataClass.Generated.Member + public SampleDataClass setDate(@NonNull Date value) { + mDate = value; + AnnotationValidations.validate( + NonNull.class, null, mDate); + return this; + } + + /** + * If a {@link Parcelling} is fairly common, consider putting it in {@link Parcelling.BuiltIn} + * to encourage its reuse. + */ + @DataClass.Generated.Member + public SampleDataClass setPattern(@NonNull Pattern value) { + mPattern = value; + AnnotationValidations.validate( + NonNull.class, null, mPattern); + return this; + } + + /** + * For lists, when using a {@link Builder}, other than a regular + * {@link Builder#setLinkAddresses2(List) setter}, and additional + * {@link Builder#addLinkAddresses2(LinkAddress) add} method is generated for convenience. + */ + @DataClass.Generated.Member + public SampleDataClass setLinkAddresses2(@NonNull List<LinkAddress> value) { + mLinkAddresses2 = value; + AnnotationValidations.validate( + NonNull.class, null, mLinkAddresses2); + return this; + } + + /** + * For aesthetics, you may want to consider providing a singular version of the plural field + * name, which would be used for the {@link #mLinkAddresses2 above mentioned} "add" method. + * + * @see Builder#addLinkAddress(LinkAddress) + */ + @DataClass.Generated.Member + public SampleDataClass setLinkAddresses(@NonNull ArrayList<LinkAddress> value) { + mLinkAddresses = value; + AnnotationValidations.validate( + NonNull.class, null, mLinkAddresses); + return this; + } + + /** + * For array fields, when using a {@link Builder}, vararg argument format is used for + * convenience. + * + * @see Builder#setLinkAddresses4(LinkAddress...) + */ + @DataClass.Generated.Member + public SampleDataClass setLinkAddresses4(@Nullable LinkAddress... value) { + mLinkAddresses4 = value; + return this; + } + + /** + * {@link IntDef}/{@link StringDef}-annotated fields propagate the annotation to + * getter/constructor/setter/builder parameters, making for a nicer api. + * + * @see #getStateName + * @see Builder#setStateName + */ + @DataClass.Generated.Member + public SampleDataClass setStateName(@StateName @NonNull String value) { + mStateName = value; + + if (!(Objects.equals(mStateName, STATE_NAME_UNDEFINED)) + && !(Objects.equals(mStateName, STATE_NAME_ON)) + && !(Objects.equals(mStateName, STATE_NAME_OFF))) { + throw new java.lang.IllegalArgumentException( + "stateName was " + mStateName + " but must be one of: " + + "STATE_NAME_UNDEFINED(" + STATE_NAME_UNDEFINED + "), " + + "STATE_NAME_ON(" + STATE_NAME_ON + "), " + + "STATE_NAME_OFF(" + STATE_NAME_OFF + ")"); + } + + AnnotationValidations.validate( + NonNull.class, null, mStateName); + return this; + } + + /** + * Fields annotated with {@link IntDef} annotations also get a proper {@link #toString()} value. + */ + @DataClass.Generated.Member + public SampleDataClass setFlags(@RequestFlags int value) { + mFlags = value; + + Preconditions.checkFlagsArgument( + mFlags, + FLAG_MANUAL_REQUEST + | FLAG_COMPATIBILITY_MODE_REQUEST + | FLAG_AUGMENTED_REQUEST); + return this; + } + + /** + * Above is true for both {@link IntDef#flag flags} and enum-like {@link IntDef}s + */ + @DataClass.Generated.Member + public SampleDataClass setState(@State int value) { + mState = value; + + if (!(mState == STATE_UNDEFINED) + && !(mState == STATE_ON) + && !(mState == STATE_OFF)) { + throw new java.lang.IllegalArgumentException( + "state was " + mState + " but must be one of: " + + "STATE_UNDEFINED(" + STATE_UNDEFINED + "), " + + "STATE_ON(" + STATE_ON + "), " + + "STATE_OFF(" + STATE_OFF + ")"); + } + + return this; + } + + /** + * Fields with certain annotations are automatically validated in constructor + * + * You can see overloads in {@link AnnotationValidations} for a list of currently + * supported ones. + * + * You can also extend support to your custom annotations by creating another corresponding + * overloads like + * {@link AnnotationValidations#validate(Class, UserIdInt, int)}. + * + * @see #SampleDataClass + */ + @DataClass.Generated.Member + public SampleDataClass setStringRes(@StringRes int value) { + mStringRes = value; + AnnotationValidations.validate( + StringRes.class, null, mStringRes); + return this; + } + + /** + * Validation annotations may also have parameters. + * + * Parameter values will be supplied to validation method as name-value pairs. + * + * @see AnnotationValidations#validate(Class, Size, int, String, int, String, int) + */ + @DataClass.Generated.Member + public SampleDataClass setDayOfWeek(@android.annotation.IntRange(from = 0, to = 6) int value) { + mDayOfWeek = value; + AnnotationValidations.validate( + android.annotation.IntRange.class, null, mDayOfWeek, + "from", 0, + "to", 6); + return this; + } + + /** + * Unnamed validation annotation parameter gets supplied to the validating method named as + * "value". + * + * Validation annotations following {@link Each} annotation, will be applied for each + * array/collection element instead. + * + * @see AnnotationValidations#validate(Class, Size, int, String, int) + */ + @DataClass.Generated.Member + public SampleDataClass setCoords(@Size(2) @NonNull @Each @FloatRange(from = 0f) float... value) { + mCoords = value; + AnnotationValidations.validate( + Size.class, null, mCoords.length, + "value", 2); + AnnotationValidations.validate( + NonNull.class, null, mCoords); + int coordsSize = mCoords.length; + for (int i = 0; i < coordsSize; i++) { + AnnotationValidations.validate( + FloatRange.class, null, mCoords[i], + "from", 0f); + } + + return this; + } + @Override @DataClass.Generated.Member public String toString() { @@ -829,14 +1102,13 @@ public final class SampleDataClass implements Parcelable { "linkAddresses2 = " + mLinkAddresses2 + ", " + "linkAddresses = " + mLinkAddresses + ", " + "linkAddresses4 = " + java.util.Arrays.toString(mLinkAddresses4) + ", " + - "active = " + mActive + ", " + "stateName = " + mStateName + ", " + "flags = " + requestFlagsToString(mFlags) + ", " + "state = " + stateToString(mState) + ", " + "charSeq = " + charSeq + ", " + "linkAddresses5 = " + java.util.Arrays.toString(mLinkAddresses5) + ", " + "stringRes = " + mStringRes + ", " + - "limited = " + mLimited + ", " + + "dayOfWeek = " + mDayOfWeek + ", " + "coords = " + java.util.Arrays.toString(mCoords) + " }"; } @@ -866,14 +1138,13 @@ public final class SampleDataClass implements Parcelable { && Objects.equals(mLinkAddresses2, that.mLinkAddresses2) && Objects.equals(mLinkAddresses, that.mLinkAddresses) && java.util.Arrays.equals(mLinkAddresses4, that.mLinkAddresses4) - && mActive == that.mActive && Objects.equals(mStateName, that.mStateName) && mFlags == that.mFlags && mState == that.mState && Objects.equals(charSeq, that.charSeq) && java.util.Arrays.equals(mLinkAddresses5, that.mLinkAddresses5) && mStringRes == that.mStringRes - && mLimited == that.mLimited + && mDayOfWeek == that.mDayOfWeek && java.util.Arrays.equals(mCoords, that.mCoords); } @@ -896,14 +1167,13 @@ public final class SampleDataClass implements Parcelable { _hash = 31 * _hash + Objects.hashCode(mLinkAddresses2); _hash = 31 * _hash + Objects.hashCode(mLinkAddresses); _hash = 31 * _hash + java.util.Arrays.hashCode(mLinkAddresses4); - _hash = 31 * _hash + Boolean.hashCode(mActive); _hash = 31 * _hash + Objects.hashCode(mStateName); _hash = 31 * _hash + mFlags; _hash = 31 * _hash + mState; _hash = 31 * _hash + Objects.hashCode(charSeq); _hash = 31 * _hash + java.util.Arrays.hashCode(mLinkAddresses5); _hash = 31 * _hash + mStringRes; - _hash = 31 * _hash + mLimited; + _hash = 31 * _hash + mDayOfWeek; _hash = 31 * _hash + java.util.Arrays.hashCode(mCoords); return _hash; } @@ -924,14 +1194,13 @@ public final class SampleDataClass implements Parcelable { actionObject.acceptObject(this, "linkAddresses2", mLinkAddresses2); actionObject.acceptObject(this, "linkAddresses", mLinkAddresses); actionObject.acceptObject(this, "linkAddresses4", mLinkAddresses4); - actionObject.acceptObject(this, "active", mActive); actionObject.acceptObject(this, "stateName", mStateName); actionInt.acceptInt(this, "flags", mFlags); actionInt.acceptInt(this, "state", mState); actionObject.acceptObject(this, "charSeq", charSeq); actionObject.acceptObject(this, "linkAddresses5", mLinkAddresses5); actionInt.acceptInt(this, "stringRes", mStringRes); - actionInt.acceptInt(this, "limited", mLimited); + actionInt.acceptInt(this, "dayOfWeek", mDayOfWeek); actionObject.acceptObject(this, "coords", mCoords); } @@ -951,25 +1220,24 @@ public final class SampleDataClass implements Parcelable { action.acceptObject(this, "linkAddresses2", mLinkAddresses2); action.acceptObject(this, "linkAddresses", mLinkAddresses); action.acceptObject(this, "linkAddresses4", mLinkAddresses4); - action.acceptObject(this, "active", mActive); action.acceptObject(this, "stateName", mStateName); action.acceptObject(this, "flags", mFlags); action.acceptObject(this, "state", mState); action.acceptObject(this, "charSeq", charSeq); action.acceptObject(this, "linkAddresses5", mLinkAddresses5); action.acceptObject(this, "stringRes", mStringRes); - action.acceptObject(this, "limited", mLimited); + action.acceptObject(this, "dayOfWeek", mDayOfWeek); action.acceptObject(this, "coords", mCoords); } @DataClass.Generated.Member static Parcelling<Date> sParcellingForDate = Parcelling.Cache.get( - DateParcelling.class); + MyDateParcelling.class); static { if (sParcellingForDate == null) { sParcellingForDate = Parcelling.Cache.put( - new DateParcelling()); + new MyDateParcelling()); } } @@ -991,40 +1259,31 @@ public final class SampleDataClass implements Parcelable { // void parcelFieldName(Parcel dest, int flags) { ... } long flg = 0; - if (mActive) flg |= 0x1000; if (mName != null) flg |= 0x8; - if (mName2 != null) flg |= 0x10; if (mOtherParcelable != null) flg |= 0x40; - if (mDate != null) flg |= 0x80; - if (mPattern != null) flg |= 0x100; - if (mLinkAddresses2 != null) flg |= 0x200; - if (mLinkAddresses != null) flg |= 0x400; if (mLinkAddresses4 != null) flg |= 0x800; - if (mStateName != null) flg |= 0x2000; - if (charSeq != null) flg |= 0x10000; - if (mLinkAddresses5 != null) flg |= 0x20000; - if (mCoords != null) flg |= 0x100000; + if (mLinkAddresses5 != null) flg |= 0x10000; dest.writeLong(flg); dest.writeInt(mNum); dest.writeInt(mNum2); dest.writeInt(mNum4); if (mName != null) dest.writeString(mName); - if (mName2 != null) dest.writeString(mName2); + dest.writeString(mName2); dest.writeString(mName4); if (mOtherParcelable != null) dest.writeTypedObject(mOtherParcelable, flags); sParcellingForDate.parcel(mDate, dest, flags); sParcellingForPattern.parcel(mPattern, dest, flags); - if (mLinkAddresses2 != null) dest.writeParcelableList(mLinkAddresses2, flags); - if (mLinkAddresses != null) dest.writeParcelableList(mLinkAddresses, flags); + dest.writeParcelableList(mLinkAddresses2, flags); + dest.writeParcelableList(mLinkAddresses, flags); if (mLinkAddresses4 != null) dest.writeTypedArray(mLinkAddresses4, flags); - if (mStateName != null) dest.writeString(mStateName); + dest.writeString(mStateName); dest.writeInt(mFlags); dest.writeInt(mState); - if (charSeq != null) dest.writeCharSequence(charSeq); + dest.writeCharSequence(charSeq); if (mLinkAddresses5 != null) dest.writeTypedArray(mLinkAddresses5, flags); dest.writeInt(mStringRes); - dest.writeInt(mLimited); - if (mCoords != null) dest.writeFloatArray(mCoords); + dest.writeInt(mDayOfWeek); + dest.writeFloatArray(mCoords); } @Override @@ -1046,35 +1305,28 @@ public final class SampleDataClass implements Parcelable { // static FieldType unparcelFieldName(Parcel in) { ... } long flg = in.readLong(); - boolean active = (flg & 0x1000) != 0; int num = in.readInt(); int num2 = in.readInt(); int num4 = in.readInt(); String name = (flg & 0x8) == 0 ? null : in.readString(); - String name2 = (flg & 0x10) == 0 ? null : in.readString(); + String name2 = in.readString(); String name4 = in.readString(); AccessibilityNodeInfo otherParcelable = (flg & 0x40) == 0 ? null : (AccessibilityNodeInfo) in.readTypedObject(AccessibilityNodeInfo.CREATOR); Date date = sParcellingForDate.unparcel(in); Pattern pattern = sParcellingForPattern.unparcel(in); - List<LinkAddress> linkAddresses2 = null; - if ((flg & 0x200) != 0) { - linkAddresses2 = new ArrayList<>(); - in.readParcelableList(linkAddresses2, LinkAddress.class.getClassLoader()); - } - ArrayList<LinkAddress> linkAddresses = null; - if ((flg & 0x400) != 0) { - linkAddresses = new ArrayList<>(); - in.readParcelableList(linkAddresses, LinkAddress.class.getClassLoader()); - } + List<LinkAddress> linkAddresses2 = new ArrayList<>(); + in.readParcelableList(linkAddresses2, LinkAddress.class.getClassLoader()); + ArrayList<LinkAddress> linkAddresses = new ArrayList<>(); + in.readParcelableList(linkAddresses, LinkAddress.class.getClassLoader()); LinkAddress[] linkAddresses4 = (flg & 0x800) == 0 ? null : (LinkAddress[]) in.createTypedArray(LinkAddress.CREATOR); - String stateName = (flg & 0x2000) == 0 ? null : in.readString(); + String stateName = in.readString(); int flags = in.readInt(); int state = in.readInt(); - CharSequence _charSeq = (flg & 0x10000) == 0 ? null : (CharSequence) in.readCharSequence(); - LinkAddress[] linkAddresses5 = (flg & 0x20000) == 0 ? null : (LinkAddress[]) in.createTypedArray(LinkAddress.CREATOR); + CharSequence _charSeq = (CharSequence) in.readCharSequence(); + LinkAddress[] linkAddresses5 = (flg & 0x10000) == 0 ? null : (LinkAddress[]) in.createTypedArray(LinkAddress.CREATOR); int stringRes = in.readInt(); - int limited = in.readInt(); - float[] coords = (flg & 0x100000) == 0 ? null : in.createFloatArray(); + int dayOfWeek = in.readInt(); + float[] coords = in.createFloatArray(); return new SampleDataClass( num, num2, @@ -1088,14 +1340,13 @@ public final class SampleDataClass implements Parcelable { linkAddresses2, linkAddresses, linkAddresses4, - active, stateName, flags, state, _charSeq, linkAddresses5, stringRes, - limited, + dayOfWeek, coords); } }; @@ -1105,34 +1356,74 @@ public final class SampleDataClass implements Parcelable { */ @SuppressWarnings("WeakerAccess") @DataClass.Generated.Member - public static class Builder - extends android.provider.OneTimeUseBuilder<SampleDataClass> { - - protected int mNum; - protected int mNum2; - protected int mNum4; - protected @Nullable String mName; - protected String mName2; - protected @NonNull String mName4; - protected AccessibilityNodeInfo mOtherParcelable; - protected Date mDate; - protected Pattern mPattern; - protected List<LinkAddress> mLinkAddresses2; - protected ArrayList<LinkAddress> mLinkAddresses; - protected @Nullable LinkAddress[] mLinkAddresses4; - protected boolean mActive; - protected @StateName String mStateName; - protected @RequestFlags int mFlags; - protected @State int mState; - protected CharSequence charSeq; - protected LinkAddress[] mLinkAddresses5; - protected @StringRes int mStringRes; - protected @android.annotation.IntRange(from = 0, to = 4) int mLimited; - protected @Size(2) @FloatRange(from = 0f) float[] mCoords; - - protected long mBuilderFieldsSet = 0L; - - public Builder() {}; + public static class Builder { + + private int mNum; + private int mNum2; + private int mNum4; + private @Nullable String mName; + private @NonNull String mName2; + private @NonNull String mName4; + private @Nullable AccessibilityNodeInfo mOtherParcelable; + private @NonNull Date mDate; + private @NonNull Pattern mPattern; + private @NonNull List<LinkAddress> mLinkAddresses2; + private @NonNull ArrayList<LinkAddress> mLinkAddresses; + private @Nullable LinkAddress[] mLinkAddresses4; + private @StateName @NonNull String mStateName; + private @RequestFlags int mFlags; + private @State int mState; + private @NonNull CharSequence charSeq; + private @Nullable LinkAddress[] mLinkAddresses5; + private @StringRes int mStringRes; + private @android.annotation.IntRange(from = 0, to = 6) int mDayOfWeek; + private @Size(2) @NonNull @Each @FloatRange(from = 0f) float[] mCoords; + + private long mBuilderFieldsSet = 0L; + + /** + * Creates a new Builder. + * + * @param num + * Any property javadoc should go onto the field, and will be copied where appropriate, + * including getters, constructor parameters, builder setters, etc. + * + * <p> + * This allows to avoid the burden of maintaining copies of the same documentation + * pieces in multiple places for each field. + * @param num2 + * Various javadoc features should work as expected when copied, e.g {@code code}, + * {@link #mName links}, <a href="https://google.com">html links</a>, etc. + * @param num4 + * {@code @hide} javadoc annotation is also propagated, which can be used to adjust the + * desired public API surface. + * @param name + * {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields. + * @param flags + * Fields annotated with {@link IntDef} annotations also get a proper {@link #toString()} value. + * @param linkAddresses5 + * Final fields suppress generating a setter (when setters are requested). + */ + public Builder( + int num, + int num2, + int num4, + @Nullable String name, + @RequestFlags int flags, + @Nullable LinkAddress[] linkAddresses5) { + mNum = num; + mNum2 = num2; + mNum4 = num4; + mName = name; + mFlags = flags; + + Preconditions.checkFlagsArgument( + mFlags, + FLAG_MANUAL_REQUEST + | FLAG_COMPATIBILITY_MODE_REQUEST + | FLAG_AUGMENTED_REQUEST); + mLinkAddresses5 = linkAddresses5; + } /** * Any property javadoc should go onto the field, and will be copied where appropriate, @@ -1143,7 +1434,7 @@ public final class SampleDataClass implements Parcelable { * pieces in multiple places for each field. */ @DataClass.Generated.Member - public Builder setNum(int value) { + public @NonNull Builder setNum(int value) { checkNotUsed(); mBuilderFieldsSet |= 0x1; mNum = value; @@ -1157,7 +1448,7 @@ public final class SampleDataClass implements Parcelable { * @see #mNum2 ..and so should blocks at the bottom, e.g. {@code @see} blocks. */ @DataClass.Generated.Member - public Builder setNum2(int value) { + public @NonNull Builder setNum2(int value) { checkNotUsed(); mBuilderFieldsSet |= 0x2; mNum2 = value; @@ -1173,7 +1464,7 @@ public final class SampleDataClass implements Parcelable { * @hide */ @DataClass.Generated.Member - public Builder setNum4(int value) { + public @NonNull Builder setNum4(int value) { checkNotUsed(); mBuilderFieldsSet |= 0x4; mNum4 = value; @@ -1181,11 +1472,10 @@ public final class SampleDataClass implements Parcelable { } /** - * {@link Nullable} fields are considered optional and will not throw an exception if omitted - * (or set to null) when creating an instance either via a {@link Builder} or constructor. + * {@link Nullable} or {@link NonNull} annotation is required on all non-primitive fields. */ @DataClass.Generated.Member - public Builder setName(@Nullable String value) { + public @NonNull Builder setName(@Nullable String value) { checkNotUsed(); mBuilderFieldsSet |= 0x8; mName = value; @@ -1193,11 +1483,14 @@ public final class SampleDataClass implements Parcelable { } /** - * Fields with default value expressions ("mFoo = ...") are also optional, and are automatically + * Fields with default value expressions ("mFoo = ...") are optional, and are automatically * initialized to the provided default expression, unless explicitly set. + * + * When using a {@link Builder} optional fields are passed via a {@link Builder#setName2 setter} + * while mandatory fields are passed via {@link Builder#Builder constructor}. */ @DataClass.Generated.Member - public Builder setName2(String value) { + public @NonNull Builder setName2(@NonNull String value) { checkNotUsed(); mBuilderFieldsSet |= 0x10; mName2 = value; @@ -1205,12 +1498,11 @@ public final class SampleDataClass implements Parcelable { } /** - * Fields without {@link Nullable} annotation or default value are considered required. - * - * {@link NonNull} annotation is recommended on such non-primitive fields for documentation. + * Alternatively, when default value computation is expensive, + * {@link #defaultName4 defaultFieldName()} can be defined to compute the default value. */ @DataClass.Generated.Member - public Builder setName4(@NonNull String value) { + public @NonNull Builder setName4(@NonNull String value) { checkNotUsed(); mBuilderFieldsSet |= 0x20; mName4 = value; @@ -1222,7 +1514,7 @@ public final class SampleDataClass implements Parcelable { * E.g. {@link Parcelable} subclasses, {@link String}, {@link int}, {@link boolean}, etc. */ @DataClass.Generated.Member - public Builder setOtherParcelable(AccessibilityNodeInfo value) { + public @NonNull Builder setOtherParcelable(@Nullable AccessibilityNodeInfo value) { checkNotUsed(); mBuilderFieldsSet |= 0x40; mOtherParcelable = value; @@ -1233,10 +1525,10 @@ public final class SampleDataClass implements Parcelable { * Additionally, support for parcelling other types can be added by implementing a * {@link Parcelling}, and referencing it in the {@link DataClass.ParcelWith} field annotation. * - * @see DateParcelling an example {@link Parcelling} implementation + * @see MyDateParcelling an example {@link Parcelling} implementation */ @DataClass.Generated.Member - public Builder setDate(Date value) { + public @NonNull Builder setDate(@NonNull Date value) { checkNotUsed(); mBuilderFieldsSet |= 0x80; mDate = value; @@ -1248,7 +1540,7 @@ public final class SampleDataClass implements Parcelable { * to encourage its reuse. */ @DataClass.Generated.Member - public Builder setPattern(Pattern value) { + public @NonNull Builder setPattern(@NonNull Pattern value) { checkNotUsed(); mBuilderFieldsSet |= 0x100; mPattern = value; @@ -1261,7 +1553,7 @@ public final class SampleDataClass implements Parcelable { * {@link Builder#addLinkAddresses2(LinkAddress) add} method is generated for convenience. */ @DataClass.Generated.Member - public Builder setLinkAddresses2(List<LinkAddress> value) { + public @NonNull Builder setLinkAddresses2(@NonNull List<LinkAddress> value) { checkNotUsed(); mBuilderFieldsSet |= 0x200; mLinkAddresses2 = value; @@ -1270,7 +1562,7 @@ public final class SampleDataClass implements Parcelable { /** @see #setLinkAddresses2 */ @DataClass.Generated.Member - public Builder addLinkAddresses2(@NonNull LinkAddress value) { + public @NonNull Builder addLinkAddresses2(LinkAddress value) { // You can refine this method's name by providing item's singular name, e.g.: // @DataClass.PluralOf("item")) mItems = ... @@ -1286,7 +1578,7 @@ public final class SampleDataClass implements Parcelable { * @see Builder#addLinkAddress(LinkAddress) */ @DataClass.Generated.Member - public Builder setLinkAddresses(ArrayList<LinkAddress> value) { + public @NonNull Builder setLinkAddresses(@NonNull ArrayList<LinkAddress> value) { checkNotUsed(); mBuilderFieldsSet |= 0x400; mLinkAddresses = value; @@ -1295,7 +1587,7 @@ public final class SampleDataClass implements Parcelable { /** @see #setLinkAddresses */ @DataClass.Generated.Member - public Builder addLinkAddress(@NonNull LinkAddress value) { + public @NonNull Builder addLinkAddress(LinkAddress value) { if (mLinkAddresses == null) setLinkAddresses(new ArrayList<>()); mLinkAddresses.add(value); return this; @@ -1308,7 +1600,7 @@ public final class SampleDataClass implements Parcelable { * @see Builder#setLinkAddresses4(LinkAddress...) */ @DataClass.Generated.Member - public Builder setLinkAddresses4(@Nullable LinkAddress... value) { + public @NonNull Builder setLinkAddresses4(@Nullable LinkAddress... value) { checkNotUsed(); mBuilderFieldsSet |= 0x800; mLinkAddresses4 = value; @@ -1316,30 +1608,6 @@ public final class SampleDataClass implements Parcelable { } /** - * For boolean fields, when using a {@link Builder}, in addition to a regular setter, methods - * like {@link Builder#markActive()} and {@link Builder#markNotActive()} are generated. - */ - @DataClass.Generated.Member - public Builder setActive(boolean value) { - checkNotUsed(); - mBuilderFieldsSet |= 0x1000; - mActive = value; - return this; - } - - /** @see #setActive */ - @DataClass.Generated.Member - public Builder markActive() { - return setActive(true); - } - - /** @see #setActive */ - @DataClass.Generated.Member - public Builder markNotActive() { - return setActive(false); - } - - /** * {@link IntDef}/{@link StringDef}-annotated fields propagate the annotation to * getter/constructor/setter/builder parameters, making for a nicer api. * @@ -1347,9 +1615,9 @@ public final class SampleDataClass implements Parcelable { * @see Builder#setStateName */ @DataClass.Generated.Member - public Builder setStateName(@StateName String value) { + public @NonNull Builder setStateName(@StateName @NonNull String value) { checkNotUsed(); - mBuilderFieldsSet |= 0x2000; + mBuilderFieldsSet |= 0x1000; mStateName = value; return this; } @@ -1358,9 +1626,9 @@ public final class SampleDataClass implements Parcelable { * Fields annotated with {@link IntDef} annotations also get a proper {@link #toString()} value. */ @DataClass.Generated.Member - public Builder setFlags(@RequestFlags int value) { + public @NonNull Builder setFlags(@RequestFlags int value) { checkNotUsed(); - mBuilderFieldsSet |= 0x4000; + mBuilderFieldsSet |= 0x2000; mFlags = value; return this; } @@ -1369,9 +1637,9 @@ public final class SampleDataClass implements Parcelable { * Above is true for both {@link IntDef#flag flags} and enum-like {@link IntDef}s */ @DataClass.Generated.Member - public Builder setState(@State int value) { + public @NonNull Builder setState(@State int value) { checkNotUsed(); - mBuilderFieldsSet |= 0x8000; + mBuilderFieldsSet |= 0x4000; mState = value; return this; } @@ -1380,9 +1648,9 @@ public final class SampleDataClass implements Parcelable { * Making a field public will suppress getter generation in favor of accessing it directly. */ @DataClass.Generated.Member - public Builder setCharSeq(CharSequence value) { + public @NonNull Builder setCharSeq(@NonNull CharSequence value) { checkNotUsed(); - mBuilderFieldsSet |= 0x10000; + mBuilderFieldsSet |= 0x8000; charSeq = value; return this; } @@ -1391,9 +1659,9 @@ public final class SampleDataClass implements Parcelable { * Final fields suppress generating a setter (when setters are requested). */ @DataClass.Generated.Member - public Builder setLinkAddresses5(LinkAddress... value) { + public @NonNull Builder setLinkAddresses5(@Nullable LinkAddress... value) { checkNotUsed(); - mBuilderFieldsSet |= 0x20000; + mBuilderFieldsSet |= 0x10000; mLinkAddresses5 = value; return this; } @@ -1411,9 +1679,9 @@ public final class SampleDataClass implements Parcelable { * @see #SampleDataClass */ @DataClass.Generated.Member - public Builder setStringRes(@StringRes int value) { + public @NonNull Builder setStringRes(@StringRes int value) { checkNotUsed(); - mBuilderFieldsSet |= 0x40000; + mBuilderFieldsSet |= 0x20000; mStringRes = value; return this; } @@ -1426,10 +1694,10 @@ public final class SampleDataClass implements Parcelable { * @see AnnotationValidations#validate(Class, Size, int, String, int, String, int) */ @DataClass.Generated.Member - public Builder setLimited(@android.annotation.IntRange(from = 0, to = 4) int value) { + public @NonNull Builder setDayOfWeek(@android.annotation.IntRange(from = 0, to = 6) int value) { checkNotUsed(); - mBuilderFieldsSet |= 0x80000; - mLimited = value; + mBuilderFieldsSet |= 0x40000; + mDayOfWeek = value; return this; } @@ -1443,30 +1711,23 @@ public final class SampleDataClass implements Parcelable { * @see AnnotationValidations#validate(Class, Size, int, String, int) */ @DataClass.Generated.Member - public Builder setCoords(@Size(2) @FloatRange(from = 0f) float... value) { + public @NonNull Builder setCoords(@Size(2) @NonNull @Each @FloatRange(from = 0f) float... value) { checkNotUsed(); - mBuilderFieldsSet |= 0x100000; + mBuilderFieldsSet |= 0x80000; mCoords = value; return this; } /** Builds the instance. This builder should not be touched after calling this! */ public SampleDataClass build() { - markUsed(); - if ((mBuilderFieldsSet & 0x1) == 0) { - throw new IllegalStateException("Required field not set: num"); - } - if ((mBuilderFieldsSet & 0x2) == 0) { - throw new IllegalStateException("Required field not set: num2"); - } - if ((mBuilderFieldsSet & 0x4) == 0) { - throw new IllegalStateException("Required field not set: num4"); - } + checkNotUsed(); + mBuilderFieldsSet |= 0x100000; // Mark builder used + if ((mBuilderFieldsSet & 0x10) == 0) { mName2 = "Bob"; } if ((mBuilderFieldsSet & 0x20) == 0) { - throw new IllegalStateException("Required field not set: name4"); + mName4 = defaultName4(); } if ((mBuilderFieldsSet & 0x40) == 0) { mOtherParcelable = null; @@ -1487,30 +1748,21 @@ public final class SampleDataClass implements Parcelable { mLinkAddresses4 = null; } if ((mBuilderFieldsSet & 0x1000) == 0) { - mActive = true; - } - if ((mBuilderFieldsSet & 0x2000) == 0) { mStateName = STATE_NAME_UNDEFINED; } if ((mBuilderFieldsSet & 0x4000) == 0) { - throw new IllegalStateException("Required field not set: flags"); - } - if ((mBuilderFieldsSet & 0x8000) == 0) { mState = STATE_UNDEFINED; } - if ((mBuilderFieldsSet & 0x10000) == 0) { + if ((mBuilderFieldsSet & 0x8000) == 0) { charSeq = ""; } if ((mBuilderFieldsSet & 0x20000) == 0) { - throw new IllegalStateException("Required field not set: linkAddresses5"); + mStringRes = 0; } if ((mBuilderFieldsSet & 0x40000) == 0) { - mStringRes = 0; + mDayOfWeek = 3; } if ((mBuilderFieldsSet & 0x80000) == 0) { - mLimited = 3; - } - if ((mBuilderFieldsSet & 0x100000) == 0) { mCoords = new float[] { 0f, 0f }; } SampleDataClass o = new SampleDataClass( @@ -1526,17 +1778,31 @@ public final class SampleDataClass implements Parcelable { mLinkAddresses2, mLinkAddresses, mLinkAddresses4, - mActive, mStateName, mFlags, mState, charSeq, mLinkAddresses5, mStringRes, - mLimited, + mDayOfWeek, mCoords); return o; } + + private void checkNotUsed() { + if ((mBuilderFieldsSet & 0x100000) != 0) { + throw new IllegalStateException( + "This Builder should not be reused. Use a new Builder instance instead"); + } + } } + @DataClass.Generated( + time = 1565048798524L, + codegenVersion = "1.0.0", + sourceFile = "frameworks/base/tests/Codegen/src/com/android/codegentest/SampleDataClass.java", + inputSignatures = "public static final java.lang.String STATE_NAME_UNDEFINED\npublic static final java.lang.String STATE_NAME_ON\npublic static final java.lang.String STATE_NAME_OFF\npublic static final int STATE_UNDEFINED\npublic static final int STATE_ON\npublic static final int STATE_OFF\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @com.android.codegentest.SampleDataClass.RequestFlags int FLAG_AUGMENTED_REQUEST\nprivate int mNum\nprivate int mNum2\nprivate int mNum4\nprivate @android.annotation.Nullable java.lang.String mName\nprivate @android.annotation.NonNull java.lang.String mName2\nprivate @android.annotation.NonNull java.lang.String mName4\nprivate @android.annotation.Nullable android.view.accessibility.AccessibilityNodeInfo mOtherParcelable\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.codegentest.MyDateParcelling.class) @android.annotation.NonNull java.util.Date mDate\nprivate @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForPattern.class) @android.annotation.NonNull java.util.regex.Pattern mPattern\nprivate @android.annotation.NonNull java.util.List<android.net.LinkAddress> mLinkAddresses2\nprivate @com.android.internal.util.DataClass.PluralOf(\"linkAddress\") @android.annotation.NonNull java.util.ArrayList<android.net.LinkAddress> mLinkAddresses\nprivate @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses4\nprivate @com.android.codegentest.SampleDataClass.StateName @android.annotation.NonNull java.lang.String mStateName\nprivate @com.android.codegentest.SampleDataClass.RequestFlags int mFlags\nprivate @com.android.codegentest.SampleDataClass.State int mState\npublic @android.annotation.NonNull java.lang.CharSequence charSeq\nprivate final @android.annotation.Nullable android.net.LinkAddress[] mLinkAddresses5\nprivate transient android.net.LinkAddress[] mLinkAddresses6\ntransient int[] mTmpStorage\nprivate @android.annotation.StringRes int mStringRes\nprivate @android.annotation.IntRange(from=0L, to=6L) int mDayOfWeek\nprivate @android.annotation.Size(2L) @android.annotation.NonNull @com.android.internal.util.DataClass.Each @android.annotation.FloatRange(from=0.0) float[] mCoords\nprivate static java.lang.String defaultName4()\nprivate int[] lazyInitTmpStorage()\npublic android.net.LinkAddress[] getLinkAddresses4()\nprivate boolean patternEquals(java.util.regex.Pattern)\nprivate int patternHashCode()\nprivate void onConstructed()\npublic void dump(java.io.PrintWriter)\nclass SampleDataClass extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genBuilder=true, genConstructor=true, genEqualsHashCode=true, genToString=true, genForEachField=true, genSetters=true)") + @Deprecated + private void __metadata() {} + } |