Skip to content

Commit 77173b2

Browse files
authored
Adds a preinit() method to SyntaxElement (#7778)
* pre-init method * fix merge mistakes * Update SkriptParser.java
1 parent 38bf676 commit 77173b2

File tree

5 files changed

+76
-44
lines changed

5 files changed

+76
-44
lines changed

src/main/java/ch/njol/skript/expressions/base/SimplePropertyExpression.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package ch.njol.skript.expressions.base;
22

3-
import ch.njol.skript.config.Node;
43
import ch.njol.skript.lang.Expression;
54
import ch.njol.skript.lang.SkriptParser.ParseResult;
65
import ch.njol.skript.util.LiteralUtils;
76
import ch.njol.util.Kleenean;
87
import org.bukkit.event.Event;
98
import org.jetbrains.annotations.Nullable;
10-
import org.skriptlang.skript.log.runtime.SyntaxRuntimeErrorProducer;
119
import org.skriptlang.skript.lang.converter.Converter;
1210

1311
/**
@@ -16,9 +14,8 @@
1614
* @see PropertyExpression
1715
* @see PropertyExpression#register(Class, Class, String, String)
1816
*/
19-
public abstract class SimplePropertyExpression<F, T> extends PropertyExpression<F, T> implements Converter<F, T>, SyntaxRuntimeErrorProducer {
17+
public abstract class SimplePropertyExpression<F, T> extends PropertyExpression<F, T> implements Converter<F, T> {
2018

21-
private Node node;
2219
protected String rawExpr;
2320

2421
@Override
@@ -29,7 +26,6 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean is
2926
return LiteralUtils.canInitSafely(getExpr());
3027
}
3128
setExpr((Expression<? extends F>) expressions[0]);
32-
node = getParser().getNode();
3329
rawExpr = parseResult.expr;
3430
return true;
3531
}
@@ -43,11 +39,6 @@ protected T[] get(Event event, F[] source) {
4339
return super.get(source, this);
4440
}
4541

46-
@Override
47-
public Node getNode() {
48-
return node;
49-
}
50-
5142
/**
5243
* Used to collect the property type used in the register method.
5344
* This forms the toString of this SimplePropertyExpression.

src/main/java/ch/njol/skript/lang/SkriptParser.java

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.skriptlang.skript.lang.script.Script;
4444
import org.skriptlang.skript.lang.script.ScriptWarning;
4545

46+
import java.lang.reflect.Array;
4647
import java.util.*;
4748
import java.util.concurrent.ConcurrentHashMap;
4849
import java.util.concurrent.atomic.AtomicBoolean;
@@ -52,7 +53,6 @@
5253
import java.util.regex.Pattern;
5354
import java.util.regex.PatternSyntaxException;
5455
import java.util.stream.Stream;
55-
import java.lang.reflect.Array;
5656

5757
/**
5858
* Used for parsing my custom patterns.<br>
@@ -237,19 +237,13 @@ public boolean hasTag(String tag) {
237237
}
238238
T element = info.getElementClass().newInstance();
239239

240-
if (element instanceof EventRestrictedSyntax eventRestrictedSyntax) {
241-
Class<? extends Event>[] supportedEvents = eventRestrictedSyntax.supportedEvents();
242-
if (!getParser().isCurrentEvent(supportedEvents)) {
243-
Skript.error("'" + parseResult.expr + "' can only be used in " + supportedEventsNames(supportedEvents));
244-
continue;
245-
}
246-
}
247-
if (element instanceof ExperimentalSyntax experimentalSyntax) {
248-
if (!experimentalSyntax.isSatisfiedBy(getParser().getExperimentSet()))
249-
continue;
250-
}
240+
if (!checkRestrictedEvents(element, parseResult))
241+
continue;
242+
243+
if (!checkExperimentalSyntax(element))
244+
continue;
251245

252-
boolean success = element.init(parseResult.exprs, patternIndex, getParser().getHasDelayBefore(), parseResult);
246+
boolean success = element.preInit() && element.init(parseResult.exprs, patternIndex, getParser().getHasDelayBefore(), parseResult);
253247
if (success) {
254248
log.printLog();
255249
return element;
@@ -267,7 +261,31 @@ public boolean hasTag(String tag) {
267261
}
268262
}
269263

270-
private static String supportedEventsNames(Class<? extends Event>[] supportedEvents) {
264+
/**
265+
* Checks whether the given element is restricted to specific events, and if so, whether the current event is allowed.
266+
* Prints errors.
267+
* @param element The syntax element to check.
268+
* @param parseResult The parse result for error information.
269+
* @return True if the element is allowed in the current event, false otherwise.
270+
*/
271+
private static boolean checkRestrictedEvents(SyntaxElement element, ParseResult parseResult) {
272+
if (element instanceof EventRestrictedSyntax eventRestrictedSyntax) {
273+
Class<? extends Event>[] supportedEvents = eventRestrictedSyntax.supportedEvents();
274+
if (!getParser().isCurrentEvent(supportedEvents)) {
275+
Skript.error("'" + parseResult.expr + "' can only be used in " + supportedEventsNames(supportedEvents));
276+
return false;
277+
}
278+
}
279+
return true;
280+
}
281+
282+
/**
283+
* Returns a string with the names of the supported skript events for the given class array.
284+
* If no events are found, returns an empty string.
285+
* @param supportedEvents The array of supported event classes.
286+
* @return A string with the names of the supported skript events, or an empty string if none are found.
287+
*/
288+
private static @NotNull String supportedEventsNames(Class<? extends Event>[] supportedEvents) {
271289
List<String> names = new ArrayList<>();
272290

273291
for (SkriptEventInfo<?> eventInfo : Skript.getEvents()) {
@@ -283,6 +301,18 @@ private static String supportedEventsNames(Class<? extends Event>[] supportedEve
283301
return StringUtils.join(names, ", ", " or ");
284302
}
285303

304+
/**
305+
* Checks whether the given element is experimental and if so, whether the current experiment set satisfies it.
306+
* Prints errors.
307+
* @param element The syntax element to check.
308+
* @return True if the element is allowed in the current experiment set, false otherwise.
309+
*/
310+
private static boolean checkExperimentalSyntax(SyntaxElement element) {
311+
if (element instanceof ExperimentalSyntax experimentalSyntax)
312+
return experimentalSyntax.isSatisfiedBy(getParser().getExperimentSet());
313+
return true;
314+
}
315+
286316
private static @NotNull DefaultExpression<?> getDefaultExpression(ExprInfo exprInfo, String pattern) {
287317
DefaultExpression<?> expr = exprInfo.classes[0].getDefaultExpression();
288318
if (expr == null)

src/main/java/ch/njol/skript/lang/SyntaxElement.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,19 @@
1212
public interface SyntaxElement {
1313

1414
/**
15-
* Called just after the constructor.
15+
* Called immediately after the constructor. This should be used to do any work that need to be done prior to
16+
* downstream initialization. This is not intended to be used by syntaxes directly, but by parent classes to do
17+
* work prior to the initialization of the child classes.
18+
*
19+
* @return Whether this expression was pre-initialised successfully.
20+
* An error should be printed prior to returning false to specify the cause.
21+
*/
22+
default boolean preInit() {
23+
return true;
24+
}
25+
26+
/**
27+
* Called just after the constructor and {@link #preInit}.
1628
*
1729
* @param expressions all %expr%s included in the matching pattern in the order they appear in the pattern. If an optional value was left out, it will still be included in this list
1830
* holding the default value of the desired type, which usually depends on the event.

src/main/java/ch/njol/skript/lang/util/SimpleExpression.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import ch.njol.skript.classes.Changer;
66
import ch.njol.skript.classes.Changer.ChangeMode;
77
import ch.njol.skript.classes.ClassInfo;
8+
import ch.njol.skript.config.Node;
89
import ch.njol.skript.lang.Expression;
910
import ch.njol.skript.lang.ExpressionType;
1011
import ch.njol.skript.lang.Loopable;
@@ -18,24 +19,31 @@
1819
import org.jetbrains.annotations.NotNull;
1920
import org.jetbrains.annotations.Nullable;
2021
import org.skriptlang.skript.lang.converter.Converter;
22+
import org.skriptlang.skript.log.runtime.SyntaxRuntimeErrorProducer;
2123

2224
import java.lang.reflect.Array;
2325
import java.util.Arrays;
2426
import java.util.Iterator;
25-
import java.util.List;
2627
import java.util.function.Predicate;
2728

2829
/**
2930
* An implementation of the {@link Expression} interface. You should usually extend this class to make a new expression.
3031
*
3132
* @see Skript#registerExpression(Class, Class, ExpressionType, String...)
3233
*/
33-
public abstract class SimpleExpression<T> implements Expression<T> {
34+
public abstract class SimpleExpression<T> implements Expression<T>, SyntaxRuntimeErrorProducer {
3435

3536
private int time = 0;
37+
private Node node;
3638

3739
protected SimpleExpression() {}
3840

41+
@Override
42+
public boolean preInit() {
43+
node = getParser().getNode();
44+
return Expression.super.preInit();
45+
}
46+
3947
@Override
4048
public final @Nullable T getSingle(Event event) {
4149
T[] values = getArray(event);
@@ -330,6 +338,11 @@ public Expression<?> getSource() {
330338
return this;
331339
}
332340

341+
@Override
342+
public Node getNode() {
343+
return node;
344+
}
345+
333346
@Override
334347
public Expression<? extends T> simplify() {
335348
return this;
@@ -344,4 +357,5 @@ public boolean getAnd() {
344357
public boolean supportsLoopPeeking() {
345358
return true;
346359
}
360+
347361
}

src/main/java/org/skriptlang/skript/bukkit/tags/elements/ExprTag.java

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package org.skriptlang.skript.bukkit.tags.elements;
22

33
import ch.njol.skript.Skript;
4-
import ch.njol.skript.config.Node;
5-
import ch.njol.skript.doc.Description;
6-
import ch.njol.skript.doc.Examples;
7-
import ch.njol.skript.doc.Keywords;
8-
import ch.njol.skript.doc.Name;
9-
import ch.njol.skript.doc.RequiredPlugins;
10-
import ch.njol.skript.doc.Since;
4+
import ch.njol.skript.doc.*;
115
import ch.njol.skript.lang.Expression;
126
import ch.njol.skript.lang.ExpressionType;
137
import ch.njol.skript.lang.Literal;
@@ -23,7 +17,6 @@
2317
import org.skriptlang.skript.bukkit.tags.TagModule;
2418
import org.skriptlang.skript.bukkit.tags.TagType;
2519
import org.skriptlang.skript.bukkit.tags.sources.TagOrigin;
26-
import org.skriptlang.skript.log.runtime.SyntaxRuntimeErrorProducer;
2720

2821
import java.util.ArrayList;
2922
import java.util.List;
@@ -53,7 +46,7 @@
5346
@Since("2.10")
5447
@RequiredPlugins("Paper (paper tags)")
5548
@Keywords({"blocks", "minecraft tag", "type", "category"})
56-
public class ExprTag extends SimpleExpression<Tag> implements SyntaxRuntimeErrorProducer {
49+
public class ExprTag extends SimpleExpression<Tag> {
5750

5851
static {
5952
Skript.registerExpression(ExprTag.class, Tag.class, ExpressionType.COMBINED,
@@ -65,16 +58,13 @@ public class ExprTag extends SimpleExpression<Tag> implements SyntaxRuntimeError
6558
private TagOrigin origin;
6659
private boolean datapackOnly;
6760

68-
private Node node;
69-
7061
@Override
7162
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
7263
//noinspection unchecked
7364
names = (Expression<String>) expressions[0];
7465
types = TagType.fromParseMark(parseResult.mark);
7566
origin = TagOrigin.fromParseTags(parseResult.tags);
7667
datapackOnly = origin == TagOrigin.BUKKIT && parseResult.hasTag("datapack");
77-
node = getParser().getNode();
7868
return true;
7969
}
8070

@@ -142,11 +132,6 @@ public Class<? extends Tag> getReturnType() {
142132
return Tag.class;
143133
}
144134

145-
@Override
146-
public Node getNode() {
147-
return node;
148-
}
149-
150135
@Override
151136
public String toString(@Nullable Event event, boolean debug) {
152137
String registry = types.length > 1 ? "" : " " + types[0].toString();

0 commit comments

Comments
 (0)