Skip to content

Commit e0cdd4c

Browse files
committed
SkriptRegistration - gave functions their own Registrar
1 parent 96412df commit e0cdd4c

File tree

3 files changed

+128
-11
lines changed

3 files changed

+128
-11
lines changed

src/main/java/io/github/syst3ms/skriptparser/registration/SkriptRegistration.java

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import io.github.syst3ms.skriptparser.registration.tags.Tag;
3434
import io.github.syst3ms.skriptparser.registration.tags.TagInfo;
3535
import io.github.syst3ms.skriptparser.registration.tags.TagManager;
36+
import io.github.syst3ms.skriptparser.structures.functions.FunctionParameter;
37+
import io.github.syst3ms.skriptparser.structures.functions.Functions;
38+
import io.github.syst3ms.skriptparser.structures.functions.JavaFunction;
3639
import io.github.syst3ms.skriptparser.types.Type;
3740
import io.github.syst3ms.skriptparser.types.TypeManager;
3841
import io.github.syst3ms.skriptparser.types.changers.Arithmetic;
@@ -46,6 +49,7 @@
4649
import org.jetbrains.annotations.NotNull;
4750
import org.jetbrains.annotations.Nullable;
4851

52+
import java.lang.reflect.Array;
4953
import java.util.ArrayList;
5054
import java.util.Collections;
5155
import java.util.HashMap;
@@ -80,6 +84,7 @@ public class SkriptRegistration {
8084
private final List<TagInfo<? extends Tag>> tags = new ArrayList<>();
8185
private final List<SkriptEventInfo<?>> events = new ArrayList<>();
8286
private final List<StructureInfo<?>> structures = new ArrayList<>();
87+
private final List<FunctionRegistrar<?>> functions = new ArrayList<>();
8388
private final SkriptAddon registerer;
8489
private final SkriptLogger logger;
8590
protected boolean newTypes;
@@ -172,6 +177,13 @@ public List<StructureInfo<?>> getStructures() {
172177
return this.structures;
173178
}
174179

180+
/**
181+
* @return All currently registered functions
182+
*/
183+
public List<FunctionRegistrar<?>> getFunctions() {
184+
return this.functions;
185+
}
186+
175187
/**
176188
* @return all currently registered types
177189
*/
@@ -765,6 +777,9 @@ public List<LogEntry> register(boolean ignoreLogs) {
765777
Converters.registerConverters(this);
766778
Converters.createMissingConverters();
767779
finishConsumers.forEach(consumer -> consumer.accept(registerer));
780+
for (FunctionRegistrar<?> function : getFunctions()) {
781+
Functions.registerFunction(this, function.javaFunction);
782+
}
768783
if (ignoreLogs) {
769784
logger.clearLogs();
770785
return new ArrayList<>();
@@ -1048,6 +1063,105 @@ public void register() {
10481063
}
10491064
}
10501065

1066+
public class FunctionRegistrar<T> implements Registrar {
1067+
1068+
private final Documentation documentation = new Documentation();
1069+
private final String functionName;
1070+
private final Class<T> returnType;
1071+
private final boolean isSingle;
1072+
private final List<FunctionParameter<?>> params = new ArrayList<>();
1073+
public JavaFunction<T> javaFunction;
1074+
private Function<Object[][],T[]> func;
1075+
1076+
public FunctionRegistrar(String functionName, Class<T> returnType, boolean isSingle) {
1077+
this.functionName = functionName;
1078+
this.returnType = returnType;
1079+
this.isSingle = isSingle;
1080+
}
1081+
1082+
public FunctionRegistrar<T> parameter(String name, Class<?> type, boolean single) {
1083+
FunctionParameter<?> param = new FunctionParameter<>(name, type, single);
1084+
this.params.add(param);
1085+
return this;
1086+
}
1087+
1088+
public FunctionRegistrar<T> parameter(String name, Class<?> type) {
1089+
FunctionParameter<?> param = new FunctionParameter<>(name, type, true);
1090+
this.params.add(param);
1091+
return this;
1092+
}
1093+
1094+
1095+
public FunctionRegistrar<T> execute(Function<Object[][],T[]> params) {
1096+
this.func = params;
1097+
return this;
1098+
}
1099+
1100+
@SuppressWarnings("unchecked")
1101+
public FunctionRegistrar<T> executeSingle(Function<Object[][],T> params) {
1102+
this.func = objects -> {
1103+
T[] o = (T[]) Array.newInstance(this.returnType, 1);
1104+
o[0] = params.apply(objects);
1105+
return o;
1106+
};
1107+
return this;
1108+
}
1109+
1110+
public FunctionRegistrar<T> noDoc() {
1111+
this.documentation.noDoc();
1112+
return this;
1113+
}
1114+
1115+
public FunctionRegistrar<T> experimental() {
1116+
this.documentation.experimental();
1117+
return this;
1118+
}
1119+
1120+
public FunctionRegistrar<T> experimental(String message) {
1121+
this.documentation.experimental(message);
1122+
return this;
1123+
}
1124+
1125+
public FunctionRegistrar<T> name(String name) {
1126+
this.documentation.setName(name);
1127+
return this;
1128+
}
1129+
1130+
public FunctionRegistrar<T> description(String... description) {
1131+
this.documentation.setDescription(description);
1132+
return this;
1133+
}
1134+
1135+
public FunctionRegistrar<T> examples(String... examples) {
1136+
this.documentation.setExamples(examples);
1137+
return this;
1138+
}
1139+
1140+
public FunctionRegistrar<T> since(String since) {
1141+
this.documentation.setSince(since);
1142+
return this;
1143+
}
1144+
1145+
@Override
1146+
public void register() {
1147+
this.javaFunction = new JavaFunction<>(this.functionName,
1148+
this.params.toArray(new FunctionParameter[0]),
1149+
this.returnType,
1150+
this.isSingle) {
1151+
@Override
1152+
public T[] executeSimple(Object[][] params) {
1153+
return func.apply(params);
1154+
}
1155+
};
1156+
SkriptRegistration.this.functions.add(this);
1157+
}
1158+
}
1159+
1160+
public <T> FunctionRegistrar<T> newJavaFunction(String functionName, Class<T> returnType, boolean isSingle) {
1161+
return new FunctionRegistrar<>(functionName, returnType, isSingle);
1162+
1163+
}
1164+
10511165
public class ExpressionRegistrar<C extends Expression<? extends T>, T> extends SyntaxRegistrar<C> {
10521166
private final Class<T> returnType;
10531167
private final boolean isSingle;

src/main/java/io/github/syst3ms/skriptparser/structures/functions/DefaultFunctions.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,14 @@ public class DefaultFunctions {
77

88
static {
99
SkriptRegistration reg = Parser.getMainRegistration();
10-
Functions.newJavaFunction(reg, new JavaFunction<>(
11-
"mod",
12-
new FunctionParameter[]{new FunctionParameter<>("i", Number.class, true), new FunctionParameter<>("m", Number.class, true)},
13-
Number.class,
14-
true) {
15-
@Override
16-
public Number[] executeSimple(Object[][] params) {
17-
Number d = (Number) params[0][0];
18-
Number m = (Number) params[1][0];
19-
return new Number[]{d.doubleValue() % m.doubleValue()};
20-
}
10+
11+
reg.newJavaFunction("mod", Number.class, true)
12+
.parameter("i", Number.class, true)
13+
.parameter("m", Number.class, true)
14+
.executeSingle(params -> {
15+
Number i = (Number) params[0][0];
16+
Number m = (Number) params[1][0];
17+
return i.doubleValue() % m.doubleValue();
2118
})
2219
.name("Mod")
2320
.description("Returns the remainder of the division of the first number by the second one.")

src/main/java/io/github/syst3ms/skriptparser/structures/functions/Functions.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,15 @@ public static boolean isValidFunctionName(String name) {
127127
}
128128

129129

130+
/**
131+
* Use {@link SkriptRegistration#newJavaFunction(String, Class, boolean)} instead
132+
*/
133+
@Deprecated(forRemoval = true)
130134
public static FunctionDefinition newJavaFunction(SkriptRegistration registration, JavaFunction<?> function) {
131135
return new FunctionDefinition(registration, function);
132136
}
133137

138+
@Deprecated(forRemoval = true)
134139
public static class FunctionDefinition {
135140
private final SkriptRegistration registration;
136141
private final Documentation documentation = new Documentation();
@@ -186,4 +191,5 @@ public void register() {
186191
Functions.registerFunction(this.registration, this.function);
187192
}
188193
}
194+
189195
}

0 commit comments

Comments
 (0)