diff --git a/src/main/java/ch/njol/skript/ModernSkriptBridge.java b/src/main/java/ch/njol/skript/ModernSkriptBridge.java index 194badaf0ac..09ecb7cf9f1 100644 --- a/src/main/java/ch/njol/skript/ModernSkriptBridge.java +++ b/src/main/java/ch/njol/skript/ModernSkriptBridge.java @@ -8,6 +8,7 @@ import org.skriptlang.skript.util.Registry; import java.util.Collection; +import java.util.List; import java.util.function.Supplier; /** @@ -75,6 +76,11 @@ public > R registry(Class registryClass, Supplier pu return unmodifiableSkript.registry(registryClass, putIfAbsent); } + @Override + public Collection> registries() { + return unmodifiableSkript.registries(); + } + @Override public SyntaxRegistry syntaxRegistry() { return unmodifiableSkript.syntaxRegistry(); diff --git a/src/main/java/ch/njol/skript/SkriptAddon.java b/src/main/java/ch/njol/skript/SkriptAddon.java index 82137f507a5..e8ba4310008 100644 --- a/src/main/java/ch/njol/skript/SkriptAddon.java +++ b/src/main/java/ch/njol/skript/SkriptAddon.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; +import java.util.Collection; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -154,6 +155,11 @@ public > R registry(Class registryClass, Supplier pu return addon.registry(registryClass, putIfAbsent); } + @Override + public Collection> registries() { + return addon.registries(); + } + @Override public SyntaxRegistry syntaxRegistry() { return addon.syntaxRegistry(); diff --git a/src/main/java/org/skriptlang/skript/SkriptImpl.java b/src/main/java/org/skriptlang/skript/SkriptImpl.java index 096312f9682..23d12ff575d 100644 --- a/src/main/java/org/skriptlang/skript/SkriptImpl.java +++ b/src/main/java/org/skriptlang/skript/SkriptImpl.java @@ -13,6 +13,7 @@ import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; @@ -65,6 +66,11 @@ public > R registry(Class registryClass, Supplier pu return (R) registries.computeIfAbsent(registryClass, key -> putIfAbsent.get()); } + @Override + public Collection> registries() { + return List.copyOf(registries.values()); + } + /* * SkriptAddon Management */ @@ -181,6 +187,11 @@ public > R registry(Class registryClass, Supplier pu return skript.registry(registryClass, putIfAbsent); } + @Override + public Collection> registries() { + return skript.registries(); + } + @Override public SyntaxRegistry syntaxRegistry() { return registry(SyntaxRegistry.class); @@ -256,6 +267,11 @@ public > R registry(Class registryClass, Supplier pu return unmodifiableAddon.registry(registryClass, putIfAbsent); } + @Override + public Collection> registries() { + return unmodifiableAddon.registries(); + } + @Override public SyntaxRegistry syntaxRegistry() { return unmodifiableAddon.syntaxRegistry(); diff --git a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java index 0e1bab8dc81..be9adf53b4f 100644 --- a/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java +++ b/src/main/java/org/skriptlang/skript/addon/SkriptAddon.java @@ -8,6 +8,7 @@ import org.skriptlang.skript.util.ViewProvider; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.function.Supplier; @@ -72,6 +73,11 @@ public interface SkriptAddon extends ViewProvider { */ > R registry(Class registryClass, Supplier putIfAbsent); + /** + * @return A collection of all registries accessible through this addon. + */ + Collection> registries(); + /** * @return A syntax registry for this addon's syntax. */ diff --git a/src/main/java/org/skriptlang/skript/addon/SkriptAddonImpl.java b/src/main/java/org/skriptlang/skript/addon/SkriptAddonImpl.java index 7f8faa06670..fa34ab9d0c7 100644 --- a/src/main/java/org/skriptlang/skript/addon/SkriptAddonImpl.java +++ b/src/main/java/org/skriptlang/skript/addon/SkriptAddonImpl.java @@ -5,6 +5,7 @@ import org.skriptlang.skript.util.Registry; import org.skriptlang.skript.util.ViewProvider; +import java.util.Collection; import java.util.function.Supplier; class SkriptAddonImpl { @@ -47,9 +48,9 @@ public boolean hasRegistry(Class> registryClass) { @Override public > R registry(Class registryClass) { R registry = addon.registry(registryClass); - if (registry instanceof ViewProvider) { + if (registry instanceof ViewProvider viewProvider) { //noinspection unchecked - registry = ((ViewProvider) registry).unmodifiableView(); + registry = (R) viewProvider.unmodifiableView(); } return registry; } @@ -59,6 +60,18 @@ public > R registry(Class registryClass, Supplier pu throw new UnsupportedOperationException("Cannot store registries on an unmodifiable addon"); } + @Override + public Collection> registries() { + return addon.registries().stream() + .map(registry -> { + if (registry instanceof ViewProvider viewProvider) { + return (Registry) viewProvider.unmodifiableView(); + } + return registry; + }) + .toList(); + } + @Override public SyntaxRegistry syntaxRegistry() { return addon.syntaxRegistry().unmodifiableView(); diff --git a/src/test/java/org/skriptlang/skript/addon/BaseSkriptAddonTests.java b/src/test/java/org/skriptlang/skript/addon/BaseSkriptAddonTests.java index c2d41ddb7b1..5c06436348b 100644 --- a/src/test/java/org/skriptlang/skript/addon/BaseSkriptAddonTests.java +++ b/src/test/java/org/skriptlang/skript/addon/BaseSkriptAddonTests.java @@ -80,6 +80,10 @@ public void testRegistry() { assertEquals(registry, unmodifiable.registry(MockRegistry.class)); assertTrue(addon.hasRegistry(MockRegistry.class)); assertTrue(unmodifiable.hasRegistry(MockRegistry.class)); + + // access all registries + assertTrue(addon.registries().contains(registry)); + assertTrue(unmodifiable.registries().contains(registry)); } @Test @@ -91,6 +95,10 @@ public void testSyntaxRegistry() { assertNotNull(unmodifiable.syntaxRegistry()); // unmodifiable's syntax registry should be unmodifiable (different) assertNotEquals(addon.syntaxRegistry(), unmodifiable.syntaxRegistry()); + assertNotEquals(addon.syntaxRegistry(), unmodifiable.registries().stream() + .filter(registry -> registry instanceof SyntaxRegistry) + .findFirst() + .orElseThrow()); } @Test