Skip to content

Commit 88c3679

Browse files
committed
child module support
1 parent 5cdcbab commit 88c3679

11 files changed

Lines changed: 174 additions & 9 deletions

File tree

src/main/java/org/skriptlang/skript/addon/AddonModule.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,27 @@
1414
* The <code>load</code> phase should be used for loading components more specific to the module, such as syntax.
1515
* @see SkriptAddon#loadModules(AddonModule...)
1616
*/
17-
@FunctionalInterface
1817
public interface AddonModule {
1918

2019
/**
2120
* Constructs an origin from an addon and module name.
2221
* @param addon The addon providing the module.
23-
* @param moduleName The name of the providing module.
22+
* @param moduleNames The names of the providing modules. The most specific module name should be first.
2423
* @return An origin from the provided information.
2524
*/
26-
static ModuleOrigin origin(SkriptAddon addon, String moduleName) {
27-
return new AddonModuleImpl.ModuleOriginImpl(addon, moduleName);
25+
static ModuleOrigin origin(SkriptAddon addon, String... moduleNames) {
26+
return new AddonModuleImpl.ModuleOriginImpl(addon, moduleNames);
2827
}
2928

3029
/**
31-
* An origin to be used for something provided by a module of an addon.
30+
* An origin to be used for something provided by one or more modules of an addon.
3231
*/
33-
sealed interface ModuleOrigin extends AddonOrigin permits AddonModuleImpl.ModuleOriginImpl {
32+
sealed interface ModuleOrigin extends AddonOrigin permits AddonModuleImpl.ModuleOriginImpl, ChildAddonModule.ChildModuleOriginImpl {
3433

3534
/**
36-
* @return The name of the module represented by this origin.
35+
* @return The names of the modules represented by this origin.
3736
*/
38-
String moduleName();
37+
String[] moduleNames();
3938

4039
}
4140

@@ -65,4 +64,16 @@ default boolean canLoad(SkriptAddon addon) {
6564
return true;
6665
}
6766

67+
/**
68+
* @return A name representing this module to be using in the {@link ModuleOrigin}. e.g. "discord", "nbt", "particles"...
69+
*/
70+
String name();
71+
72+
/**
73+
* @return An origin representing this module.
74+
*/
75+
default ModuleOrigin origin(SkriptAddon addon) {
76+
return AddonModule.origin(addon, name());
77+
}
78+
6879
}

src/main/java/org/skriptlang/skript/addon/AddonModuleImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
class AddonModuleImpl {
66

7-
public record ModuleOriginImpl(SkriptAddon addon, String moduleName) implements ModuleOrigin { }
7+
public record ModuleOriginImpl(SkriptAddon addon, String... moduleNames) implements ModuleOrigin { }
88

99
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package org.skriptlang.skript.addon;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* A child module is intended to be created by another {@link AddonModule} as a way to further organize elements.
8+
* It behaves the same way as a normal module, but allows accessing the parent module if needed.
9+
*/
10+
public abstract class ChildAddonModule implements AddonModule {
11+
12+
private final AddonModule parentModule;
13+
14+
/**
15+
* Constructs an origin from an addon and module name.
16+
* @param addon The addon providing the module.
17+
* @param moduleName The name of the providing module.
18+
* @return An origin from the provided information.
19+
*/
20+
static ModuleOrigin origin(SkriptAddon addon, AddonModule parentModule, String moduleName) {
21+
return new ChildModuleOriginImpl(addon, parentModule, moduleName);
22+
}
23+
24+
/**
25+
* An origin to be used for something provided by a child module of an addon.
26+
*/
27+
static final class ChildModuleOriginImpl implements ModuleOrigin {
28+
29+
SkriptAddon addon;
30+
AddonModule parentModule;
31+
String[] moduleNames;
32+
33+
/**
34+
* Constructs a child module origin.
35+
* @param addon The addon providing the module. Ideally, this is the same as the parent module's addon.
36+
* @param parentModule The parent module that created this child module.
37+
* @param moduleName The name of the providing module.
38+
*/
39+
public ChildModuleOriginImpl(SkriptAddon addon, AddonModule parentModule, String moduleName) {
40+
this.addon = addon;
41+
this.parentModule = parentModule;
42+
43+
List<String> names = new ArrayList<>(List.of(moduleName));
44+
names.addAll(List.of(parentModule.origin(addon).moduleNames()));
45+
moduleNames = names.toArray(new String[0]);
46+
}
47+
48+
@Override
49+
public String[] moduleNames() {
50+
return moduleNames;
51+
}
52+
53+
@Override
54+
public SkriptAddon addon() {
55+
return addon;
56+
}
57+
58+
}
59+
60+
protected ChildAddonModule(AddonModule parentModule) {
61+
this.parentModule = parentModule;
62+
}
63+
64+
@Override
65+
public void init(SkriptAddon addon) {
66+
init(addon, parentModule);
67+
}
68+
69+
/**
70+
* Used for loading the components of this module that are needed first or by other modules (e.g. class infos).
71+
* <b>This method will always be called before {@link #load(SkriptAddon, AddonModule)}</b>.
72+
* @param addon The addon this module belongs to.
73+
* @param parentModule The parent module that created this child module.
74+
* @see #load(SkriptAddon)
75+
*/
76+
protected abstract void init(SkriptAddon addon, AddonModule parentModule);
77+
78+
@Override
79+
public void load(SkriptAddon addon) {
80+
load(addon, parentModule);
81+
}
82+
83+
/**
84+
* Used for loading the components (e.g. syntax) of this module.
85+
* @param addon The addon this module belongs to.
86+
* @param parentModule The parent module that created this child module.
87+
* @see #init(SkriptAddon, AddonModule)
88+
*/
89+
protected abstract void load(SkriptAddon addon, AddonModule parentModule);
90+
91+
@Override
92+
public boolean canLoad(SkriptAddon addon) {
93+
return canLoad(addon, parentModule);
94+
}
95+
96+
/**
97+
* Allow addons to specify whether they can load or not.
98+
* Called prior to {@link #init(SkriptAddon)}
99+
*
100+
* @param addon The addon this module belongs to.
101+
* @param parentModule The parent module that created this child module.
102+
* @return Whether this module can load.
103+
*/
104+
protected boolean canLoad(SkriptAddon addon, AddonModule parentModule) {
105+
return AddonModule.super.canLoad(addon);
106+
}
107+
108+
@Override
109+
public ModuleOrigin origin(SkriptAddon addon) {
110+
return ChildAddonModule.origin(addon, parentModule, name());
111+
}
112+
}

src/main/java/org/skriptlang/skript/bukkit/brewing/BrewingModule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818

1919
public class BrewingModule implements AddonModule {
2020

21+
@Override
22+
public String name() {
23+
return "brewing";
24+
}
25+
2126
@Override
2227
public void load(SkriptAddon addon) {
2328
register(addon.syntaxRegistry(),

src/main/java/org/skriptlang/skript/bukkit/damagesource/DamageSourceModule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818

1919
public class DamageSourceModule implements AddonModule {
2020

21+
@Override
22+
public String name() {
23+
return "damage source";
24+
}
25+
2126
@Override
2227
public boolean canLoad(SkriptAddon addon) {
2328
return Skript.classExists("org.bukkit.damage.DamageSource");

src/main/java/org/skriptlang/skript/bukkit/entity/EntityModule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99

1010
public class EntityModule implements AddonModule {
1111

12+
@Override
13+
public String name() {
14+
return "entities";
15+
}
16+
1217
@Override
1318
public void load(SkriptAddon addon) {
1419
if (Skript.classExists("org.bukkit.entity.Nautilus")) {

src/main/java/org/skriptlang/skript/bukkit/itemcomponents/ItemComponentModule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212

1313
public class ItemComponentModule implements AddonModule {
1414

15+
@Override
16+
public String name() {
17+
return "item component";
18+
}
19+
1520
@Override
1621
public boolean canLoad(SkriptAddon addon) {
1722
return Skript.classExists("io.papermc.paper.datacomponent.BuildableDataComponent");

src/main/java/org/skriptlang/skript/bukkit/itemcomponents/equippable/EquippableModule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@
2323

2424
public class EquippableModule implements AddonModule {
2525

26+
@Override
27+
public String name() {
28+
return "equippable component";
29+
}
30+
2631
@Override
2732
public boolean canLoad(SkriptAddon addon) {
2833
return Skript.classExists("io.papermc.paper.datacomponent.item.Equippable");

src/main/java/org/skriptlang/skript/bukkit/potion/PotionModule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@
3636

3737
public class PotionModule implements AddonModule {
3838

39+
@Override
40+
public String name() {
41+
return "potion";
42+
}
43+
3944
@Override
4045
public void init(SkriptAddon addon) {
4146
// Register ClassInfos

src/main/java/org/skriptlang/skript/common/CommonModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
import java.io.IOException;
99

1010
public class CommonModule implements AddonModule {
11+
12+
@Override
13+
public String name() {
14+
return "common";
15+
}
16+
1117
@Override
1218
public void load(SkriptAddon addon) {
1319
try {
@@ -18,4 +24,5 @@ public void load(SkriptAddon addon) {
1824

1925
addon.loadModules(new PropertiesModule());
2026
}
27+
2128
}

0 commit comments

Comments
 (0)