Skip to content

Commit 1e6bf23

Browse files
Add Origin-applying SyntaxRegistry (SkriptLang#8376)
1 parent 01d155a commit 1e6bf23

4 files changed

Lines changed: 79 additions & 53 deletions

File tree

src/main/java/org/skriptlang/skript/SkriptImpl.java

Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import org.skriptlang.skript.addon.SkriptAddon;
99
import org.skriptlang.skript.docs.Origin;
1010
import org.skriptlang.skript.localization.Localizer;
11-
import org.skriptlang.skript.registration.SyntaxInfo;
1211
import org.skriptlang.skript.registration.SyntaxRegistry;
1312
import org.skriptlang.skript.util.Registry;
1413

@@ -27,7 +26,7 @@ final class SkriptImpl implements Skript {
2726

2827
SkriptImpl(Class<?> source, String name) {
2928
addon = new SkriptAddonImpl(this, source, name, Localizer.of(this));
30-
storeRegistry(SyntaxRegistry.class, new AddonAwareSyntaxRegistry(SyntaxRegistry.empty(), this));
29+
storeRegistry(SyntaxRegistry.class, SyntaxRegistry.withOrigin(SyntaxRegistry.empty(), Origin.of(this)));
3130
}
3231

3332
/*
@@ -132,13 +131,14 @@ private static final class SkriptAddonImpl implements SkriptAddon {
132131
private final Class<?> source;
133132
private final String name;
134133
private final Localizer localizer;
135-
private AddonAwareSyntaxRegistry syntaxRegistry;
134+
private final Origin origin;
136135

137136
SkriptAddonImpl(Skript skript, Class<?> source, String name, @Nullable Localizer localizer) {
138137
this.skript = skript;
139138
this.source = source;
140139
this.name = name;
141140
this.localizer = localizer == null ? Localizer.of(this) : localizer;
141+
this.origin = Origin.of(this);
142142
}
143143

144144
@Override
@@ -170,11 +170,8 @@ public boolean hasRegistry(Class<? extends Registry<?>> registryClass) {
170170
public <R extends Registry<?>> R registry(Class<R> registryClass) {
171171
R registry = skript.registry(registryClass);
172172
if (registryClass == SyntaxRegistry.class) {
173-
if (syntaxRegistry == null || syntaxRegistry.syntaxRegistry != registry) { // stored syntax registry has changed...
174-
this.syntaxRegistry = new AddonAwareSyntaxRegistry((SyntaxRegistry) registry, this);
175-
}
176173
//noinspection unchecked
177-
return (R) syntaxRegistry;
174+
return (R) SyntaxRegistry.withOrigin((SyntaxRegistry) registry, origin);
178175
}
179176
return registry;
180177
}
@@ -281,49 +278,4 @@ public Skript unmodifiableView() {
281278

282279
}
283280

284-
/*
285-
* SyntaxRegistry Implementations
286-
*/
287-
288-
private static final class AddonAwareSyntaxRegistry implements SyntaxRegistry {
289-
290-
final SyntaxRegistry syntaxRegistry;
291-
private final SkriptAddon addon;
292-
293-
public AddonAwareSyntaxRegistry(SyntaxRegistry syntaxRegistry, SkriptAddon addon) {
294-
this.syntaxRegistry = syntaxRegistry;
295-
this.addon = addon;
296-
}
297-
298-
@Override
299-
public @Unmodifiable <I extends SyntaxInfo<?>> Collection<I> syntaxes(Key<I> key) {
300-
return syntaxRegistry.syntaxes(key);
301-
}
302-
303-
@Override
304-
public <I extends SyntaxInfo<?>> void register(Key<I> key, I info) {
305-
if (info.origin() == Origin.UNKNOWN) { // when origin is unspecified, add one
306-
//noinspection unchecked
307-
info = (I) info.toBuilder().origin(Origin.of(addon)).build();
308-
}
309-
syntaxRegistry.register(key, info);
310-
}
311-
312-
@Override
313-
public void unregister(SyntaxInfo<?> info) {
314-
syntaxRegistry.unregister(info);
315-
}
316-
317-
@Override
318-
public <I extends SyntaxInfo<?>> void unregister(Key<I> key, I info) {
319-
syntaxRegistry.unregister(key, info);
320-
}
321-
322-
@Override
323-
public @Unmodifiable Collection<SyntaxInfo<?>> elements() {
324-
return syntaxRegistry.elements();
325-
}
326-
327-
}
328-
329281
}

src/main/java/org/skriptlang/skript/registration/SyntaxRegistry.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import ch.njol.skript.lang.Statement;
88
import org.jetbrains.annotations.Contract;
99
import org.jetbrains.annotations.Unmodifiable;
10+
import org.skriptlang.skript.docs.Origin;
1011
import org.skriptlang.skript.lang.structure.Structure;
1112
import org.skriptlang.skript.util.Registry;
1213
import org.skriptlang.skript.util.ViewProvider;
@@ -59,6 +60,17 @@ static SyntaxRegistry empty() {
5960
return new SyntaxRegistryImpl();
6061
}
6162

63+
/**
64+
* Constructs a syntax registry that applies an origin to all syntax infos registered through it
65+
* with the {@link Origin#UNKNOWN} origin.
66+
* @param syntaxRegistry The syntax registry providing the implementation.
67+
* @param origin The origin to apply.
68+
* @return A syntax registry that applies an origin.
69+
*/
70+
static SyntaxRegistry withOrigin(SyntaxRegistry syntaxRegistry, Origin origin) {
71+
return new SyntaxRegistryImpl.OriginApplyingRegistry(syntaxRegistry, origin);
72+
}
73+
6274
/**
6375
* A method to obtain all syntaxes registered under a certain key.
6476
* @param key The key to obtain syntaxes from.

src/main/java/org/skriptlang/skript/registration/SyntaxRegistryImpl.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import com.google.common.base.MoreObjects;
44
import com.google.common.collect.ImmutableSet;
55
import org.jetbrains.annotations.Unmodifiable;
6+
import org.skriptlang.skript.docs.Origin;
67

78
import java.util.Collection;
9+
import java.util.List;
810
import java.util.Map;
911
import java.util.Objects;
1012
import java.util.concurrent.ConcurrentHashMap;
@@ -59,6 +61,47 @@ public Collection<SyntaxInfo<?>> elements() {
5961
return builder.build();
6062
}
6163

64+
static final class OriginApplyingRegistry implements SyntaxRegistry {
65+
66+
private final SyntaxRegistry syntaxRegistry;
67+
private final Origin origin;
68+
69+
OriginApplyingRegistry(SyntaxRegistry syntaxRegistry, Origin origin) {
70+
this.syntaxRegistry = syntaxRegistry;
71+
this.origin = origin;
72+
}
73+
74+
@Override
75+
public @Unmodifiable <I extends SyntaxInfo<?>> Collection<I> syntaxes(Key<I> key) {
76+
return syntaxRegistry.syntaxes(key);
77+
}
78+
79+
@Override
80+
public <I extends SyntaxInfo<?>> void register(Key<I> key, I info) {
81+
if (info.origin() == Origin.UNKNOWN) { // when origin is unspecified, add one
82+
//noinspection unchecked
83+
info = (I) info.toBuilder().origin(origin).build();
84+
}
85+
syntaxRegistry.register(key, info);
86+
}
87+
88+
@Override
89+
public void unregister(SyntaxInfo<?> info) {
90+
syntaxRegistry.unregister(info);
91+
}
92+
93+
@Override
94+
public <I extends SyntaxInfo<?>> void unregister(Key<I> key, I info) {
95+
syntaxRegistry.unregister(key, info);
96+
}
97+
98+
@Override
99+
public @Unmodifiable Collection<SyntaxInfo<?>> elements() {
100+
return syntaxRegistry.elements();
101+
}
102+
103+
}
104+
62105
static final class UnmodifiableRegistry implements SyntaxRegistry {
63106

64107
private final SyntaxRegistry registry;

src/test/java/org/skriptlang/skript/addon/BaseSkriptAddonTests.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package org.skriptlang.skript.addon;
22

3+
import ch.njol.skript.lang.SyntaxElement;
34
import org.junit.Test;
5+
import org.skriptlang.skript.docs.Origin.AddonOrigin;
6+
import org.skriptlang.skript.registration.SyntaxInfo;
47
import org.skriptlang.skript.registration.SyntaxRegistry;
58
import org.skriptlang.skript.util.Registry;
69

@@ -88,7 +91,6 @@ public void testSyntaxRegistry() {
8891
assertNotNull(unmodifiable.syntaxRegistry());
8992
// unmodifiable's syntax registry should be unmodifiable (different)
9093
assertNotEquals(addon.syntaxRegistry(), unmodifiable.syntaxRegistry());
91-
assertEquals(addon.registry(SyntaxRegistry.class), addon.syntaxRegistry());
9294
}
9395

9496
@Test
@@ -99,4 +101,21 @@ public void testLocalizer() {
99101
assertNotNull(addon.unmodifiableView().localizer());
100102
}
101103

104+
@Test
105+
public void testAutomaticOrigin() {
106+
final SkriptAddon addon = addon();
107+
108+
addon.syntaxRegistry().register(SyntaxRegistry.Key.of("OriginTest"), SyntaxInfo.builder(SyntaxElement.class)
109+
.supplier(() -> {
110+
throw new UnsupportedOperationException();
111+
})
112+
.addPattern("OriginTest")
113+
.build()
114+
);
115+
116+
var info = addon.syntaxRegistry().elements().iterator().next();
117+
assertNotNull(info);
118+
assertTrue(info.origin() instanceof AddonOrigin addonOrigin && addonOrigin.addon().name().equals(addon.name()));
119+
}
120+
102121
}

0 commit comments

Comments
 (0)