diff --git a/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java b/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java index eebd78f71f..82cca56a10 100644 --- a/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java @@ -307,6 +307,18 @@ interface Builder extends ComponentBuilder { return this.arguments(args); } + /** + * Adds a single translation arg. + * + *

Non-{@link Component} arguments can be wrapped in {@link TranslationArgument}, or represented with a {@link TranslationArgumentLike}.

+ * + * @param like the translation arg + * @return this builder + * @since 4.25.0 + */ + @Contract("_ -> this") + @NotNull Builder addArgument(final @NotNull ComponentLike like); + /** * Sets the translation args. * diff --git a/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java index a4bda0c901..8881667f07 100644 --- a/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java @@ -145,7 +145,7 @@ public String toString() { static final class BuilderImpl extends AbstractComponentBuilder implements TranslatableComponent.Builder { private @Nullable String key; private @Nullable String fallback; - private List args = Collections.emptyList(); + private List args = null; BuilderImpl() { } @@ -157,12 +157,25 @@ static final class BuilderImpl extends AbstractComponentBuilder args() { + if (this.args == null) { + this.args = new ArrayList<>(); + } + return this.args; + } + @Override public @NotNull Builder key(final @NotNull String key) { this.key = key; return this; } + @Override + public @NotNull Builder addArgument(final @NotNull ComponentLike like) { + this.args().add(asArgument(like, -1)); + return this; + } + @Override public @NotNull Builder arguments(final @NotNull ComponentLike@NotNull... args) { requireNonNull(args, "args"); @@ -172,7 +185,11 @@ static final class BuilderImpl extends AbstractComponentBuilder args) { - this.args = asArguments(requireNonNull(args, "args")); + requireNonNull(args, "args"); + this.args = new ArrayList<>(args.size()); + for (int i = 0; i < args.size(); i++) { + this.args.add(asArgument(args.get(i), i)); + } return this; } @@ -185,7 +202,7 @@ static final class BuilderImpl extends AbstractComponentBuilder asArguments(final @NotNull List ret = new ArrayList<>(likes.size()); for (int i = 0; i < likes.size(); i++) { - final ComponentLike like = likes.get(i); - if (like == null) { - throw new NullPointerException("likes[" + i + "]"); - } - if (like instanceof TranslationArgument) { - ret.add((TranslationArgument) like); - } else if (like instanceof TranslationArgumentLike) { - ret.add(requireNonNull(((TranslationArgumentLike) like).asTranslationArgument(), "likes[" + i + "].asTranslationArgument()")); - } else { - ret.add(TranslationArgument.component(like)); - } + ret.add(asArgument(likes.get(i), i)); } return Collections.unmodifiableList(ret); } + + static TranslationArgument asArgument(final ComponentLike like, final int index) { + if (like == null) { + throw new NullPointerException("like" + (index != -1 ? "s[" + index + "]" : "")); + } + if (like instanceof TranslationArgument) { + return (TranslationArgument) like; + } else if (like instanceof TranslationArgumentLike) { + return requireNonNull(((TranslationArgumentLike) like).asTranslationArgument(), "like" + (index != -1 ? "s[" + index + "]" : "") + ".asTranslationArgument()"); + } else { + return TranslationArgument.component(like); + } + } }