From f4d1df6f5b1e83140f1438805addb33a4de38f67 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Sun, 29 Sep 2024 13:39:50 -0400 Subject: [PATCH] Implement Buildable interface Allows converting SyntaxInfos back into Builders --- .../registration/BukkitSyntaxInfos.java | 8 +++++++ .../registration/BukkitSyntaxInfosImpl.java | 20 ++++++++++++++++++ .../registration/DefaultSyntaxInfos.java | 14 +++++++++++++ .../registration/DefaultSyntaxInfosImpl.java | 21 +++++++++++++++++++ .../skript/registration/SyntaxInfo.java | 10 ++++++++- .../skript/registration/SyntaxInfoImpl.java | 12 +++++++++++ .../org/skriptlang/skript/util/Builder.java | 16 ++++++++++++++ 7 files changed, 100 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfos.java b/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfos.java index 50137be3c8e..6a70409b82a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfos.java +++ b/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfos.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfosImpl.EventImpl; import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxInfo.Builder; import java.util.Collection; @@ -36,6 +37,13 @@ static Builder, E> builder( return new EventImpl.BuilderImpl<>(eventClass, name); } + /** + * {@inheritDoc} + */ + @Override + @Contract("-> new") + Builder, E> builder(); + /** * @return The listening behavior for the SkriptEvent. Determines when the event should trigger. */ diff --git a/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfosImpl.java b/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfosImpl.java index 3fb9d73ba19..0a7f1a74a6a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfosImpl.java +++ b/src/main/java/org/skriptlang/skript/bukkit/registration/BukkitSyntaxInfosImpl.java @@ -55,6 +55,26 @@ static final class EventImpl implements Event { this.events = ImmutableList.copyOf(events); } + @Override + public Builder, E> builder() { + var builder = new BuilderImpl<>(type(), name); + defaultInfo.builder().applyTo(builder); + builder.listeningBehavior(listeningBehavior); + builder.documentationId(id); + if (since != null) { + builder.since(since); + } + if (documentationId != null) { + builder.documentationId(documentationId); + } + builder.addDescription(description); + builder.addExamples(examples); + builder.addKeywords(keywords); + builder.addRequiredPlugins(requiredPlugins); + builder.addEvents(events); + return builder; + } + @Override public ListeningBehavior listeningBehavior() { return listeningBehavior; diff --git a/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfos.java b/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfos.java index ff174974c5a..a937ff706e9 100644 --- a/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfos.java +++ b/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfos.java @@ -35,6 +35,13 @@ static , R> Builder(expressionClass); } + /** + * {@inheritDoc} + */ + @Override + @Contract("-> new") + Builder, E, R> builder(); + /** * @return The class representing the supertype of all values the Expression may return. */ @@ -125,6 +132,13 @@ static Builder(structureClass); } + /** + * {@inheritDoc} + */ + @Override + @Contract("-> new") + Builder, E> builder(); + /** * @return The entry validator to use for handling the Structure's entries. * If null, the Structure is expected to manually handle any entries. diff --git a/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfosImpl.java b/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfosImpl.java index 081532b3534..4333bb2bbd7 100644 --- a/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfosImpl.java +++ b/src/main/java/org/skriptlang/skript/registration/DefaultSyntaxInfosImpl.java @@ -4,6 +4,8 @@ import com.google.common.base.Preconditions; import org.jetbrains.annotations.Nullable; import org.skriptlang.skript.lang.entry.EntryValidator; +import org.skriptlang.skript.registration.SyntaxInfo.Builder; +import org.skriptlang.skript.registration.SyntaxInfoImpl.BuilderImpl; import org.skriptlang.skript.util.Priority; import java.util.Collection; @@ -29,6 +31,14 @@ static class ExpressionImpl, R> this.returnType = returnType; } + @Override + public Expression.Builder, E, R> builder() { + var builder = new BuilderImpl<>(type()); + super.builder().applyTo(builder); + builder.returnType(returnType); + return builder; + } + @Override public Class returnType() { return returnType; @@ -116,6 +126,17 @@ static class StructureImpl, E> builder() { + var builder = new BuilderImpl<>(type()); + super.builder().applyTo(builder); + if (entryValidator != null) { + builder.entryValidator(entryValidator); + } + builder.nodeType(nodeType); + return builder; + } + @Override public @Nullable EntryValidator entryValidator() { return entryValidator; diff --git a/src/main/java/org/skriptlang/skript/registration/SyntaxInfo.java b/src/main/java/org/skriptlang/skript/registration/SyntaxInfo.java index 2f8be0d998d..039d60bc49a 100644 --- a/src/main/java/org/skriptlang/skript/registration/SyntaxInfo.java +++ b/src/main/java/org/skriptlang/skript/registration/SyntaxInfo.java @@ -5,6 +5,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Unmodifiable; import org.skriptlang.skript.registration.SyntaxInfoImpl.BuilderImpl; +import org.skriptlang.skript.util.Builder.Buildable; import org.skriptlang.skript.util.Priority; import java.util.Collection; @@ -15,7 +16,7 @@ * @param The class providing the implementation of the syntax this info represents. */ @ApiStatus.Experimental -public interface SyntaxInfo extends DefaultSyntaxInfos { +public interface SyntaxInfo extends Buildable, SyntaxInfo>, DefaultSyntaxInfos { /** * A priority for infos with patterns that only match simple text (they do not have any {@link Expression}s). @@ -47,6 +48,13 @@ static Builder, E> builder(Cla return new BuilderImpl<>(type); } + /** + * {@inheritDoc} + */ + @Override + @Contract("-> new") + Builder, E> builder(); + /** * @return The origin of this syntax. */ diff --git a/src/main/java/org/skriptlang/skript/registration/SyntaxInfoImpl.java b/src/main/java/org/skriptlang/skript/registration/SyntaxInfoImpl.java index 16ae4c08e14..fca551484cb 100644 --- a/src/main/java/org/skriptlang/skript/registration/SyntaxInfoImpl.java +++ b/src/main/java/org/skriptlang/skript/registration/SyntaxInfoImpl.java @@ -41,6 +41,18 @@ protected SyntaxInfoImpl( this.priority = priority; } + @Override + public Builder, T> builder() { + var builder = new BuilderImpl<>(type); + builder.origin(origin); + if (supplier != null) { + builder.supplier(supplier); + } + builder.addPatterns(patterns); + builder.priority(priority); + return builder; + } + @Override public SyntaxOrigin origin() { return origin; diff --git a/src/main/java/org/skriptlang/skript/util/Builder.java b/src/main/java/org/skriptlang/skript/util/Builder.java index 8000d7830df..e3280fbdf8e 100644 --- a/src/main/java/org/skriptlang/skript/util/Builder.java +++ b/src/main/java/org/skriptlang/skript/util/Builder.java @@ -6,11 +6,27 @@ /** * An interface providing common methods to be implemented for any builder. * + * @param The type of builder being used. * @param The type of object being built. */ @ApiStatus.Experimental public interface Builder, T> { + /** + * Represents an object that can be converted back into a builder. + * @param The type of builder being used. + * @param The type of object being built. + */ + interface Buildable, T> { + + /** + * @return A builder representing this object. + */ + @Contract("-> new") + B builder(); + + } + /** * @return An object of T built from the values specified by this builder. */