Skip to content

Commit 3588bec

Browse files
committed
generate wither with unwrapped type
1 parent 3abee0a commit 3588bec

6 files changed

Lines changed: 52 additions & 8 deletions

File tree

value-fixture/src/org/immutables/fixture/jdkonly/OptionalDefault.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.immutables.value.Value;
2121

2222
@Value.Immutable
23-
public interface OptionalDefault {
23+
public interface OptionalDefault extends WithOptionalDefault {
2424
@Value.Default
2525
default Optional<String> text() {
2626
return Optional.of("foo");

value-fixture/src/org/immutables/fixture/jdkonly/OptionalDoubleDefault.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.immutables.value.Value;
2121

2222
@Value.Immutable
23-
public interface OptionalDoubleDefault {
23+
public interface OptionalDoubleDefault extends WithOptionalDoubleDefault {
2424
@Value.Default
2525
default OptionalDouble magic() {
2626
return OptionalDouble.of(42);

value-fixture/src/org/immutables/fixture/jdkonly/OptionalIntDefault.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.immutables.value.Value;
2121

2222
@Value.Immutable
23-
public interface OptionalIntDefault {
23+
public interface OptionalIntDefault extends WithOptionalIntDefault {
2424
@Value.Default
2525
default OptionalInt magic() {
2626
return OptionalInt.of(42);

value-fixture/src/org/immutables/fixture/jdkonly/OptionalLongDefault.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.immutables.value.Value;
2121

2222
@Value.Immutable
23-
public interface OptionalLongDefault {
23+
public interface OptionalLongDefault extends WithOptionalLongDefault {
2424
@Value.Default
2525
default OptionalLong magic() {
2626
return OptionalLong.of(42);

value-fixture/test/org/immutables/fixture/jdkonly/JdkOptionalDefaultTest.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,46 @@ public void optionalDefault() {
3131
check(ImmutableOptionalDefault.builder().build().text()).is(Optional.of("foo"));
3232
check(ImmutableOptionalDefault.builder().text(Optional.empty()).build().text()).is(Optional.empty());
3333
check(ImmutableOptionalDefault.builder().text(Optional.of("bar")).build().text()).is(Optional.of("bar"));
34-
check(ImmutableOptionalDefault.builder().text("bar").build().text()).is(Optional.of("bar"));
34+
ImmutableOptionalDefault value = ImmutableOptionalDefault.builder().text("bar").build();
35+
check(value.text()).is(Optional.of("bar"));
36+
check(value.withText("blah").text()).is(Optional.of("blah"));
37+
check(value.withText(Optional.of("blah")).text()).is(Optional.of("blah"));
38+
check(value.withText(Optional.empty()).text()).is(Optional.empty());
3539
}
3640

3741
@Test
3842
public void optionalIntDefault() {
3943
check(ImmutableOptionalIntDefault.builder().build().magic()).is(OptionalInt.of(42));
4044
check(ImmutableOptionalIntDefault.builder().magic(OptionalInt.empty()).build().magic()).is(OptionalInt.empty());
4145
check(ImmutableOptionalIntDefault.builder().magic(OptionalInt.of(17)).build().magic()).is(OptionalInt.of(17));
42-
check(ImmutableOptionalIntDefault.builder().magic(17).build().magic()).is(OptionalInt.of(17));
46+
ImmutableOptionalIntDefault value = ImmutableOptionalIntDefault.builder().magic(17).build();
47+
check(value.magic()).is(OptionalInt.of(17));
48+
check(value.withMagic(99).magic()).is(OptionalInt.of(99));
49+
check(value.withMagic(OptionalInt.of(99)).magic()).is(OptionalInt.of(99));
50+
check(value.withMagic(OptionalInt.empty()).magic()).is(OptionalInt.empty());
4351
}
4452

4553
@Test
4654
public void optionalLongDefault() {
4755
check(ImmutableOptionalLongDefault.builder().build().magic()).is(OptionalLong.of(42));
4856
check(ImmutableOptionalLongDefault.builder().magic(OptionalLong.empty()).build().magic()).is(OptionalLong.empty());
4957
check(ImmutableOptionalLongDefault.builder().magic(OptionalLong.of(17)).build().magic()).is(OptionalLong.of(17));
50-
check(ImmutableOptionalLongDefault.builder().magic(17).build().magic()).is(OptionalLong.of(17));
58+
ImmutableOptionalLongDefault value = ImmutableOptionalLongDefault.builder().magic(17).build();
59+
check(value.magic()).is(OptionalLong.of(17));
60+
check(value.withMagic(99).magic()).is(OptionalLong.of(99));
61+
check(value.withMagic(OptionalLong.of(99)).magic()).is(OptionalLong.of(99));
62+
check(value.withMagic(OptionalLong.empty()).magic()).is(OptionalLong.empty());
5163
}
5264

5365
@Test
5466
public void optionalDoubleDefault() {
5567
check(ImmutableOptionalDoubleDefault.builder().build().magic()).is(OptionalDouble.of(42));
5668
check(ImmutableOptionalDoubleDefault.builder().magic(OptionalDouble.empty()).build().magic()).is(OptionalDouble.empty());
5769
check(ImmutableOptionalDoubleDefault.builder().magic(OptionalDouble.of(17)).build().magic()).is(OptionalDouble.of(17));
58-
check(ImmutableOptionalDoubleDefault.builder().magic(17).build().magic()).is(OptionalDouble.of(17));
70+
ImmutableOptionalDoubleDefault value = ImmutableOptionalDoubleDefault.builder().magic(17).build();
71+
check(value.magic()).is(OptionalDouble.of(17));
72+
check(value.withMagic(99).magic()).is(OptionalDouble.of(99));
73+
check(value.withMagic(OptionalDouble.of(99)).magic()).is(OptionalDouble.of(99));
74+
check(value.withMagic(OptionalDouble.empty()).magic()).is(OptionalDouble.empty());
5975
}
6076
}

value-processor/src/org/immutables/value/processor/Immutables.generator

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,15 @@ return new [type.typeValue.relativeRaw][type.generics.diamond]([output.linesShor
995995
[type.typeAbstract.relative] [v.names.with]([if v.multimapType][guava].collect.Multimap[else]java.util.Map[/if]<[gE], ? extends [wV]> entries);
996996
[/for]
997997
[else]
998+
[if v.optionalWithDefault]
999+
/**
1000+
* Copy the current immutable object by setting a <i>present</i> value for the optional [sourceDocRef v] attribute.
1001+
* @param value The value for [v.name][if v.optionalAcceptNullable], {@code null} is accepted as {@code [optionalEmpty v]}[/if]
1002+
* @return A modified copy of {@code this} object
1003+
*/
1004+
[deprecation v]
1005+
[type.typeAbstract.relative] [v.names.with]([v.unwrappedElementType] value);
1006+
[/if]
9981007

9991008
/**
10001009
* Copy the current immutable object by setting a value for the [sourceDocRef v] attribute.
@@ -4341,6 +4350,25 @@ public final [type.typeImmutable.relative] [v.names.with]([v.atNullability][if v
43414350
}
43424351
[/for]
43434352
[else]
4353+
[if v.optionalWithDefault]
4354+
/**
4355+
* Copy the current immutable object by setting a <em>present</em> value for the optional [sourceDocRef v] attribute.
4356+
* @param value The value for [v.name][if v.optionalAcceptNullable], {@code null} is accepted as {@code [optionalEmpty v]}[/if]
4357+
* @return A modified copy or {@code this} if not changed
4358+
*/
4359+
[deprecation v]
4360+
public final [type.typeImmutable.relative] [v.names.with]([v.unwrappedElementType] value) {
4361+
[immutableImplementationType v] newValue = [optionalOf v]([maybeCopyOf v]value[/maybeCopyOf]);
4362+
[if v.forceEqualsInWithers]
4363+
if ([objectsEqual type](this.[v.name], newValue)) return this;
4364+
[else if v.hasSimpleScalarElementType andnot v.enumType]
4365+
if ([objectsEqual type](this.[v.name], newValue)) return this;
4366+
[else]
4367+
if (this.[v.name] == newValue) return this;
4368+
[/if]
4369+
[generateReturnCopyContextual type v]
4370+
}
4371+
[/if]
43444372

43454373
/**
43464374
* Copy the current immutable object by setting a value for the [sourceDocRef v] attribute.

0 commit comments

Comments
 (0)