From 865ddd036c87522151dae3b463271d5ca81154b8 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Sun, 29 Sep 2024 14:56:30 -0400 Subject: [PATCH] Fix SkriptEventInfo Compatibility --- src/main/java/ch/njol/skript/Skript.java | 20 +-- .../ch/njol/skript/lang/SkriptEventInfo.java | 131 +++++++++++++++++- .../njol/skript/lang/SyntaxElementInfo.java | 11 +- 3 files changed, 136 insertions(+), 26 deletions(-) diff --git a/src/main/java/ch/njol/skript/Skript.java b/src/main/java/ch/njol/skript/Skript.java index fa1312f3b7a..37c16fb2c32 100644 --- a/src/main/java/ch/njol/skript/Skript.java +++ b/src/main/java/ch/njol/skript/Skript.java @@ -1528,24 +1528,8 @@ public static SkriptEventInfo registerEvent( checkAcceptRegistrations(); for (int i = 0; i < patterns.length; i++) patterns[i] = BukkitSyntaxInfos.fixPattern(patterns[i]); - SkriptEventInfo legacy = new SkriptEventInfo<>(name, patterns, eventClass, "", events); - BukkitSyntaxInfos.Event.Builder builder = BukkitSyntaxInfos.Event.builder(legacy.getElementClass(), name) - .origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(legacy.getElementClass()))) - .addPatterns(legacy.getPatterns()) - .addEvents(legacy.events); - if (legacy.getSince() != null) - builder.since(legacy.getSince()); - if (legacy.getDocumentationID() != null) - builder.documentationId(legacy.getDocumentationID()); - if (legacy.getDescription() != null) - builder.addDescription(legacy.getDescription()); - if (legacy.getExamples() != null) - builder.addExamples(legacy.getExamples()); - if (legacy.getKeywords() != null) - builder.addKeywords(legacy.getKeywords()); - if (legacy.getRequiredPlugins() != null) - builder.addRequiredPlugins(legacy.getRequiredPlugins()); - skript.syntaxRegistry().register(BukkitRegistryKeys.EVENT, builder.build()); + var legacy = new SkriptEventInfo.ModernSkriptEventInfo<>(name, patterns, eventClass, "", events); + skript.syntaxRegistry().register(BukkitRegistryKeys.EVENT, legacy); return legacy; } diff --git a/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java b/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java index 78d32c9b023..f0065e734aa 100644 --- a/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java +++ b/src/main/java/ch/njol/skript/lang/SkriptEventInfo.java @@ -18,17 +18,29 @@ */ package ch.njol.skript.lang; +import ch.njol.skript.Skript; import ch.njol.skript.SkriptAPIException; import ch.njol.skript.SkriptConfig; import ch.njol.skript.lang.SkriptEvent.ListeningBehavior; +import ch.njol.skript.lang.SkriptEventInfo.ModernSkriptEventInfo; import org.bukkit.event.Event; import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; +import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos; import org.skriptlang.skript.lang.structure.StructureInfo; +import org.skriptlang.skript.registration.SyntaxInfo; +import org.skriptlang.skript.registration.SyntaxOrigin; +import org.skriptlang.skript.util.Priority; +import java.lang.reflect.InvocationTargetException; +import java.util.Collection; +import java.util.List; import java.util.Locale; -public final class SkriptEventInfo extends StructureInfo { +public sealed class SkriptEventInfo extends StructureInfo permits ModernSkriptEventInfo { public Class[] events; public final String name; @@ -200,4 +212,121 @@ public ListeningBehavior getListeningBehavior() { return documentationID; } + /* + * Registration API Compatibility + */ + + @ApiStatus.Experimental + public static final class ModernSkriptEventInfo + extends SkriptEventInfo + implements BukkitSyntaxInfos.Event { + + private final SyntaxOrigin origin; + + public ModernSkriptEventInfo(String name, String[] patterns, Class eventClass, String originClassPath, Class[] events) { + super(name, patterns, eventClass, originClassPath, events); + origin = SyntaxOrigin.of(Skript.getAddon(JavaPlugin.getProvidingPlugin(eventClass))); + } + + @Override + public Builder, E> builder() { + return BukkitSyntaxInfos.Event.builder(type(), name()) + .origin(origin) + .addPatterns(patterns()) + .priority(priority()) + .listeningBehavior(listeningBehavior()) + .since(since()) + .documentationId(id()) + .addDescription(description()) + .addExamples(examples()) + .addKeywords(keywords()) + .addRequiredPlugins(requiredPlugins()) + .addEvents(events()); + } + + @Override + public SyntaxOrigin origin() { + return origin; + } + + @Override + public Class type() { + return getElementClass(); + } + + @Override + public E instance() { + try { + return type().getDeclaredConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + @Override + public @Unmodifiable Collection patterns() { + return List.of(getPatterns()); + } + + @Override + public Priority priority() { + return SyntaxInfo.COMBINED; + } + + @Override + public ListeningBehavior listeningBehavior() { + return getListeningBehavior(); + } + + @Override + public String name() { + return getName(); + } + + @Override + public String id() { + return getId(); + } + + @Override + public @Nullable String since() { + return getSince(); + } + + @Override + public @Nullable String documentationId() { + return getDocumentationID(); + } + + @Override + public Collection description() { + String[] description = getDescription(); + return description != null ? List.of(description) : List.of(); + } + + @Override + public Collection examples() { + String[] examples = getExamples(); + return examples != null ? List.of(examples) : List.of(); + } + + @Override + public Collection keywords() { + String[] keywords = getKeywords(); + return keywords != null ? List.of(keywords) : List.of(); + } + + @Override + public Collection requiredPlugins() { + String[] requiredPlugins = getRequiredPlugins(); + return requiredPlugins != null ? List.of(requiredPlugins) : List.of(); + } + + @Override + public Collection> events() { + return List.of(events); + } + } + } diff --git a/src/main/java/ch/njol/skript/lang/SyntaxElementInfo.java b/src/main/java/ch/njol/skript/lang/SyntaxElementInfo.java index 71dd301892b..abf8e8e5265 100644 --- a/src/main/java/ch/njol/skript/lang/SyntaxElementInfo.java +++ b/src/main/java/ch/njol/skript/lang/SyntaxElementInfo.java @@ -85,9 +85,7 @@ public String getOriginClassPath() { @ApiStatus.Experimental @SuppressWarnings("unchecked") public static , E extends SyntaxElement> I fromModern(SyntaxInfo info) { - if (info instanceof BukkitSyntaxInfos.Event) { - BukkitSyntaxInfos.Event event = (BukkitSyntaxInfos.Event) info; - + if (info instanceof BukkitSyntaxInfos.Event event) { // We must first go back to the raw input String rawName = event.name().startsWith("On ") ? event.name().substring(3) @@ -109,12 +107,11 @@ public static , E extends SyntaxElement> I fromMo .requiredPlugins(event.requiredPlugins().toArray(new String[0])); return (I) eventInfo; - } else if (info instanceof SyntaxInfo.Structure) { - SyntaxInfo.Structure structure = (SyntaxInfo.Structure) info; + } else if (info instanceof SyntaxInfo.Structure structure) { return (I) new StructureInfo<>(structure.patterns().toArray(new String[0]), structure.type(), structure.origin().name(), structure.entryValidator(), structure.nodeType()); - } else if (info instanceof SyntaxInfo.Expression) { - return (I) fromModernExpression((SyntaxInfo.Expression) info); + } else if (info instanceof SyntaxInfo.Expression expression) { + return (I) fromModernExpression(expression); } return (I) new SyntaxElementInfo<>(info.patterns().toArray(new String[0]), info.type(), info.origin().name());