From 51611b3186b91b2739e0be88541da98e6afd3bc0 Mon Sep 17 00:00:00 2001 From: Strokkur24 Date: Mon, 6 Oct 2025 21:34:39 +0200 Subject: [PATCH 1/8] chore(nbt): modernize and remove deprecated methods --- .../net/kyori/adventure/nbt/BinaryTagIO.java | 140 ------------------ .../kyori/adventure/nbt/BinaryTagType.java | 10 +- .../kyori/adventure/nbt/BinaryTagTypes.java | 8 +- .../adventure/nbt/ByteArrayBinaryTag.java | 15 -- .../adventure/nbt/ByteArrayBinaryTagImpl.java | 4 +- .../kyori/adventure/nbt/ByteBinaryTag.java | 15 -- .../kyori/adventure/nbt/DoubleBinaryTag.java | 15 -- .../net/kyori/adventure/nbt/EndBinaryTag.java | 14 -- .../kyori/adventure/nbt/EndBinaryTagImpl.java | 5 - .../kyori/adventure/nbt/FloatBinaryTag.java | 15 -- .../adventure/nbt/IntArrayBinaryTag.java | 15 -- .../adventure/nbt/IntArrayBinaryTagImpl.java | 4 +- .../net/kyori/adventure/nbt/IntBinaryTag.java | 15 -- .../kyori/adventure/nbt/ListBinaryTag.java | 31 ---- .../adventure/nbt/ListBinaryTagImpl.java | 5 +- .../adventure/nbt/LongArrayBinaryTag.java | 15 -- .../adventure/nbt/LongArrayBinaryTagImpl.java | 4 +- .../kyori/adventure/nbt/LongBinaryTag.java | 15 -- .../kyori/adventure/nbt/ShortBinaryTag.java | 15 -- .../kyori/adventure/nbt/StringBinaryTag.java | 15 -- .../nbt/StringTagParseException.java | 3 +- .../net/kyori/adventure/nbt/TagStringIO.java | 12 -- .../kyori/adventure/nbt/TagStringReader.java | 34 ++--- .../kyori/adventure/nbt/TagStringWriter.java | 58 +++----- .../adventure/nbt/TrackingDataInput.java | 1 - 25 files changed, 53 insertions(+), 430 deletions(-) diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagIO.java b/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagIO.java index fdb2fa4301..7c5a489a42 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagIO.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagIO.java @@ -99,146 +99,6 @@ private BinaryTagIO() { return BinaryTagWriterImpl.INSTANCE; } - /** - * Reads a compound tag from {@code path}. - * - * @param path the path - * @return the compound tag - * @throws IOException if an exception was encountered while reading a compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #reader()} - */ - @Deprecated - public static @NotNull CompoundBinaryTag readPath(final @NotNull Path path) throws IOException { - return reader().read(path); - } - - /** - * Reads a compound tag from an input stream. The stream is not closed afterwards. - * - * @param input the input stream - * @return the compound tag - * @throws IOException if an exception was encountered while reading a compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #reader()} - */ - @Deprecated - public static @NotNull CompoundBinaryTag readInputStream(final @NotNull InputStream input) throws IOException { - return reader().read(input); - } - - /** - * Reads a compound tag from {@code path} using GZIP decompression. - * - * @param path the path - * @return the compound tag - * @throws IOException if an exception was encountered while reading a compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #reader()} - */ - @Deprecated - public static @NotNull CompoundBinaryTag readCompressedPath(final @NotNull Path path) throws IOException { - return reader().read(path, Compression.GZIP); - } - - /** - * Reads a compound tag from an input stream using GZIP decompression. The stream is not closed afterwards. - * - * @param input the input stream - * @return the compound tag - * @throws IOException if an exception was encountered while reading a compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #reader()} - */ - @Deprecated - public static @NotNull CompoundBinaryTag readCompressedInputStream(final @NotNull InputStream input) throws IOException { - return reader().read(input, Compression.GZIP); - } - - /** - * Reads a compound tag from {@code input}. - * - * @param input the input - * @return the compound tag - * @throws IOException if an exception was encountered while reading a compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #reader()} - */ - @Deprecated - public static @NotNull CompoundBinaryTag readDataInput(final @NotNull DataInput input) throws IOException { - return reader().read(input); - } - - /** - * Writes a compound tag to {@code path}. - * - * @param tag the compound tag - * @param path the path - * @throws IOException if an exception was encountered while writing the compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #writer()} - */ - @Deprecated - public static void writePath(final @NotNull CompoundBinaryTag tag, final @NotNull Path path) throws IOException { - writer().write(tag, path); - } - - /** - * Writes a compound tag to an output stream. The output stream will not be closed. - * - * @param tag the compound tag - * @param output the output stream - * @throws IOException if an exception was encountered while writing the compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #writer()} - */ - @Deprecated - public static void writeOutputStream(final @NotNull CompoundBinaryTag tag, final @NotNull OutputStream output) throws IOException { - writer().write(tag, output); - } - - /** - * Writes a compound tag to {@code path} using GZIP compression. - * - * @param tag the compound tag - * @param path the path - * @throws IOException if an exception was encountered while writing the compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #writer()} - */ - @Deprecated - public static void writeCompressedPath(final @NotNull CompoundBinaryTag tag, final @NotNull Path path) throws IOException { - writer().write(tag, path, Compression.GZIP); - } - - /** - * Writes a compound tag to an output stream using GZIP compression. The output stream is not closed afterwards. - * - * @param tag the compound tag - * @param output the output stream - * @throws IOException if an exception was encountered while writing the compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #writer()} - */ - @Deprecated - public static void writeCompressedOutputStream(final @NotNull CompoundBinaryTag tag, final @NotNull OutputStream output) throws IOException { - writer().write(tag, output, Compression.GZIP); - } - - /** - * Writes a compound tag to {@code output}. - * - * @param tag the compound tag - * @param output the output - * @throws IOException if an exception was encountered while writing the compound tag - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #writer()} - */ - @Deprecated - public static void writeDataOutput(final @NotNull CompoundBinaryTag tag, final @NotNull DataOutput output) throws IOException { - writer().write(tag, output); - } - /** * {@link CompoundBinaryTag} reader. * diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagType.java b/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagType.java index 7cd44af948..37c75ae001 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagType.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagType.java @@ -29,7 +29,6 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -78,8 +77,7 @@ static void writeUntyped(final BinaryTagType binaryTagType(final byte id) { - for (int i = 0; i < TYPES.size(); i++) { - final BinaryTagType type = TYPES.get(i); + for (final BinaryTagType type : TYPES) { if (type.id() == id) { return type; } @@ -87,12 +85,6 @@ static void writeUntyped(final BinaryTagType of(final byte id) { - return binaryTagType(id); - } - static @NotNull BinaryTagType register(final Class type, final byte id, final Reader reader, final @Nullable Writer writer) { return register(new Impl<>(type, id, reader, writer)); } diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagTypes.java b/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagTypes.java index bf3eb0e2b7..4efcd363be 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagTypes.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/BinaryTagTypes.java @@ -176,8 +176,8 @@ public final class BinaryTagTypes { final int[] value = IntArrayBinaryTagImpl.value(tag); final int length = value.length; output.writeInt(length); - for (int i = 0; i < length; i++) { - output.writeInt(value[i]); + for (final int j : value) { + output.writeInt(j); } }); /** @@ -200,8 +200,8 @@ public final class BinaryTagTypes { final long[] value = LongArrayBinaryTagImpl.value(tag); final int length = value.length; output.writeInt(length); - for (int i = 0; i < length; i++) { - output.writeLong(value[i]); + for (final long l : value) { + output.writeLong(l); } }); /** diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTag.java index 8cd9bd941c..5d4339cb6a 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -43,20 +42,6 @@ public interface ByteArrayBinaryTag extends ArrayBinaryTag, Iterable { return new ByteArrayBinaryTagImpl(value); } - /** - * Creates a binary tag holding a {@code byte}-array value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #byteArrayBinaryTag(byte...)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull ByteArrayBinaryTag of(final byte@NotNull... value) { - return new ByteArrayBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.BYTE_ARRAY; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTagImpl.java b/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTagImpl.java index 82e7c3fee8..30aa958022 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTagImpl.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/ByteArrayBinaryTagImpl.java @@ -79,8 +79,8 @@ public int hashCode() { } @Override - public Iterator iterator() { - return new Iterator() { + public @NotNull Iterator iterator() { + return new Iterator<>() { private int index; @Override diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/ByteBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/ByteBinaryTag.java index 57e4b615f6..48e777a4a6 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/ByteBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/ByteBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -63,20 +62,6 @@ public interface ByteBinaryTag extends NumberBinaryTag { } } - /** - * Creates a binary tag holding a {@code byte} value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #byteBinaryTag(byte)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull ByteBinaryTag of(final byte value) { - return byteBinaryTag(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.BYTE; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/DoubleBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/DoubleBinaryTag.java index 6a57c3e677..bb3b8c8b4b 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/DoubleBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/DoubleBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -43,20 +42,6 @@ public interface DoubleBinaryTag extends NumberBinaryTag { return new DoubleBinaryTagImpl(value); } - /** - * Creates a binary tag holding a {@code double} value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #doubleBinaryTag(double)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull DoubleBinaryTag of(final double value) { - return new DoubleBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.DOUBLE; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTag.java index 3c49da0d80..480ca63713 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -42,19 +41,6 @@ public interface EndBinaryTag extends BinaryTag { return EndBinaryTagImpl.INSTANCE; } - /** - * Gets the end tag. - * - * @return the end tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #endBinaryTag()} instead - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull EndBinaryTag get() { - return EndBinaryTagImpl.INSTANCE; - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.END; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTagImpl.java b/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTagImpl.java index 4d5c6dc7bb..16d5217bc0 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTagImpl.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/EndBinaryTagImpl.java @@ -26,11 +26,6 @@ final class EndBinaryTagImpl extends AbstractBinaryTag implements EndBinaryTag { static final EndBinaryTagImpl INSTANCE = new EndBinaryTagImpl(); - @Override - public boolean equals(final Object that) { - return this == that; - } - @Override public int hashCode() { return 0; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/FloatBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/FloatBinaryTag.java index e6e3c2111d..6c31edadbf 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/FloatBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/FloatBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -43,20 +42,6 @@ public interface FloatBinaryTag extends NumberBinaryTag { return new FloatBinaryTagImpl(value); } - /** - * Creates a binary tag holding a {@code float} value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #floatBinaryTag(float)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull FloatBinaryTag of(final float value) { - return new FloatBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.FLOAT; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTag.java index 973f78e412..1fe5caa807 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTag.java @@ -27,7 +27,6 @@ import java.util.Spliterator; import java.util.function.IntConsumer; import java.util.stream.IntStream; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -48,20 +47,6 @@ public interface IntArrayBinaryTag extends ArrayBinaryTag, Iterable { return new IntArrayBinaryTagImpl(value); } - /** - * Creates a binary tag holding an {@code int}-array value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #intArrayBinaryTag(int...)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull IntArrayBinaryTag of(final int@NotNull... value) { - return new IntArrayBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.INT_ARRAY; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTagImpl.java b/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTagImpl.java index 8e71c74298..5ee1860712 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTagImpl.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/IntArrayBinaryTagImpl.java @@ -91,8 +91,8 @@ public int nextInt() { @Override public void forEachInt(final @NotNull IntConsumer action) { - for (int i = 0, length = this.value.length; i < length; i++) { - action.accept(this.value[i]); + for (final int j : this.value) { + action.accept(j); } } diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/IntBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/IntBinaryTag.java index 5416899165..c02f0acc7e 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/IntBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/IntBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -43,20 +42,6 @@ public interface IntBinaryTag extends NumberBinaryTag { return new IntBinaryTagImpl(value); } - /** - * Creates a binary tag holding an {@code int} value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #intBinaryTag(int)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull IntBinaryTag of(final int value) { - return new IntBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.INT; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTag.java index 15b0da248e..eca20824c2 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTag.java @@ -28,7 +28,6 @@ import java.util.function.Consumer; import java.util.stream.Collector; import java.util.stream.Stream; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -153,24 +152,6 @@ public interface ListBinaryTag extends ListTagSetter, return new ListBinaryTagImpl(type, type == BinaryTagTypes.LIST_WILDCARD, new ArrayList<>(tags)); // explicitly copy } - /** - * Creates a tag. - * - *

If {@code tags} is empty, {@link #empty()} will be returned.

- * - * @param type the element type - * @param tags the elements - * @return a tag - * @throws IllegalArgumentException if {@code type} is {@link BinaryTagTypes#END} - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #listBinaryTag(BinaryTagType, List)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull ListBinaryTag of(final @NotNull BinaryTagType type, final @NotNull List tags) { - return listBinaryTag(type, tags); - } - /** * Create a {@link Collector} to consume streams of list tags. * @@ -204,18 +185,6 @@ public interface ListBinaryTag extends ListTagSetter, return BinaryTagTypes.LIST; } - /** - * Gets the type of element stored in this list. - * - * @return the type - * @since 4.0.0 - * @deprecated since 4.4.0, use {@link #elementType()} instead - */ - @Deprecated - default @NotNull BinaryTagType listType() { - return this.elementType(); - } - /** * Gets the type of element stored in this list. * diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTagImpl.java b/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTagImpl.java index 52f245e56c..9adf50baa3 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTagImpl.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/ListBinaryTagImpl.java @@ -217,7 +217,7 @@ private ListBinaryTag edit(final Consumer> consumer, final @Null @Override public @NotNull Iterator iterator() { final Iterator iterator = this.tags.iterator(); - return new Iterator() { + return new Iterator<>() { @Override public boolean hasNext() { return iterator.hasNext(); @@ -288,11 +288,10 @@ static CompoundBinaryTag box(final BinaryTag tag) { } private static boolean needsBox(final BinaryTag tag) { - if (!(tag instanceof CompoundBinaryTag)) { + if (!(tag instanceof final CompoundBinaryTag compound)) { return true; } - final CompoundBinaryTag compound = (CompoundBinaryTag) tag; return compound.size() == 1 && compound.get(WRAPPER_KEY) != null; } } diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTag.java index a23e59e5a7..ec1c45e995 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTag.java @@ -27,7 +27,6 @@ import java.util.Spliterator; import java.util.function.LongConsumer; import java.util.stream.LongStream; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -48,20 +47,6 @@ public interface LongArrayBinaryTag extends ArrayBinaryTag, Iterable { return new LongArrayBinaryTagImpl(value); } - /** - * Creates a binary tag holding a {@code long}-array value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #longArrayBinaryTag(long...)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull LongArrayBinaryTag of(final long@NotNull... value) { - return new LongArrayBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.LONG_ARRAY; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTagImpl.java b/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTagImpl.java index 0dbb2a9eef..ba236400ec 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTagImpl.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/LongArrayBinaryTagImpl.java @@ -91,8 +91,8 @@ public long nextLong() { @Override public void forEachLong(final @NotNull LongConsumer action) { - for (int i = 0, length = this.value.length; i < length; i++) { - action.accept(this.value[i]); + for (final long l : this.value) { + action.accept(l); } } diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/LongBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/LongBinaryTag.java index bd9075db4f..c3bf437ad9 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/LongBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/LongBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -43,20 +42,6 @@ public interface LongBinaryTag extends NumberBinaryTag { return new LongBinaryTagImpl(value); } - /** - * Creates a binary tag holding a {@code long} value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #longBinaryTag(long)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull LongBinaryTag of(final long value) { - return new LongBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.LONG; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/ShortBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/ShortBinaryTag.java index d2f1262709..d8bc92f016 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/ShortBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/ShortBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -43,20 +42,6 @@ public interface ShortBinaryTag extends NumberBinaryTag { return new ShortBinaryTagImpl(value); } - /** - * Creates a binary tag holding a {@code short} value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #shortBinaryTag(short)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull ShortBinaryTag of(final short value) { - return new ShortBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.SHORT; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/StringBinaryTag.java b/nbt/src/main/java/net/kyori/adventure/nbt/StringBinaryTag.java index afd00a9b83..6b1926af51 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/StringBinaryTag.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/StringBinaryTag.java @@ -23,7 +23,6 @@ */ package net.kyori.adventure.nbt; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -43,20 +42,6 @@ public interface StringBinaryTag extends BinaryTag { return new StringBinaryTagImpl(value); } - /** - * Creates a binary tag holding a {@link String} value. - * - * @param value the value - * @return a binary tag - * @since 4.0.0 - * @deprecated for removal since 4.14.0, use {@link #stringBinaryTag(String)} instead. - */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") - static @NotNull StringBinaryTag of(final @NotNull String value) { - return new StringBinaryTagImpl(value); - } - @Override default @NotNull BinaryTagType type() { return BinaryTagTypes.STRING; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/StringTagParseException.java b/nbt/src/main/java/net/kyori/adventure/nbt/StringTagParseException.java index b28010285b..5a4df8a13b 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/StringTagParseException.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/StringTagParseException.java @@ -24,12 +24,13 @@ package net.kyori.adventure.nbt; import java.io.IOException; +import java.io.Serial; /** * An exception thrown when parsing a string tag. */ class StringTagParseException extends IOException { - private static final long serialVersionUID = -3001637554903912905l; + private static final @Serial long serialVersionUID = -3001637554903912905L; private final CharSequence buffer; private final int position; diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/TagStringIO.java b/nbt/src/main/java/net/kyori/adventure/nbt/TagStringIO.java index 3c2c11e718..2f18eaa54d 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/TagStringIO.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/TagStringIO.java @@ -37,18 +37,6 @@ public final class TagStringIO { private static final TagStringIO INSTANCE = new TagStringIO(new Builder()); - /** - * Get an instance of {@link TagStringIO} that reads and writes using standard options. - * - * @return the basic instance - * @since 4.0.0 - * @deprecated For removal since 4.22.0, use {@link #tagStringIO()} instead - */ - @Deprecated - public static @NotNull TagStringIO get() { - return tagStringIO(); - } - /** * Gets an instance of {@link TagStringIO} that reads and writes using standard options. * diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/TagStringReader.java b/nbt/src/main/java/net/kyori/adventure/nbt/TagStringReader.java index 040fb989c1..be29a3ac76 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/TagStringReader.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/TagStringReader.java @@ -258,7 +258,7 @@ private BinaryTag scalar() throws StringTagParseException { } builder.append(current); } - if (builder.length() == 0) { + if (builder.isEmpty()) { throw this.buffer.makeError("Expected a value but got nothing"); } final String original = builder.toString(); // use unmodified string when number parsing fails @@ -354,29 +354,27 @@ private int extractRadix(final StringBuilder builder, final String original) { } private @Nullable NumberBinaryTag parseNumberTag(final String s, final char typeToken, final int radix, final boolean signed) { - switch (typeToken) { - case Tokens.TYPE_BYTE: - return ByteBinaryTag.byteBinaryTag(this.parseByte(s, radix, signed)); - case Tokens.TYPE_SHORT: - return ShortBinaryTag.shortBinaryTag(this.parseShort(s, radix, signed)); - case Tokens.TYPE_INT: - return IntBinaryTag.intBinaryTag(this.parseInt(s, radix, signed)); - case Tokens.TYPE_LONG: - return LongBinaryTag.longBinaryTag(this.parseLong(s, radix, signed)); - case Tokens.TYPE_FLOAT: + return switch (typeToken) { + case Tokens.TYPE_BYTE -> ByteBinaryTag.byteBinaryTag(this.parseByte(s, radix, signed)); + case Tokens.TYPE_SHORT -> ShortBinaryTag.shortBinaryTag(this.parseShort(s, radix, signed)); + case Tokens.TYPE_INT -> IntBinaryTag.intBinaryTag(this.parseInt(s, radix, signed)); + case Tokens.TYPE_LONG -> LongBinaryTag.longBinaryTag(this.parseLong(s, radix, signed)); + case Tokens.TYPE_FLOAT -> { final float floatValue = Float.parseFloat(s); if (Float.isFinite(floatValue)) { // don't accept NaN and Infinity - return FloatBinaryTag.floatBinaryTag(floatValue); + yield FloatBinaryTag.floatBinaryTag(floatValue); } - break; - case Tokens.TYPE_DOUBLE: + yield null; + } + case Tokens.TYPE_DOUBLE -> { final double doubleValue = Double.parseDouble(s); if (Double.isFinite(doubleValue)) { // don't accept NaN and Infinity - return DoubleBinaryTag.doubleBinaryTag(doubleValue); + yield DoubleBinaryTag.doubleBinaryTag(doubleValue); } - break; - } - return null; + yield null; + } + default -> null; + }; } private byte parseByte(final String s, final int radix, final boolean signed) { diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/TagStringWriter.java b/nbt/src/main/java/net/kyori/adventure/nbt/TagStringWriter.java index c3e7934bb8..8626e2d339 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/TagStringWriter.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/TagStringWriter.java @@ -61,35 +61,21 @@ public TagStringWriter heterogeneousLists(final boolean emitHeterogeneousLists) // NBT-specific public TagStringWriter writeTag(final BinaryTag tag) throws IOException { - final BinaryTagType type = tag.type(); - if (type == BinaryTagTypes.COMPOUND) { - return this.writeCompound((CompoundBinaryTag) tag); - } else if (type == BinaryTagTypes.LIST) { - return this.writeList((ListBinaryTag) tag); - } else if (type == BinaryTagTypes.BYTE_ARRAY) { - return this.writeByteArray((ByteArrayBinaryTag) tag); - } else if (type == BinaryTagTypes.INT_ARRAY) { - return this.writeIntArray((IntArrayBinaryTag) tag); - } else if (type == BinaryTagTypes.LONG_ARRAY) { - return this.writeLongArray((LongArrayBinaryTag) tag); - } else if (type == BinaryTagTypes.STRING) { - return this.value(((StringBinaryTag) tag).value(), Tokens.EOF); - } else if (type == BinaryTagTypes.BYTE) { - return this.value(Byte.toString(((ByteBinaryTag) tag).value()), Tokens.TYPE_BYTE); - } else if (type == BinaryTagTypes.SHORT) { - return this.value(Short.toString(((ShortBinaryTag) tag).value()), Tokens.TYPE_SHORT); - } else if (type == BinaryTagTypes.INT) { - return this.value(Integer.toString(((IntBinaryTag) tag).value()), Tokens.TYPE_INT); - } else if (type == BinaryTagTypes.LONG) { - return this.value(Long.toString(((LongBinaryTag) tag).value()), Character.toUpperCase(Tokens.TYPE_LONG)); // special-case - } else if (type == BinaryTagTypes.FLOAT) { - return this.value(Float.toString(((FloatBinaryTag) tag).value()), Tokens.TYPE_FLOAT); - } else if (type == BinaryTagTypes.DOUBLE) { - return this.value(Double.toString(((DoubleBinaryTag) tag).value()), Tokens.TYPE_DOUBLE); - } else { - throw new IOException("Unknown tag type: " + type); - // unknown! - } + return switch (tag) { + case CompoundBinaryTag compoundTag -> this.writeCompound(compoundTag); + case ListBinaryTag listTag -> this.writeList(listTag); + case ByteArrayBinaryTag byteArrayTag -> this.writeByteArray(byteArrayTag); + case IntArrayBinaryTag intArrayTag -> this.writeIntArray(intArrayTag); + case LongArrayBinaryTag longArrayTag -> this.writeLongArray(longArrayTag); + case StringBinaryTag stringTag -> this.value((stringTag).value(), Tokens.EOF); + case ByteBinaryTag byteTag -> this.value(Byte.toString((byteTag).value()), Tokens.TYPE_BYTE); + case ShortBinaryTag shortTag -> this.value(Short.toString((shortTag).value()), Tokens.TYPE_SHORT); + case IntBinaryTag intTag -> this.value(Integer.toString((intTag).value()), Tokens.TYPE_INT); + case LongBinaryTag longTag -> this.value(Long.toString((longTag).value()), Character.toUpperCase(Tokens.TYPE_LONG)); // special-case + case FloatBinaryTag floatTag -> this.value(Float.toString((floatTag).value()), Tokens.TYPE_FLOAT); + case DoubleBinaryTag doubleTag -> this.value(Double.toString((doubleTag).value()), Tokens.TYPE_DOUBLE); + default -> throw new IOException("Unknown tag type: " + tag.type()); + }; } private TagStringWriter writeCompound(final CompoundBinaryTag tag) throws IOException { @@ -131,9 +117,9 @@ private TagStringWriter writeByteArray(final ByteArrayBinaryTag tag) throws IOEx final char byteArrayType = Character.toUpperCase(Tokens.TYPE_BYTE); // special case to match vanilla format final byte[] value = ByteArrayBinaryTagImpl.value(tag); - for (int i = 0, length = value.length; i < length; i++) { + for (final byte b : value) { this.printAndResetSeparator(true); - this.value(Byte.toString(value[i]), byteArrayType); + this.value(Byte.toString(b), byteArrayType); } this.endArray(); return this; @@ -147,9 +133,9 @@ private TagStringWriter writeIntArray(final IntArrayBinaryTag tag) throws IOExce } final int[] value = IntArrayBinaryTagImpl.value(tag); - for (int i = 0, length = value.length; i < length; i++) { + for (final int j : value) { this.printAndResetSeparator(true); - this.value(Integer.toString(value[i]), Tokens.TYPE_INT); + this.value(Integer.toString(j), Tokens.TYPE_INT); } this.endArray(); return this; @@ -162,9 +148,9 @@ private TagStringWriter writeLongArray(final LongArrayBinaryTag tag) throws IOEx this.beginArray(Tokens.TYPE_LONG); final long[] value = LongArrayBinaryTagImpl.value(tag); - for (int i = 0, length = value.length; i < length; i++) { + for (final long l : value) { this.printAndResetSeparator(true); - this.value(Long.toString(value[i]), Tokens.TYPE_LONG); + this.value(Long.toString(l), Tokens.TYPE_LONG); } this.endArray(); return this; @@ -293,7 +279,7 @@ private boolean breakListElement(final BinaryTagType type) { } private boolean prettyPrinting() { - return this.indent.length() > 0; + return !this.indent.isEmpty(); } private void newlineIndent() throws IOException { diff --git a/nbt/src/main/java/net/kyori/adventure/nbt/TrackingDataInput.java b/nbt/src/main/java/net/kyori/adventure/nbt/TrackingDataInput.java index 251a8321a5..37dc00d81c 100644 --- a/nbt/src/main/java/net/kyori/adventure/nbt/TrackingDataInput.java +++ b/nbt/src/main/java/net/kyori/adventure/nbt/TrackingDataInput.java @@ -182,5 +182,4 @@ public double readDouble() throws IOException { public void close() throws IOException { this.exit(); } - } From b76d666231920d7503705c621efceb0218ab7b2a Mon Sep 17 00:00:00 2001 From: Strokkur24 Date: Mon, 6 Oct 2025 21:57:20 +0200 Subject: [PATCH 2/8] chore(configurate-4): cleanup code --- .../configurate4/ComponentTypeSerializer.java | 23 +++++++----------- .../configurate4/KeySerializer.java | 4 ++-- .../configurate4/TextColorSerializer.java | 8 +++---- .../TranslationArgumentTypeSerializer.java | 24 ++++++++----------- 4 files changed, 25 insertions(+), 34 deletions(-) diff --git a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/ComponentTypeSerializer.java b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/ComponentTypeSerializer.java index 0057c8280a..bb8cdef02c 100644 --- a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/ComponentTypeSerializer.java +++ b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/ComponentTypeSerializer.java @@ -81,6 +81,7 @@ import static net.kyori.adventure.text.serializer.commons.ComponentTreeConstants.TRANSLATE_FALLBACK; import static net.kyori.adventure.text.serializer.commons.ComponentTreeConstants.TRANSLATE_WITH; +@SuppressWarnings("ClassCanBeRecord") final class ComponentTypeSerializer implements TypeSerializer { static final TypeToken> LIST_TYPE = new TypeToken>() {}; static final TypeToken> PROPERTY_LIST_TYPE = new TypeToken>() {}; @@ -264,8 +265,7 @@ public void serialize(final @NotNull Type type, final @Nullable Component src, f } if (src instanceof TextComponent) { value.node(TEXT).set(((TextComponent) src).content()); - } else if (src instanceof TranslatableComponent) { - final TranslatableComponent tc = (TranslatableComponent) src; + } else if (src instanceof final TranslatableComponent tc) { value.node(TRANSLATE).set(tc.key()); if (!tc.arguments().isEmpty()) { final ConfigurationNode with = value.node(TRANSLATE_WITH); @@ -274,8 +274,7 @@ public void serialize(final @NotNull Type type, final @Nullable Component src, f } } value.node(TRANSLATE_FALLBACK).set(tc.fallback()); - } else if (src instanceof ScoreComponent) { - final ScoreComponent sc = (ScoreComponent) src; + } else if (src instanceof final ScoreComponent sc) { final ConfigurationNode score = value.node(SCORE); score.node(SCORE_NAME).set(sc.name()); score.node(SCORE_OBJECTIVE).set(sc.objective()); @@ -287,18 +286,14 @@ public void serialize(final @NotNull Type type, final @Nullable Component src, f value.node(SELECTOR).set(((SelectorComponent) src).pattern()); } else if (src instanceof KeybindComponent) { value.node(KEYBIND).set(((KeybindComponent) src).keybind()); - } else if (src instanceof NBTComponent) { - final NBTComponent nc = (NBTComponent) src; + } else if (src instanceof final NBTComponent nc) { value.node(NBT).set(nc.nbtPath()); value.node(NBT_INTERPRET).set(nc.interpret()); - if (src instanceof BlockNBTComponent) { - value.node(NBT_BLOCK).set(BlockNBTPosSerializer.INSTANCE.type(), ((BlockNBTComponent) nc).pos()); - } else if (src instanceof EntityNBTComponent) { - value.node(NBT_ENTITY).set(((EntityNBTComponent) nc).selector()); - } else if (src instanceof StorageNBTComponent) { - value.node(NBT_STORAGE).set(KeySerializer.INSTANCE.type(), ((StorageNBTComponent) nc).storage()); - } else { - throw notSureHowToSerialize(src); + switch (src) { + case BlockNBTComponent blockNBTComponent -> value.node(NBT_BLOCK).set(BlockNBTPosSerializer.INSTANCE.type(), blockNBTComponent.pos()); + case EntityNBTComponent ignored -> value.node(NBT_ENTITY).set(((EntityNBTComponent) nc).selector()); + case StorageNBTComponent storageNBTComponent -> value.node(NBT_STORAGE).set(KeySerializer.INSTANCE.type(), storageNBTComponent.storage()); + default -> throw notSureHowToSerialize(src); } } else if (src instanceof ObjectComponent) { final ObjectComponent objectComponent = (ObjectComponent) src; diff --git a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/KeySerializer.java b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/KeySerializer.java index fb9fd094a7..dd9028bc7f 100644 --- a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/KeySerializer.java +++ b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/KeySerializer.java @@ -41,11 +41,11 @@ private KeySerializer() { @Override public @NotNull Key deserialize(final @NotNull Type type, final @NotNull Object obj) throws SerializationException { - if (!(obj instanceof CharSequence)) { + if (!(obj instanceof CharSequence seq)) { throw new CoercionFailedException(obj, "string"); } try { - return Key.key(obj.toString()); + return Key.key(seq.toString()); } catch (final InvalidKeyException ex) { throw new SerializationException(ex); } diff --git a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TextColorSerializer.java b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TextColorSerializer.java index a94dc5cefd..bc870a33df 100644 --- a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TextColorSerializer.java +++ b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TextColorSerializer.java @@ -40,8 +40,8 @@ private TextColorSerializer() { @Override public TextColor deserialize(final @NotNull Type type, final @NotNull Object obj) throws SerializationException { - if (obj instanceof Number) { // numerical values - return TextColor.color(((Number) obj).intValue()); + if (obj instanceof Number num) { // numerical values + return TextColor.color(num.intValue()); } else if (!(obj instanceof CharSequence)) { throw new SerializationException("Text colors must either be strings or integers"); } @@ -60,8 +60,8 @@ public TextColor deserialize(final @NotNull Type type, final @NotNull Object obj @Override public Object serialize(final @NotNull TextColor item, final @NotNull Predicate> typeSupported) { - if (item instanceof NamedTextColor) { // TODO: Downsampling - return NamedTextColor.NAMES.key((NamedTextColor) item); + if (item instanceof NamedTextColor namedTextColor) { // TODO: Downsampling + return NamedTextColor.NAMES.key(namedTextColor); } else { return item.asHexString(); } diff --git a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TranslationArgumentTypeSerializer.java b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TranslationArgumentTypeSerializer.java index ed37ef18a0..039f42c2d8 100644 --- a/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TranslationArgumentTypeSerializer.java +++ b/serializer-configurate4/src/main/java/net/kyori/adventure/serializer/configurate4/TranslationArgumentTypeSerializer.java @@ -39,14 +39,11 @@ private TranslationArgumentTypeSerializer() { @Override public TranslationArgument deserialize(final Type type, final ConfigurationNode node) throws SerializationException { - final Object raw = node.rawScalar(); - if (raw instanceof Boolean) { - return TranslationArgument.bool((Boolean) raw); - } else if (raw instanceof Number) { - return TranslationArgument.numeric((Number) raw); - } else { - return TranslationArgument.component(node.require(Component.class)); - } + return switch (node.rawScalar()) { + case Boolean bool -> TranslationArgument.bool(bool); + case Number number -> TranslationArgument.numeric(number); + default -> TranslationArgument.component(node.require(Component.class)); + }; } @Override @@ -57,12 +54,11 @@ public void serialize(final Type type, final @Nullable TranslationArgument obj, } final Object value = obj.value(); - if (value instanceof Boolean || value instanceof Number) { - node.set(value); - } else if (value instanceof Component) { - node.set(Component.class, value); - } else { - throw new SerializationException(node, type, "Unknown translation arg value of type " + value.getClass() + ": " + value); + switch (obj.value()) { + case Boolean bool -> node.set(bool); + case Number num -> node.set(num); + case Component component -> node.set(Component.class, component); + default -> throw new SerializationException(node, type, "Unknown translation arg value of type " + value.getClass() + ": " + value); } } } From d310e9f61cdd1dc7e179a595b397c023c1afe47d Mon Sep 17 00:00:00 2001 From: Strokkur24 Date: Mon, 6 Oct 2025 22:44:12 +0200 Subject: [PATCH 3/8] chore(minimessage): modernize some code --- .../text/minimessage/ArgumentQueueImpl.java | 4 +- .../adventure/text/minimessage/Context.java | 9 ++-- .../text/minimessage/ContextImpl.java | 3 +- .../text/minimessage/MiniMessageParser.java | 11 ++-- .../minimessage/MiniMessageSerializer.java | 1 - .../text/minimessage/ParsingException.java | 4 +- .../internal/parser/ParsingExceptionImpl.java | 3 +- .../minimessage/internal/parser/Token.java | 3 +- .../internal/parser/TokenParser.java | 26 +++++----- .../internal/parser/node/ElementNode.java | 2 +- .../internal/parser/node/ValueNode.java | 2 +- .../internal/serializer/StyleClaimImpl.java | 3 +- .../internal/serializer/package-info.java | 4 +- .../text/minimessage/tag/AbstractTag.java | 2 +- .../text/minimessage/tag/Inserting.java | 2 +- .../text/minimessage/tag/InsertingImpl.java | 3 +- .../text/minimessage/tag/Modifying.java | 2 +- .../text/minimessage/tag/ParserDirective.java | 10 +--- .../text/minimessage/tag/PreProcess.java | 2 +- .../minimessage/tag/ResetParserDirective.java | 11 ++++ .../text/minimessage/tag/StylingTagImpl.java | 3 +- .../adventure/text/minimessage/tag/Tag.java | 6 +-- .../tag/resolver/ArgumentQueue.java | 5 +- .../minimessage/tag/resolver/Formatter.java | 1 - .../tag/resolver/SequentialTagResolver.java | 13 +++-- .../tag/resolver/SingleResolver.java | 41 +-------------- .../minimessage/tag/resolver/TagResolver.java | 3 +- .../tag/resolver/TagResolverBuilderImpl.java | 29 ++++++----- .../standard/AbstractColorChangingTag.java | 16 ++---- .../tag/standard/ColorTagResolver.java | 4 +- .../minimessage/tag/standard/HoverTag.java | 13 ++--- .../minimessage/tag/standard/KeybindTag.java | 1 - .../text/minimessage/tag/standard/NbtTag.java | 52 ++++++++++--------- .../minimessage/tag/standard/PrideTag.java | 52 +++++++++---------- .../minimessage/tag/standard/RainbowTag.java | 2 +- .../minimessage/tag/standard/ResetTag.java | 2 +- .../minimessage/tag/standard/ScoreTag.java | 5 +- .../minimessage/tag/standard/SelectorTag.java | 3 +- .../tag/standard/TranslatableFallbackTag.java | 10 ++-- .../tag/standard/TranslatableTag.java | 18 +------ .../minimessage/translation/Argument.java | 14 ----- .../translation/LocalePointered.java | 8 ++- .../MiniMessageTranslationStore.java | 3 +- .../translation/MiniMessageTranslator.java | 37 +++++++------ .../MiniMessageTranslatorArgument.java | 4 +- .../adventure/text/minimessage/tree/Node.java | 9 ++-- .../text/minimessage/AbstractTest.java | 7 +-- .../minimessage/MiniMessageParserTest.java | 30 ++++++----- .../MiniMessageSerializerTest.java | 1 - .../text/minimessage/MiniMessageTest.java | 36 +++++++------ .../minimessage/SerializerCollectorTest.java | 2 +- .../text/minimessage/tag/TagResolverTest.java | 11 ++-- 52 files changed, 228 insertions(+), 320 deletions(-) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ResetParserDirective.java diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ArgumentQueueImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ArgumentQueueImpl.java index d320c8198d..3cd5e2b6a0 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ArgumentQueueImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ArgumentQueueImpl.java @@ -27,12 +27,14 @@ import java.util.function.Supplier; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static java.util.Objects.requireNonNull; -final class ArgumentQueueImpl implements ArgumentQueue { +@ApiStatus.Internal +public final class ArgumentQueueImpl implements ArgumentQueue { private final Context context; final List args; private int ptr = 0; diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java index 078979669c..12b4dd0560 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/Context.java @@ -38,8 +38,7 @@ * * @since 4.10.0 */ -@ApiStatus.NonExtendable -public interface Context { +public sealed interface Context permits ContextImpl { /** * The target of the parse context, if provided. @@ -48,7 +47,7 @@ public interface Context { * @return the target, if provided * @since 4.17.0 */ - public @Nullable Pointered target(); + @Nullable Pointered target(); /** * The target of the parse context. @@ -59,7 +58,7 @@ public interface Context { * @return the target, if provided * @since 4.17.0 */ - public @NotNull Pointered targetOrThrow(); + @NotNull Pointered targetOrThrow(); /** * The target of the parse context, casted to a provided type. @@ -73,7 +72,7 @@ public interface Context { * @return the target * @since 4.17.0 */ - public @NotNull T targetAsType(final @NotNull Class targetClass); + @NotNull T targetAsType(final @NotNull Class targetClass); /** * Deserializes a MiniMessage string using all the settings of this context. diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java index 4b59800c40..437befccfb 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ContextImpl.java @@ -45,7 +45,7 @@ * * @since 4.10.0 */ -class ContextImpl implements Context { +final class ContextImpl implements Context { private static final Token[] EMPTY_TOKEN_ARRAY = new Token[0]; private final boolean strict; @@ -185,5 +185,4 @@ private static Token[] tagsToTokens(final List tags) { } return tokens; } - } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageParser.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageParser.java index 45742289b8..8a72cdd8d1 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageParser.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageParser.java @@ -112,7 +112,7 @@ private void processTokens(final @NotNull StringBuilder sb, final @NotNull Strin sb.append(richMessage, token.startIndex(), token.endIndex()); continue; } - final String sanitized = TokenParser.TagProvider.sanitizePlaceholderName(token.childTokens().get(0).get(richMessage).toString()); + final String sanitized = TokenParser.TagProvider.sanitizePlaceholderName(token.childTokens().getFirst().get(richMessage).toString()); if (combinedResolver.has(sanitized)) { tagHandler.accept(token, sb); } else { @@ -164,8 +164,7 @@ private void processTokens(final @NotNull StringBuilder sb, final @NotNull Strin return transformation; } catch (final ParsingException e) { - if (token != null && e instanceof ParsingExceptionImpl) { - final ParsingExceptionImpl impl = (ParsingExceptionImpl) e; + if (token != null && e instanceof final ParsingExceptionImpl impl) { if (impl.tokens().length == 0) { impl.tokens(new Token[] {token}); } @@ -215,14 +214,12 @@ private void processTokens(final @NotNull StringBuilder sb, final @NotNull Strin Tag tag = null; if (node instanceof ValueNode) { comp = Component.text(((ValueNode) node).value()); - } else if (node instanceof TagNode) { - final TagNode tagNode = (TagNode) node; + } else if (node instanceof final TagNode tagNode) { tag = tagNode.tag(); // special case for gradient and stuff - if (tag instanceof Modifying) { - final Modifying modTransformation = (Modifying) tag; + if (tag instanceof final Modifying modTransformation) { // first walk the tree this.visitModifying(modTransformation, tagNode, 0); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageSerializer.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageSerializer.java index db385cd5e2..c450a8905f 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageSerializer.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/MiniMessageSerializer.java @@ -355,5 +355,4 @@ public boolean styleClaimed(final @NotNull String claimId) { return ret; } } - } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ParsingException.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ParsingException.java index 09bff8039a..3308a69d41 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ParsingException.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ParsingException.java @@ -27,6 +27,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.Serial; + /** * An exception thrown when an error occurs while parsing a MiniMessage string. * @@ -34,7 +36,7 @@ */ @ApiStatus.NonExtendable public abstract class ParsingException extends RuntimeException { - private static final long serialVersionUID = 4502774670340827070L; + private static final @Serial long serialVersionUID = 4502774670340827070L; public static final int LOCATION_UNKNOWN = -1; diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/ParsingExceptionImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/ParsingExceptionImpl.java index 87ffef97f8..dfc25db72a 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/ParsingExceptionImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/ParsingExceptionImpl.java @@ -23,6 +23,7 @@ */ package net.kyori.adventure.text.minimessage.internal.parser; +import java.io.Serial; import java.util.Arrays; import net.kyori.adventure.text.minimessage.ParsingException; import org.jetbrains.annotations.ApiStatus; @@ -36,7 +37,7 @@ */ @ApiStatus.Internal public class ParsingExceptionImpl extends ParsingException { - private static final long serialVersionUID = 2507190809441787202L; + private static final @Serial long serialVersionUID = 2507190809441787202L; private final String originalText; private Token @NotNull [] tokens; diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/Token.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/Token.java index e2f5960a83..85f9328873 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/Token.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/Token.java @@ -130,8 +130,7 @@ public CharSequence get(final CharSequence message) { @Override public boolean equals(final Object other) { if (this == other) return true; - if (!(other instanceof Token)) return false; - final Token that = (Token) other; + if (!(other instanceof final Token that)) return false; return this.startIndex == that.startIndex && this.endIndex == that.endIndex && this.type == that.type; } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/TokenParser.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/TokenParser.java index fff63081ab..84dfee3ccc 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/TokenParser.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/TokenParser.java @@ -319,16 +319,14 @@ private static void parseSecondPass(final String message, final List toke if (codePoint == ESCAPE && i + 1 < message.length()) { final int nextCodePoint = message.codePointAt(i + 1); - switch (state) { - case NORMAL: + escaped = switch (state) { + case NORMAL -> // allow escaping open tokens - escaped = nextCodePoint == TAG_START || nextCodePoint == ESCAPE; - break; - case STRING: + nextCodePoint == TAG_START || nextCodePoint == ESCAPE; + case STRING -> // allow escaping closing string chars - escaped = currentStringChar == nextCodePoint || nextCodePoint == ESCAPE; - break; - } + currentStringChar == nextCodePoint || nextCodePoint == ESCAPE; + }; // only escape if we need to if (escaped) { @@ -372,7 +370,7 @@ private static void parseSecondPass(final String message, final List toke if (token.childTokens() == null || token.childTokens().isEmpty()) { insert(token, new Token(startIndex, endIndex, TokenType.TAG_VALUE)); } else { - final int end = token.childTokens().get(token.childTokens().size() - 1).endIndex(); + final int end = token.childTokens().getLast().endIndex(); if (end != endIndex) { insert(token, new Token(end + 1, endIndex, TokenType.TAG_VALUE)); } @@ -404,7 +402,7 @@ private static RootNode buildTree( case OPEN_TAG: case OPEN_CLOSE_TAG: // Check if this even is a valid tag - final Token tagNamePart = token.childTokens().get(0); + final Token tagNamePart = token.childTokens().getFirst(); final String tagName = message.substring(tagNamePart.startIndex(), tagNamePart.endIndex()); if (!TagInternals.sanitizeAndCheckValidTagName(tagName)) { // This wouldn't be a valid tag, just parse it as text instead! @@ -452,7 +450,7 @@ private static RootNode buildTree( closeValues.add(TagPart.unquoteAndEscape(message, childToken.startIndex(), childToken.endIndex())); } - final String closeTagName = closeValues.get(0); + final String closeTagName = closeValues.getFirst(); if (tagNameChecker.test(closeTagName)) { final Tag tag = tagProvider.resolve(closeTagName); @@ -474,7 +472,7 @@ private static RootNode buildTree( if (tagCloses(closeValues, openParts)) { if (parentNode != node && strict) { final String msg = "Unclosed tag encountered; " + ((TagNode) node).name() + " is not closed, because " + - closeValues.get(0) + " was closed first."; + closeValues.getFirst() + " was closed first."; throw new ParsingExceptionImpl(msg, message, parentNode.token(), node.token(), token); } @@ -552,7 +550,7 @@ private static boolean tagCloses(final List closeParts, final List list = new ArrayList<>(3); - list.add(token.childTokens().get(0)); + list.add(token.childTokens().getFirst()); list.add(value); token.childTokens(list); } else { diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ElementNode.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ElementNode.java index c855e06d1e..9a3b5c5c64 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ElementNode.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ElementNode.java @@ -38,7 +38,7 @@ * * @since 4.10.0 */ -public class ElementNode implements Node { +public sealed class ElementNode implements Node permits RootNode, TagNode, ValueNode { private final @Nullable ElementNode parent; private final @Nullable Token token; private final String sourceMessage; diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ValueNode.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ValueNode.java index 1d241ab6e9..bc5e968c62 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ValueNode.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/parser/node/ValueNode.java @@ -34,7 +34,7 @@ * @since 4.10.0 */ -public abstract class ValueNode extends ElementNode { +public sealed abstract class ValueNode extends ElementNode permits TextNode { private final String value; /** diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/StyleClaimImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/StyleClaimImpl.java index 6cb901802f..3e63f318af 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/StyleClaimImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/StyleClaimImpl.java @@ -65,8 +65,7 @@ public int hashCode() { @Override public boolean equals(final @Nullable Object other) { if (this == other) return true; - if (!(other instanceof StyleClaimImpl)) return false; - final StyleClaimImpl that = (StyleClaimImpl) other; + if (!(other instanceof final StyleClaimImpl that)) return false; return Objects.equals(this.claimKey, that.claimKey); } } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/package-info.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/package-info.java index b7293ef48d..2afeb7e77b 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/package-info.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/internal/serializer/package-info.java @@ -28,5 +28,7 @@ * * @since 4.10.0 */ -@org.jetbrains.annotations.ApiStatus.Internal +@ApiStatus.Internal package net.kyori.adventure.text.minimessage.internal.serializer; + +import org.jetbrains.annotations.ApiStatus; diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/AbstractTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/AbstractTag.java index 3c42af194c..2b199b3b65 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/AbstractTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/AbstractTag.java @@ -26,7 +26,7 @@ import net.kyori.adventure.internal.Internals; import net.kyori.examination.Examinable; -abstract /* non-sealed */ class AbstractTag implements Tag, Examinable { +abstract non-sealed class AbstractTag implements Tag, Examinable { @Override public final String toString() { return Internals.toString(this); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Inserting.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Inserting.java index bf5f1dd15f..67d402c484 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Inserting.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Inserting.java @@ -31,7 +31,7 @@ * * @since 4.10.0 */ -public /* non-sealed */ interface Inserting extends Tag { +public non-sealed interface Inserting extends Tag { /** * Returns the component this tag produces. * diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/InsertingImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/InsertingImpl.java index 62974a8fce..fc5eac8968 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/InsertingImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/InsertingImpl.java @@ -57,8 +57,7 @@ public int hashCode() { @Override public boolean equals(final @Nullable Object other) { if (this == other) return true; - if (!(other instanceof InsertingImpl)) return false; - final InsertingImpl that = (InsertingImpl) other; + if (!(other instanceof final InsertingImpl that)) return false; return this.allowsChildren == that.allowsChildren && Objects.equals(this.value, that.value); } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Modifying.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Modifying.java index 7502ade7f7..b6e81b33b4 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Modifying.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Modifying.java @@ -34,7 +34,7 @@ * @since 4.10.0 */ @ApiStatus.OverrideOnly -public /* non-sealed */ interface Modifying extends Tag { +public non-sealed interface Modifying extends Tag { /** * Method called once for every element in the subtree, allowing calculations to be made before {@link #apply(Component, int) application}. * diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ParserDirective.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ParserDirective.java index 03c5e4cde5..207292e8e8 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ParserDirective.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ParserDirective.java @@ -31,8 +31,7 @@ * @see #RESET * @since 4.10.0 */ -@ApiStatus.NonExtendable -public /* sealed */ interface ParserDirective extends Tag { +public sealed interface ParserDirective extends Tag permits ResetParserDirective { /** * Instructs the parser to reset all style, events, insertions, etc. * @@ -41,10 +40,5 @@ * * @since 4.10.0 */ - Tag RESET = new ParserDirective() { - @Override - public String toString() { - return "ParserDirective.RESET"; - } - }; + Tag RESET = new ResetParserDirective(); } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/PreProcess.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/PreProcess.java index 1f87ee0643..8e36e94f5d 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/PreProcess.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/PreProcess.java @@ -32,7 +32,7 @@ * * @since 4.10.0 */ -public /* non-sealed */ interface PreProcess extends Tag { +public non-sealed interface PreProcess extends Tag { /** * The value to insert at the pre-process phase. * diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ResetParserDirective.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ResetParserDirective.java new file mode 100644 index 0000000000..f70338215a --- /dev/null +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ResetParserDirective.java @@ -0,0 +1,11 @@ +package net.kyori.adventure.text.minimessage.tag; + +final class ResetParserDirective implements ParserDirective { + @Override + public String toString() { + return "ParserDirective.RESET"; + } + + ResetParserDirective() { + } +} diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/StylingTagImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/StylingTagImpl.java index 429dd3587f..38f4f9e1aa 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/StylingTagImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/StylingTagImpl.java @@ -52,8 +52,7 @@ public int hashCode() { @Override public boolean equals(final @Nullable Object other) { if (this == other) return true; - if (!(other instanceof StylingTagImpl)) return false; - final StylingTagImpl that = (StylingTagImpl) other; + if (!(other instanceof final StylingTagImpl that)) return false; return Arrays.equals(this.styles, that.styles); } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Tag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Tag.java index 26048d3fcd..a9fdd7aed0 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Tag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Tag.java @@ -32,6 +32,7 @@ import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.StyleBuilderApplicable; +import net.kyori.adventure.text.minimessage.internal.parser.node.TagPart; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -45,7 +46,7 @@ * * @since 4.10.0 */ -public /* sealed */ interface Tag /* permits Inserting, Modifying, ParserDirective, PreProcess, /internal/ AbstractTag */ { +public sealed interface Tag permits Inserting, Modifying, ParserDirective, PreProcess, /* internal */ AbstractTag { /** * Create a tag that inserts the content literally into the parse string. @@ -143,8 +144,7 @@ * * @since 4.10.0 */ - @ApiStatus.NonExtendable - interface Argument { + sealed interface Argument permits TagPart { /** * Returns the value of this argument. * diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/ArgumentQueue.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/ArgumentQueue.java index e54f2ce105..5d25c75e94 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/ArgumentQueue.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/ArgumentQueue.java @@ -24,6 +24,8 @@ package net.kyori.adventure.text.minimessage.tag.resolver; import java.util.function.Supplier; + +import net.kyori.adventure.text.minimessage.ArgumentQueueImpl; import net.kyori.adventure.text.minimessage.tag.Tag; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -34,8 +36,7 @@ * * @since 4.10.0 */ -@ApiStatus.NonExtendable -public interface ArgumentQueue { +public sealed interface ArgumentQueue permits ArgumentQueueImpl { /** * Pop an argument, throwing an exception if no argument was present. * diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/Formatter.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/Formatter.java index 8d4579dba7..c22d6484f8 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/Formatter.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/Formatter.java @@ -201,5 +201,4 @@ public static TagResolver joining(@TagPattern final @NotNull String key, final @ public static TagResolver joining(@TagPattern final @NotNull String key, final @NotNull ComponentLike@NotNull... components) { return joining(key, Arrays.asList(components)); } - } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SequentialTagResolver.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SequentialTagResolver.java index 856b716684..b8d88eba54 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SequentialTagResolver.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SequentialTagResolver.java @@ -33,10 +33,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -final class SequentialTagResolver implements TagResolver, SerializableResolver { - final TagResolver[] resolvers; - - SequentialTagResolver(final @NotNull TagResolver@NotNull[] resolvers) { +record SequentialTagResolver(TagResolver[] resolvers) implements TagResolver, SerializableResolver { + SequentialTagResolver(final @NotNull TagResolver @NotNull [] resolvers) { this.resolvers = resolvers; } @@ -48,7 +46,9 @@ final class SequentialTagResolver implements TagResolver, SerializableResolver { if (!resolver.has(name)) continue; final @Nullable Tag placeholder = resolver.resolve(name, arguments, ctx); - if (placeholder != null) return placeholder; + if (placeholder != null) { + return placeholder; + } } catch (final ParsingException ex) { arguments.reset(); if (thrown == null) { @@ -97,10 +97,9 @@ public boolean equals(final @Nullable Object other) { if (other == this) { return true; } - if (!(other instanceof SequentialTagResolver)) { + if (!(other instanceof final SequentialTagResolver that)) { return false; } - final SequentialTagResolver that = (SequentialTagResolver) other; return Arrays.equals(this.resolvers, that.resolvers); } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SingleResolver.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SingleResolver.java index ddbce9920f..7e52f9c337 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SingleResolver.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SingleResolver.java @@ -28,25 +28,7 @@ import net.kyori.adventure.text.minimessage.tag.Tag; import org.jetbrains.annotations.NotNull; -final class SingleResolver implements TagResolver.Single, MappableResolver { - private final String key; - private final Tag tag; - - SingleResolver(final String key, final Tag tag) { - this.key = key; - this.tag = tag; - } - - @Override - public @NotNull String key() { - return this.key; - } - - @Override - public @NotNull Tag tag() { - return this.tag; - } - +record SingleResolver(String key, Tag tag) implements TagResolver.Single, MappableResolver { @Override public boolean has(final @NotNull String name) { return this.key.equals(name); @@ -57,25 +39,4 @@ public boolean contributeToMap(final @NotNull Map map) { map.put(this.key, this.tag); return true; } - - @Override - public int hashCode() { - return Objects.hash(this.key, this.tag); - } - - @Override - public boolean equals(final Object other) { - if (this == other) { - return true; - } - if (other == null) { - return false; - } - if (this.getClass() != other.getClass()) { - return false; - } - final SingleResolver that = (SingleResolver) other; - return Objects.equals(this.key, that.key) - && Objects.equals(this.tag, that.tag); - } } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolver.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolver.java index c3a3327aa1..f4ace7fdb0 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolver.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolver.java @@ -240,8 +240,7 @@ public boolean has(final @NotNull String name) { * @see TagResolver#resolver(String, Tag) * @since 4.10.0 */ - @ApiStatus.NonExtendable - interface Single extends TagResolver.WithoutArguments { + sealed interface Single extends TagResolver.WithoutArguments permits SingleResolver { /** * The key this resolver matches. * diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolverBuilderImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolverBuilderImpl.java index d56550d350..64929de52c 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolverBuilderImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolverBuilderImpl.java @@ -59,8 +59,8 @@ final class TagResolverBuilderImpl implements TagResolver.Builder { @Override public TagResolver.@NotNull Builder resolver(final @NotNull TagResolver resolver) { - if (resolver instanceof SequentialTagResolver) { - this.resolvers(((SequentialTagResolver) resolver).resolvers, false); + if (resolver instanceof SequentialTagResolver(TagResolver[] sequentialResolvers)) { + this.resolvers(sequentialResolvers, false); } else if (!this.consumePotentialMappable(resolver)) { this.popMap(); this.resolvers.add(requireNonNull(resolver, "resolver")); @@ -98,8 +98,8 @@ final class TagResolverBuilderImpl implements TagResolver.Builder { } private boolean single(final TagResolver resolver, final boolean popped) { - if (resolver instanceof SequentialTagResolver) { - this.resolvers(((SequentialTagResolver) resolver).resolvers, false); + if (resolver instanceof SequentialTagResolver(TagResolver[] sequentialTagResolver)) { + this.resolvers(sequentialTagResolver, false); } else if (!this.consumePotentialMappable(resolver)) { if (!popped) { this.popMap(); @@ -118,8 +118,8 @@ private void popMap() { } private boolean consumePotentialMappable(final TagResolver resolver) { - if (resolver instanceof MappableResolver) { - return ((MappableResolver) resolver).contributeToMap(this.replacements); + if (resolver instanceof MappableResolver mappable) { + return mappable.contributeToMap(this.replacements); } else { return false; } @@ -128,15 +128,16 @@ private boolean consumePotentialMappable(final TagResolver resolver) { @Override public @NotNull TagResolver build() { this.popMap(); - if (this.resolvers.size() == 0) { + if (this.resolvers.isEmpty()) { return EmptyTagResolver.INSTANCE; - } else if (this.resolvers.size() == 1) { - return this.resolvers.get(0); - } else { - final TagResolver[] resolvers = this.resolvers.toArray(new TagResolver[0]); - Collections.reverse(Arrays.asList(resolvers)); - return new SequentialTagResolver(resolvers); } - } + if (this.resolvers.size() == 1) { + return this.resolvers.getFirst(); + } + + final TagResolver[] resolvers = this.resolvers.toArray(new TagResolver[0]); + Collections.reverse(Arrays.asList(resolvers)); + return new SequentialTagResolver(resolvers); + } } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/AbstractColorChangingTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/AbstractColorChangingTag.java index bb42315095..e5002be861 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/AbstractColorChangingTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/AbstractColorChangingTag.java @@ -89,8 +89,7 @@ public final void visit(final @NotNull Node current, final int depth) { if (current instanceof ValueNode) { final String value = ((ValueNode) current).value(); this.size += value.codePointCount(0, value.length()); - } else if (current instanceof TagNode) { - final TagNode tag = (TagNode) current; + } else if (current instanceof final TagNode tag) { if (tag.tag() instanceof Inserting) { // ComponentTransformation.apply() returns the value of the component placeholder LENGTH_CALCULATOR.flatten(((Inserting) tag.tag()).value(), s -> this.size += s.codePointCount(0, s.length())); @@ -131,8 +130,7 @@ public final Component apply(final @NotNull Component current, final int depth) this.skipColorForLengthOf(((VirtualComponent) current).content()); return current.children(Collections.emptyList()); - } else if (current instanceof TextComponent && ((TextComponent) current).content().length() > 0) { - final TextComponent textComponent = (TextComponent) current; + } else if (current instanceof final TextComponent textComponent && !textComponent.content().isEmpty()) { final String content = textComponent.content(); final TextComponent.Builder parent = Component.text(); @@ -205,15 +203,7 @@ private void skipColorForLengthOf(final String content) { @Override public abstract int hashCode(); - static final class TagInfoHolder implements VirtualComponentRenderer, Emitable { - private final Consumer output; - private final Component originalComp; - - TagInfoHolder(final Consumer output, final Component originalComp) { - this.output = output; - this.originalComp = originalComp; - } - + private record TagInfoHolder(Consumer output, Component originalComp) implements VirtualComponentRenderer, Emitable { @Override public @UnknownNullability ComponentLike apply(final @NotNull Void context) { return this.originalComp; diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ColorTagResolver.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ColorTagResolver.java index 7cb534b639..e1281df9a0 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ColorTagResolver.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ColorTagResolver.java @@ -52,8 +52,8 @@ final class ColorTagResolver implements TagResolver, SerializableResolver.Single private static final StyleClaim STYLE = StyleClaim.claim(COLOR, Style::color, (color, emitter) -> { // TODO: custom aliases // TODO: compact vs expanded format? COLOR vs color:COLOR vs c:COLOR - if (color instanceof NamedTextColor) { - emitter.tag(NamedTextColor.NAMES.key((NamedTextColor) color)); + if (color instanceof NamedTextColor namedColor) { + emitter.tag(NamedTextColor.NAMES.key(namedColor)); } else { emitter.tag(color.asHexString()); } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java index d89e4a30e8..ff4462e1f8 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java @@ -130,13 +130,11 @@ private ShowItem() { final Key key = Key.key(args.popOr("Show item hover needs at least an item ID").value()); final int count = args.hasNext() ? args.pop().asInt().orElseThrow(() -> ctx.newException("The count argument was not a valid integer")) : 1; if (args.hasNext()) { - // Compatibility with legacy versions: - // if the value starts with a '{' we assume it's SNBT, and parse it as such to create a legacy holder - // otherwise, we'll parse argument pairs as a map of ResourceLocation -> SNBT value + // if the value starts with a '{' we assume it's SNBT. The previous behavior of legacy parsing has + // been removed in Adventure 5.0.0. final String value = args.peek().value(); if (value.startsWith("{")) { - args.pop(); - return legacyShowItem(key, count, value); + throw ctx.newException("Legacy SNBT serializing is since Adventure 5.0.0 no longer supported."); } final Map datas = new HashMap<>(); @@ -155,11 +153,6 @@ private ShowItem() { } } - @SuppressWarnings("deprecation") - private static HoverEvent.@NotNull ShowItem legacyShowItem(final Key id, final int count, final String value) { - return HoverEvent.ShowItem.showItem(id, count, BinaryTagHolder.binaryTagHolder(value)); - } - @Override public void emit(final HoverEvent.ShowItem event, final TokenEmitter emit) { emit.argument(compactAsString(event.item())); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/KeybindTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/KeybindTag.java index 58e0529488..3508d3a702 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/KeybindTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/KeybindTag.java @@ -58,5 +58,4 @@ static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingExc return emit -> emit.tag(KEYBIND).argument(key); } - } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/NbtTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/NbtTag.java index 8fd7b2c147..93270e4ad1 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/NbtTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/NbtTag.java @@ -66,22 +66,21 @@ private NbtTag() { static Tag resolve(final ArgumentQueue args, final Context ctx) throws ParsingException { final String type = args.popOr("a type of block, entity, or storage is required").lowerValue(); final NBTComponentBuilder builder; - if (BLOCK.equals(type)) { - final String pos = args.popOr("A position is required").value(); - try { - builder = Component.blockNBT() - .pos(BlockNBTComponent.Pos.fromString(pos)); - } catch (final IllegalArgumentException ex) { - throw ctx.newException(ex.getMessage(), args); + switch (type) { + case BLOCK -> { + final String pos = args.popOr("A position is required").value(); + try { + builder = Component.blockNBT() + .pos(BlockNBTComponent.Pos.fromString(pos)); + } catch (final IllegalArgumentException ex) { + throw ctx.newException(ex.getMessage(), args); + } } - } else if (ENTITY.equals(type)) { - builder = Component.entityNBT() + case ENTITY -> builder = Component.entityNBT() .selector(args.popOr("A selector is required").value()); - } else if (STORAGE.equals(type)) { - builder = Component.storageNBT() + case STORAGE -> builder = Component.storageNBT() .storage(Key.key(args.popOr("A storage key is required").value())); - } else { - throw ctx.newException("Unknown nbt tag type '" + type + "'", args); + default -> throw ctx.newException("Unknown nbt tag type '" + type + "'", args); } builder.nbtPath(args.popOr("An NBT path is required").value()); @@ -106,17 +105,22 @@ static Tag resolve(final ArgumentQueue args, final Context ctx) throws ParsingEx static @Nullable Emitable emit(final Component comp) { final String type; final String id; - if (comp instanceof BlockNBTComponent) { - type = BLOCK; - id = ((BlockNBTComponent) comp).pos().asString(); - } else if (comp instanceof EntityNBTComponent) { - type = ENTITY; - id = ((EntityNBTComponent) comp).selector(); - } else if (comp instanceof StorageNBTComponent) { - type = STORAGE; - id = ((StorageNBTComponent) comp).storage().asString(); - } else { - return null; + switch (comp) { + case BlockNBTComponent blockNBTComponent -> { + type = BLOCK; + id = blockNBTComponent.pos().asString(); + } + case EntityNBTComponent entityNBTComponent -> { + type = ENTITY; + id = entityNBTComponent.selector(); + } + case StorageNBTComponent storageNBTComponent -> { + type = STORAGE; + id = storageNBTComponent.storage().asString(); + } + case null, default -> { + return null; + } } return out -> { diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/PrideTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/PrideTag.java index 1b8fd4a50d..9f83476da8 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/PrideTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/PrideTag.java @@ -54,33 +54,31 @@ final class PrideTag extends GradientTag { private static final Map> FLAGS; static { - final Map> flags = new HashMap<>(); - - // Colours taken from https://www.kapwing.com/resources/official-pride-colors-2021-exact-color-codes-for-15-pride-flags. - flags.put(PRIDE, colors(0xE50000, 0xFF8D00, 0xFFEE00, 0x28121, 0x004CFF, 0x770088)); - flags.put("progress", colors(0xFFFFFF, 0xFFAFC7, 0x73D7EE, 0x613915, 0x000000, 0xE50000, 0xFF8D00, 0xFFEE00, 0x28121, 0x004CFF, 0x770088)); - flags.put("trans", colors(0x5BCFFB, 0xF5ABB9, 0xFFFFFF, 0xF5ABB9, 0x5BCFFB)); - flags.put("bi", colors(0xD60270, 0x9B4F96, 0x0038A8)); - flags.put("pan", colors(0xFF1C8D, 0xFFD700, 0x1AB3FF)); - flags.put("nb", colors(0xFCF431, 0xFCFCFC, 0x9D59D2, 0x282828)); - flags.put("lesbian", colors(0xD62800, 0xFF9B56, 0xFFFFFF, 0xD462A6, 0xA40062)); - flags.put("ace", colors(0x000000, 0xA4A4A4, 0xFFFFFF, 0x810081)); - flags.put("agender", colors(0x000000, 0xBABABA, 0xFFFFFF, 0xBAF484, 0xFFFFFF, 0xBABABA, 0x000000)); - flags.put("demisexual", colors(0x000000, 0xFFFFFF, 0x6E0071, 0xD3D3D3)); - flags.put("genderqueer", colors(0xB57FDD, 0xFFFFFF, 0x49821E)); - flags.put("genderfluid", colors(0xFE76A2, 0xFFFFFF, 0xBF12D7, 0x000000, 0x303CBE)); - flags.put("intersex", colors(0xFFD800, 0x7902AA, 0xFFD800)); - flags.put("aro", colors(0x3BA740, 0xA8D47A, 0xFFFFFF, 0xABABAB, 0x000000)); - - // Colours taken from https://www.hrc.org/resources/lgbtq-pride-flags. - flags.put("baker", colors(0xCD66FF, 0xFF6599, 0xFE0000, 0xFE9900, 0xFFFF01, 0x009900, 0x0099CB, 0x350099, 0x990099)); - flags.put("philly", colors(0x000000, 0x784F17, 0xFE0000, 0xFD8C00, 0xFFE500, 0x119F0B, 0x0644B3, 0xC22EDC)); - flags.put("queer", colors(0x000000, 0x9AD9EA, 0x00A3E8, 0xB5E51D, 0xFFFFFF, 0xFFC90D, 0xFC6667, 0xFEAEC9, 0x000000)); - flags.put("gay", colors(0x078E70, 0x26CEAA, 0x98E8C1, 0xFFFFFF, 0x7BADE2, 0x5049CB, 0x3D1A78)); - flags.put("bigender", colors(0xC479A0, 0xECA6CB, 0xD5C7E8, 0xFFFFFF, 0xD5C7E8, 0x9AC7E8, 0x6C83CF)); - flags.put("demigender", colors(0x7F7F7F, 0xC3C3C3, 0xFBFF74, 0xFFFFFF, 0xFBFF74, 0xC3C3C3, 0x7F7F7F)); - - FLAGS = Collections.unmodifiableMap(flags); + FLAGS = Map.ofEntries( + // Colours taken from https://www.kapwing.com/resources/official-pride-colors-2021-exact-color-codes-for-15-pride-flags. + Map.entry(PRIDE, colors(0xE50000, 0xFF8D00, 0xFFEE00, 0x28121, 0x004CFF, 0x770088)), + Map.entry("progress", colors(0xFFFFFF, 0xFFAFC7, 0x73D7EE, 0x613915, 0x000000, 0xE50000, 0xFF8D00, 0xFFEE00, 0x28121, 0x004CFF, 0x770088)), + Map.entry("trans", colors(0x5BCFFB, 0xF5ABB9, 0xFFFFFF, 0xF5ABB9, 0x5BCFFB)), + Map.entry("bi", colors(0xD60270, 0x9B4F96, 0x0038A8)), + Map.entry("pan", colors(0xFF1C8D, 0xFFD700, 0x1AB3FF)), + Map.entry("nb", colors(0xFCF431, 0xFCFCFC, 0x9D59D2, 0x282828)), + Map.entry("lesbian", colors(0xD62800, 0xFF9B56, 0xFFFFFF, 0xD462A6, 0xA40062)), + Map.entry("ace", colors(0x000000, 0xA4A4A4, 0xFFFFFF, 0x810081)), + Map.entry("agender", colors(0x000000, 0xBABABA, 0xFFFFFF, 0xBAF484, 0xFFFFFF, 0xBABABA, 0x000000)), + Map.entry("demisexual", colors(0x000000, 0xFFFFFF, 0x6E0071, 0xD3D3D3)), + Map.entry("genderqueer", colors(0xB57FDD, 0xFFFFFF, 0x49821E)), + Map.entry("genderfluid", colors(0xFE76A2, 0xFFFFFF, 0xBF12D7, 0x000000, 0x303CBE)), + Map.entry("intersex", colors(0xFFD800, 0x7902AA, 0xFFD800)), + Map.entry("aro", colors(0x3BA740, 0xA8D47A, 0xFFFFFF, 0xABABAB, 0x000000)), + + // Colours taken from https://www.hrc.org/resources/lgbtq-pride-flags. + Map.entry("baker", colors(0xCD66FF, 0xFF6599, 0xFE0000, 0xFE9900, 0xFFFF01, 0x009900, 0x0099CB, 0x350099, 0x990099)), + Map.entry("philly", colors(0x000000, 0x784F17, 0xFE0000, 0xFD8C00, 0xFFE500, 0x119F0B, 0x0644B3, 0xC22EDC)), + Map.entry("queer", colors(0x000000, 0x9AD9EA, 0x00A3E8, 0xB5E51D, 0xFFFFFF, 0xFFC90D, 0xFC6667, 0xFEAEC9, 0x000000)), + Map.entry("gay", colors(0x078E70, 0x26CEAA, 0x98E8C1, 0xFFFFFF, 0x7BADE2, 0x5049CB, 0x3D1A78)), + Map.entry("bigender", colors(0xC479A0, 0xECA6CB, 0xD5C7E8, 0xFFFFFF, 0xD5C7E8, 0x9AC7E8, 0x6C83CF)), + Map.entry("demigender", colors(0x7F7F7F, 0xC3C3C3, 0xFBFF74, 0xFFFFFF, 0xFBFF74, 0xC3C3C3, 0x7F7F7F)) + ); } static Tag create(final ArgumentQueue args, final Context ctx) { diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java index df990a87a1..b9cfda7af6 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/RainbowTag.java @@ -64,7 +64,7 @@ static Tag create(final ArgumentQueue args, final Context ctx) { reversed = true; value = value.substring(REVERSE.length()); } - if (value.length() > 0) { + if (!value.isEmpty()) { try { phase = Integer.parseInt(value); } catch (final NumberFormatException ex) { diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ResetTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ResetTag.java index 96114fbc43..f5d9058534 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ResetTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ResetTag.java @@ -29,7 +29,7 @@ final class ResetTag { private static final String RESET = "reset"; - static final TagResolver RESOLVER = TagResolver.resolver(RESET, ParserDirective.RESET); // Not serializable -- we don't reeealy want to encourage its use + static final TagResolver RESOLVER = TagResolver.resolver(RESET, ParserDirective.RESET); // Not serializable -- we don't really want to encourage its use private ResetTag() { } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ScoreTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ScoreTag.java index 68ce18207e..64ab1549cf 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ScoreTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ScoreTag.java @@ -49,13 +49,10 @@ static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingExc } static @Nullable Emitable emit(final Component component) { - if (!(component instanceof ScoreComponent)) return null; - - final ScoreComponent score = (ScoreComponent) component; + if (!(component instanceof final ScoreComponent score)) return null; return emit -> emit.tag(SCORE) .argument(score.name()) .argument(score.objective()); } - } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/SelectorTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/SelectorTag.java index fc3634fb82..836db4f445 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/SelectorTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/SelectorTag.java @@ -64,9 +64,8 @@ static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingExc } static @Nullable Emitable claim(final Component input) { - if (!(input instanceof SelectorComponent)) return null; + if (!(input instanceof final SelectorComponent st)) return null; - final SelectorComponent st = (SelectorComponent) input; return emit -> { emit.tag(SEL); emit.argument(st.pattern()); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableFallbackTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableFallbackTag.java index d437dee3c9..70363eccfb 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableFallbackTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableFallbackTag.java @@ -61,6 +61,10 @@ private TranslatableFallbackTag() { static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingException { final String key = args.popOr("A translation key is required").value(); final String fallback = args.popOr("A fallback messages is required").value(); + return Tag.inserting(Component.translatable(key, fallback, constructWith(args, ctx))); + } + + static List constructWith(final ArgumentQueue args, final Context ctx) { final List with; if (args.hasNext()) { with = new ArrayList<>(); @@ -70,14 +74,12 @@ static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingExc } else { with = Collections.emptyList(); } - - return Tag.inserting(Component.translatable(key, fallback, with)); + return with; } static @Nullable Emitable claim(final Component input) { - if (!(input instanceof TranslatableComponent) || ((TranslatableComponent) input).fallback() == null) return null; + if (!(input instanceof final TranslatableComponent tr) || tr.fallback() == null) return null; - final TranslatableComponent tr = (TranslatableComponent) input; return emit -> { emit.tag(LANG_OR); emit.argument(tr.key()); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java index 6ec72c3db8..dbed9d5685 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java @@ -23,9 +23,6 @@ */ package net.kyori.adventure.text.minimessage.tag.standard; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TranslatableComponent; import net.kyori.adventure.text.TranslationArgument; @@ -59,23 +56,12 @@ private TranslatableTag() { static Tag create(final ArgumentQueue args, final Context ctx) throws ParsingException { final String key = args.popOr("A translation key is required").value(); - final List with; - if (args.hasNext()) { - with = new ArrayList<>(); - while (args.hasNext()) { - with.add(ctx.deserialize(args.pop().value())); - } - } else { - with = Collections.emptyList(); - } - - return Tag.inserting(Component.translatable(key, with)); + return Tag.inserting(Component.translatable(key, TranslatableFallbackTag.constructWith(args, ctx))); } static @Nullable Emitable claim(final Component input) { - if (!(input instanceof TranslatableComponent) || ((TranslatableComponent) input).fallback() != null) return null; + if (!(input instanceof final TranslatableComponent tr) || tr.fallback() != null) return null; - final TranslatableComponent tr = (TranslatableComponent) input; return emit -> { emit.tag(LANG); emit.argument(tr.key()); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/Argument.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/Argument.java index 6d105ca881..e2c54bb2c4 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/Argument.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/Argument.java @@ -81,20 +81,6 @@ private Argument() { return argument(name, TranslationArgument.numeric(value)); } - /** - * Creates a named string argument. - * - * @param name the name - * @param value the value - * @return the named argument - * @since 4.20.0 - * @deprecated for removal since 4.21.0, use {@link #string(String, String)} instead. - */ - @Deprecated - public static @NotNull ComponentLike numeric(final @TagPattern @NotNull String name, final @NotNull String value) { - return string(name, value); - } - /** * Creates a named string argument. * diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/LocalePointered.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/LocalePointered.java index 46444cb749..7178a3d108 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/LocalePointered.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/LocalePointered.java @@ -29,11 +29,9 @@ import net.kyori.adventure.pointer.Pointers; import org.jetbrains.annotations.NotNull; -final class LocalePointered implements Pointered { - private final Pointers pointers; - - LocalePointered(final @NotNull Locale locale) { - this.pointers = Pointers.builder().withStatic(Identity.LOCALE, locale).build(); +record LocalePointered(Pointers pointers) implements Pointered { + LocalePointered(final @NotNull Locale pointers) { + this(Pointers.builder().withStatic(Identity.LOCALE, pointers).build()); } @Override diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslationStore.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslationStore.java index ad210405d4..c58938e1cb 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslationStore.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslationStore.java @@ -37,8 +37,7 @@ * * @since 4.20.0 */ -@ApiStatus.NonExtendable -public interface MiniMessageTranslationStore extends TranslationStore.StringBased { +public sealed interface MiniMessageTranslationStore extends TranslationStore.StringBased permits MiniMessageTranslationStoreImpl { /** * Creates a MiniMessage translation store, backed by the default MiniMessage instance. diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java index 0a2adf33d9..663ce28ff4 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslator.java @@ -165,8 +165,8 @@ public MiniMessageTranslator(final @NotNull MiniMessage miniMessage) { for (final TranslationArgument argument : translationArguments) { final Object value = argument.value(); - if (value instanceof VirtualComponent) { - final VirtualComponentRenderer renderer = ((VirtualComponent) value).renderer(); + if (value instanceof final VirtualComponent virtual) { + final VirtualComponentRenderer renderer = virtual.renderer(); if (renderer instanceof MiniMessageTranslatorTarget) { if (targetAlreadyOverridden) { @@ -176,24 +176,23 @@ public MiniMessageTranslator(final @NotNull MiniMessage miniMessage) { target = ((MiniMessageTranslatorTarget) renderer).pointered(); targetAlreadyOverridden = true; continue; - } else if (renderer instanceof MiniMessageTranslatorArgument) { - final MiniMessageTranslatorArgument translatorArgument = (MiniMessageTranslatorArgument) renderer; + } else if (renderer instanceof MiniMessageTranslatorArgument translatorArgument) { final Object data = translatorArgument.data(); - - if (data instanceof TranslationArgumentLike) { - final Tag tag = Tag.selfClosingInserting((TranslationArgumentLike) data); - tagResolverBuilder.tag(translatorArgument.name(), tag); - indexedArguments.add(tag); - continue; - } else if (data instanceof Tag) { - final Tag tag = (Tag) data; - tagResolverBuilder.tag(translatorArgument.name(), tag); - indexedArguments.add(tag); - continue; - } else if (data instanceof TagResolver) { - tagResolverBuilder.resolvers((TagResolver) data); - } else { - throw new IllegalArgumentException("Unknown translator argument type: " + data.getClass()); + final String name = translatorArgument.name(); + switch (data) { + case TranslationArgumentLike translationArgumentLike -> { + final Tag tag = Tag.selfClosingInserting(translationArgumentLike); + tagResolverBuilder.tag(name, tag); + indexedArguments.add(tag); + continue; + } + case Tag tag -> { + tagResolverBuilder.tag(name, tag); + indexedArguments.add(tag); + continue; + } + case TagResolver tagResolver -> tagResolverBuilder.resolvers(tagResolver); + default -> throw new IllegalArgumentException("Unknown translator argument type: " + data.getClass()); } } } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslatorArgument.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslatorArgument.java index 42a9641576..7e02b4b351 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslatorArgument.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/translation/MiniMessageTranslatorArgument.java @@ -54,8 +54,8 @@ final class MiniMessageTranslatorArgument implements VirtualComponentRenderer @Override public @UnknownNullability ComponentLike apply(final @NotNull Void context) { - if (this.data instanceof ComponentLike) { - return (ComponentLike) this.data; + if (this.data instanceof ComponentLike componentLike) { + return componentLike; } else { return null; } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tree/Node.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tree/Node.java index 9cf6254f93..2d44eb7d72 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tree/Node.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tree/Node.java @@ -24,6 +24,9 @@ package net.kyori.adventure.text.minimessage.tree; import java.util.List; + +import net.kyori.adventure.text.minimessage.internal.parser.node.ElementNode; +import net.kyori.adventure.text.minimessage.internal.parser.node.RootNode; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,8 +38,7 @@ * * @since 4.10.0 */ -@ApiStatus.NonExtendable -public interface Node { +public sealed interface Node permits ElementNode, Node.Root { /** * Get a human-readable representation of this node and its descendants for debugging purposes. * @@ -71,8 +73,7 @@ public interface Node { * * @since 4.10.0 */ - @ApiStatus.NonExtendable - interface Root extends Node { + sealed interface Root extends Node permits RootNode { /** * Get the original provided message which produced this node. * diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/AbstractTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/AbstractTest.java index 52848b4f79..dd259533d0 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/AbstractTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/AbstractTest.java @@ -83,12 +83,7 @@ public static ArgumentQueue emptyArgumentQueue(final Context context) { } public static Component virtualOfChildren(final ComponentLike... children) { - return Component.virtual(Void.class, new VirtualComponentRenderer() { - @Override - public @UnknownNullability ComponentLike apply(final @NotNull Void context) { - return Component.empty(); - } - }) // not part of equality... should it be? + return Component.virtual(Void.class, context -> Component.empty()) // not part of equality... should it be? .children(Arrays.asList(children)); } } diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java index 43f24fed29..22dd204f71 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java @@ -439,20 +439,22 @@ void testTreeOutput() { final TagResolver resolver = TagResolver.resolver(Placeholder.parsed("name", "you"), Placeholder.component("action", Component.text("click"))); final Node tree = MiniMessage.miniMessage().deserializeToTree(input, resolver); - final String expected = "Node {\n" + - " TagNode('red') {\n" + - " TextNode(' RED ')\n" + - " TagNode('blue') {\n" + - " TextNode(' you ')\n" + - " TagNode('click', 'open_url', 'https://github.com') {\n" + - " TextNode(' good ')\n" + - " TagNode('action') {\n" + - " }\n" + - " TextNode(' ')\n" + - " }\n" + - " }\n" + - " }\n" + - "}\n"; + final String expected = """ + Node { + TagNode('red') { + TextNode(' RED ') + TagNode('blue') { + TextNode(' you ') + TagNode('click', 'open_url', 'https://github.com') { + TextNode(' good ') + TagNode('action') { + } + TextNode(' ') + } + } + } + } + """; assertEquals(expected, tree.toString()); } diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageSerializerTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageSerializerTest.java index 9aaee7dbf5..7e9252ca05 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageSerializerTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageSerializerTest.java @@ -77,5 +77,4 @@ void testDoubleOpenRoundTrippedEscaped() { this.assertSerializedEquals(expected, component); this.assertParsedEquals(component, expected); } - } diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageTest.java index 6ec851ae02..39e710f0cb 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageTest.java @@ -319,48 +319,52 @@ void allClosedTagsStrict() { void unclosedTagStrict() { final String input = "REDGREENREDBLUE"; - final String errorMessage = "All tags must be explicitly closed while in strict mode. End of string found with open tags: red, blue\n" + - "\tREDGREENREDBLUE\n" + - "\t^~~~^ ^~~~~^"; + final String errorMessage = """ + All tags must be explicitly closed while in strict mode. End of string found with open tags: red, blue + \tREDGREENREDBLUE + \t^~~~^ ^~~~~^"""; final ParsingException thrown = assertThrows(ParsingException.class, () -> MiniMessage.builder().strict(true).build().deserialize(input)); - assertEquals(thrown.getMessage(), errorMessage); + assertEquals(errorMessage, thrown.getMessage()); } @Test void implicitCloseStrict() { final String input = "REDGREENNO COLORBLUE"; - final String errorMessage = "Unclosed tag encountered; green is not closed, because red was closed first.\n" + - "\tREDGREENNO COLORBLUE\n" + - "\t^~~~^ ^~~~~~^ ^~~~~^"; + final String errorMessage = """ + Unclosed tag encountered; green is not closed, because red was closed first. + \tREDGREENNO COLORBLUE + \t^~~~^ ^~~~~~^ ^~~~~^"""; final ParsingException thrown = assertThrows(ParsingException.class, () -> MiniMessage.builder().strict(true).build().deserialize(input)); - assertEquals(thrown.getMessage(), errorMessage); + assertEquals(errorMessage, thrown.getMessage()); } @Test void implicitCloseNestedStrict() { final String input = "REDGREENBLUEYELLOW"; - final String errorMessage = "Unclosed tag encountered; yellow is not closed, because green was closed first.\n" + - "\tREDGREENBLUEYELLOW\n" + - "\t ^~~~~~^ ^~~~~~~^ ^~~~~~~^"; + final String errorMessage = """ + Unclosed tag encountered; yellow is not closed, because green was closed first. + \tREDGREENBLUEYELLOW + \t ^~~~~~^ ^~~~~~~^ ^~~~~~~^"""; final ParsingException thrown = assertThrows(ParsingException.class, () -> MiniMessage.builder().strict(true).build().deserialize(input)); - assertEquals(thrown.getMessage(), errorMessage); + assertEquals(errorMessage, thrown.getMessage()); } @Test void resetWhileStrict() { final String input = "REDGREENNO COLORBLUE"; - final String errorMessage = " tags are not allowed when strict mode is enabled\n" + - "\tREDGREENNO COLORBLUE\n" + - "\t ^~~~~~^"; + final String errorMessage = """ + tags are not allowed when strict mode is enabled + \tREDGREENNO COLORBLUE + \t ^~~~~~^"""; final ParsingException thrown = assertThrows(ParsingException.class, () -> MiniMessage.builder().strict(true).build().deserialize(input)); - assertEquals(thrown.getMessage(), errorMessage); + assertEquals(errorMessage, thrown.getMessage()); } @Test diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/SerializerCollectorTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/SerializerCollectorTest.java index da894655d9..b18e9063be 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/SerializerCollectorTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/SerializerCollectorTest.java @@ -59,7 +59,7 @@ void testEscapesInQuotedString() { @Test void testPopUnmarked() { - final String output = this.serializeToString(c -> c.popToMark()); + final String output = this.serializeToString(MiniMessageSerializer.Collector::popToMark); assertEquals("", output); } diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java index 0311fea24e..a4c931bab3 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java @@ -63,12 +63,10 @@ void testSingleAndResolversCombine() { Placeholder.component("foo", Component.text("fizz")), Placeholder.parsed("overlapping", "from list") ); - final TagResolver.WithoutArguments resolver = key -> { - switch (key) { - case "one": return Tag.preProcessParsed("fish"); - case "overlapping": return Tag.preProcessParsed("from resolver"); - default: return null; - } + final TagResolver.WithoutArguments resolver = key -> switch (key) { + case "one" -> Tag.preProcessParsed("fish"); + case "overlapping" -> Tag.preProcessParsed("from resolver"); + default -> null; }; final TagResolver built = TagResolver.builder() @@ -176,5 +174,4 @@ void testTagResolverEquality() { throw new RuntimeException(ex); } } - } From fefaa6dd625ebba97922891fb8eb9d4fc3327bfb Mon Sep 17 00:00:00 2001 From: Strokkur24 Date: Mon, 6 Oct 2025 22:50:04 +0200 Subject: [PATCH 4/8] chore(ansi): replace one switch expression --- .../ansi/ANSIComponentSerializerImpl.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ansi/ANSIComponentSerializerImpl.java b/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ansi/ANSIComponentSerializerImpl.java index a5afc3fbf9..a2d7d5d944 100644 --- a/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ansi/ANSIComponentSerializerImpl.java +++ b/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ansi/ANSIComponentSerializerImpl.java @@ -72,15 +72,11 @@ static final class Instances { } static StyleOps.State mapState(final TextDecoration.State state) { - switch (state) { - case NOT_SET: - return StyleOps.State.UNSET; - case FALSE: - return StyleOps.State.FALSE; - case TRUE: - return StyleOps.State.TRUE; - } - throw new IllegalStateException("Decoration state is not valid"); + return switch (state) { + case NOT_SET -> StyleOps.State.UNSET; + case FALSE -> StyleOps.State.FALSE; + case TRUE -> StyleOps.State.TRUE; + }; } static class ComponentStyleOps implements StyleOps