diff --git a/api/src/main/java/net/kyori/adventure/text/format/TextDecoration.java b/api/src/main/java/net/kyori/adventure/text/format/TextDecoration.java index e5a7b830b..3a6db1b80 100644 --- a/api/src/main/java/net/kyori/adventure/text/format/TextDecoration.java +++ b/api/src/main/java/net/kyori/adventure/text/format/TextDecoration.java @@ -81,27 +81,64 @@ public enum TextDecoration implements StyleBuilderApplicable, TextFormat { } /** - * Creates a {@link TextDecorationAndState}. + * Creates a {@link TextDecorationAndState}, annotating this decoration with the given {@code state}. * * @param state the state * @return a {@link TextDecorationAndState} * @since 4.8.0 + * @deprecated for removal since 4.10.0, use {@link #withState(boolean)} instead */ + @Deprecated public final @NotNull TextDecorationAndState as(final boolean state) { - return this.as(State.byBoolean(state)); + return this.withState(state); } /** - * Creates a {@link TextDecorationAndState}. + * Creates a {@link TextDecorationAndState}, annotating this decoration with the given {@code state}. * * @param state the state * @return a {@link TextDecorationAndState} * @since 4.8.0 + * @deprecated for removal since 4.10.0, use {@link #withState(State)} instead */ + @Deprecated public final @NotNull TextDecorationAndState as(final @NotNull State state) { + return this.withState(state); + } + + /** + * An alias for {@link #as(boolean)}. + * + * @param state the state + * @return a {@link TextDecorationAndState} + * @since 4.10.0 + */ + public final @NotNull TextDecorationAndState withState(final boolean state) { + return new TextDecorationAndStateImpl(this, State.byBoolean(state)); + } + + /** + * An alias for {@link #as(State)}. + * + * @param state the state + * @return a {@link TextDecorationAndState} + * @since 4.10.0 + */ + public final @NotNull TextDecorationAndState withState(final @NotNull State state) { return new TextDecorationAndStateImpl(this, state); } + /** + * An alias for {@link #as(State)}. + * + * @param state the state + * @return a {@link TextDecorationAndState} + * @since 4.10.0 + */ + public final @NotNull TextDecorationAndState withState(final @NotNull TriState state) { + return new TextDecorationAndStateImpl(this, State.byTriState(state)); + } + @Override public void styleApply(final Style.@NotNull Builder style) { style.decorate(this); diff --git a/api/src/main/java/net/kyori/adventure/text/format/TextDecorationAndStateImpl.java b/api/src/main/java/net/kyori/adventure/text/format/TextDecorationAndStateImpl.java index 6a6c1662a..3318c8e75 100644 --- a/api/src/main/java/net/kyori/adventure/text/format/TextDecorationAndStateImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/format/TextDecorationAndStateImpl.java @@ -27,13 +27,17 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static java.util.Objects.requireNonNull; + final class TextDecorationAndStateImpl implements TextDecorationAndState { private final TextDecoration decoration; private final TextDecoration.State state; TextDecorationAndStateImpl(final TextDecoration decoration, final TextDecoration.State state) { + // no null check is required on the decoration since this constructor is always invoked in such a way that + // decoration is always non-null this.decoration = decoration; - this.state = state; + this.state = requireNonNull(state, "state"); } @Override diff --git a/api/src/test/java/net/kyori/adventure/text/format/StyleTest.java b/api/src/test/java/net/kyori/adventure/text/format/StyleTest.java index e42fe3caa..d3f3ae695 100644 --- a/api/src/test/java/net/kyori/adventure/text/format/StyleTest.java +++ b/api/src/test/java/net/kyori/adventure/text/format/StyleTest.java @@ -90,13 +90,13 @@ void testOfApplicables() { @Test void testOfTextDecorationAndState() { final Style s0 = Style.style( - TextDecoration.BOLD.as(TextDecoration.State.TRUE), - TextDecoration.ITALIC.as(TextDecoration.State.FALSE) + TextDecoration.BOLD.withState(TextDecoration.State.TRUE), + TextDecoration.ITALIC.withState(TextDecoration.State.FALSE) ); assertDecorations(s0, ImmutableSet.of(TextDecoration.BOLD), ImmutableSet.of(TextDecoration.ITALIC)); final Style s1 = Style.style( - TextDecoration.BOLD.as(true), - TextDecoration.ITALIC.as(false) + TextDecoration.BOLD.withState(true), + TextDecoration.ITALIC.withState(false) ); assertDecorations(s1, ImmutableSet.of(TextDecoration.BOLD), ImmutableSet.of(TextDecoration.ITALIC)); } @@ -104,13 +104,13 @@ void testOfTextDecorationAndState() { @Test void testOfTextDecorationAndStateOverridesWhenSame() { final Style s0 = Style.style( - TextDecoration.BOLD.as(TextDecoration.State.TRUE), - TextDecoration.BOLD.as(TextDecoration.State.FALSE) + TextDecoration.BOLD.withState(TextDecoration.State.TRUE), + TextDecoration.BOLD.withState(TextDecoration.State.FALSE) ); assertDecorations(s0, ImmutableSet.of(), ImmutableSet.of(TextDecoration.BOLD)); final Style s1 = Style.style( - TextDecoration.BOLD.as(true), - TextDecoration.BOLD.as(false) + TextDecoration.BOLD.withState(true), + TextDecoration.BOLD.withState(false) ); assertDecorations(s1, ImmutableSet.of(), ImmutableSet.of(TextDecoration.BOLD)); } diff --git a/api/src/test/java/net/kyori/adventure/text/format/TextDecorationTest.java b/api/src/test/java/net/kyori/adventure/text/format/TextDecorationTest.java index 3eabdb3d4..8b6f7055a 100644 --- a/api/src/test/java/net/kyori/adventure/text/format/TextDecorationTest.java +++ b/api/src/test/java/net/kyori/adventure/text/format/TextDecorationTest.java @@ -39,6 +39,12 @@ void testByBoolean() { assertEquals(TextDecoration.State.TRUE, TextDecoration.State.byBoolean(true)); } + @Test + void testWithStateThrowsOnNull() { + assertThrows(NullPointerException.class, () -> TextDecoration.BOLD.withState((TextDecoration.State) null)); + assertThrows(NullPointerException.class, () -> TextDecoration.BOLD.withState((TriState) null)); + } + @Test void testByTristate() { assertEquals(TextDecoration.State.NOT_SET, TextDecoration.State.byTriState(TriState.NOT_SET));