Skip to content

Commit f7319ea

Browse files
authored
Improve ExpressionStatement parsing, lower priority for ExprJavaCall/ExprCustomEventValue (#162)
* Imporve ExpressionStatement parsing, lower priority for ExprJavaCall/ExprCustomEventValue * Update ExprCustomEventValue.java * Update SkriptMirror.java * oopsy! * fix? * remove ERS due to error pollution * Fix xyz() calls not getting the 1 parse mark
1 parent 5a17aa4 commit f7319ea

6 files changed

Lines changed: 88 additions & 33 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ tasks.withType(JavaCompile).configureEach {
2727

2828
dependencies {
2929
compileOnly group: 'io.papermc.paper', name: 'paper-api', version: '1.21.10-R0.1-SNAPSHOT'
30-
compileOnly group: 'com.github.SkriptLang', name: 'Skript', version: '2.14.0-pre1'
30+
compileOnly group: 'com.github.SkriptLang', name: 'Skript', version: '2.14.0'
3131
}

src/main/java/com/btk5h/skriptmirror/SkriptMirror.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,24 @@
55
import ch.njol.skript.classes.ClassInfo;
66
import ch.njol.skript.registrations.Classes;
77
import ch.njol.skript.util.Version;
8-
import org.skriptlang.reflect.syntax.condition.elements.StructCustomCondition;
9-
import org.skriptlang.reflect.syntax.effect.elements.StructCustomEffect;
10-
import org.skriptlang.reflect.syntax.event.elements.StructCustomEvent;
11-
import org.skriptlang.reflect.syntax.expression.elements.StructCustomExpression;
8+
import com.btk5h.skriptmirror.skript.CondExpressionStatement;
9+
import com.btk5h.skriptmirror.skript.EffExpressionStatement;
1210
import com.btk5h.skriptmirror.skript.reflect.ExprJavaCall;
1311
import com.btk5h.skriptmirror.skript.reflect.ExprProxy;
1412
import com.btk5h.skriptmirror.skript.reflect.sections.SecSection;
1513
import com.btk5h.skriptmirror.util.SkriptReflection;
1614
import org.bukkit.Bukkit;
1715
import org.bukkit.plugin.java.JavaPlugin;
16+
import org.skriptlang.reflect.syntax.condition.elements.StructCustomCondition;
17+
import org.skriptlang.reflect.syntax.effect.elements.StructCustomEffect;
18+
import org.skriptlang.reflect.syntax.event.elements.ExprCustomEventValue;
19+
import org.skriptlang.reflect.syntax.event.elements.StructCustomEvent;
20+
import org.skriptlang.reflect.syntax.expression.elements.StructCustomExpression;
1821
import org.skriptlang.skript.lang.comparator.Comparators;
1922
import org.skriptlang.skript.lang.comparator.Relation;
23+
import org.skriptlang.skript.registration.SyntaxInfo;
24+
import org.skriptlang.skript.registration.SyntaxRegistry;
25+
import org.skriptlang.skript.util.Priority;
2026

2127
import java.io.IOException;
2228
import java.nio.file.Path;
@@ -28,6 +34,8 @@ public class SkriptMirror extends JavaPlugin {
2834
private static SkriptMirror instance;
2935
private static SkriptAddon addonInstance;
3036

37+
public static final Priority SHADOW_REALM = Priority.after(SyntaxInfo.PATTERN_MATCHES_EVERYTHING);
38+
3139
public SkriptMirror() {
3240
if (instance == null) {
3341
instance = this;
@@ -44,7 +52,7 @@ public void onEnable() {
4452
return;
4553
}
4654

47-
if (Skript.getVersion().isSmallerThan(new Version("2.14.0-pre1"))) {
55+
if (!Skript.getVersion().isLargerThan(new Version("2.13.2"))) {
4856
getLogger().severe("");
4957
getLogger().severe("Your version of Skript (" + Skript.getVersion() + ") is not supported, at least Skript 2.14 is required to run this version of skript-reflect.");
5058
getLogger().severe("");
@@ -61,6 +69,12 @@ public void onEnable() {
6169
.loadClasses("com.btk5h.skriptmirror.skript")
6270
.loadClasses("org.skriptlang.reflect", "syntax", "java.elements");
6371

72+
SyntaxRegistry registry = addonInstance.syntaxRegistry();
73+
ExprCustomEventValue.register(registry);
74+
ExprJavaCall.register(registry);
75+
CondExpressionStatement.register(registry);
76+
EffExpressionStatement.register(registry);
77+
6478
Path dataFolder = SkriptMirror.getInstance().getDataFolder().toPath();
6579
LibraryLoader.loadLibraries(dataFolder);
6680
} catch (IOException e) {

src/main/java/com/btk5h/skriptmirror/skript/CondExpressionStatement.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,28 @@
1616
import com.btk5h.skriptmirror.util.SkriptUtil;
1717
import org.bukkit.Bukkit;
1818
import org.bukkit.event.Event;
19+
import org.skriptlang.skript.registration.SyntaxInfo;
20+
import org.skriptlang.skript.registration.SyntaxRegistry;
1921

2022
import java.util.concurrent.CompletableFuture;
2123
import java.util.concurrent.ExecutorService;
2224
import java.util.concurrent.Executors;
2325

2426
public class CondExpressionStatement extends Condition {
2527

26-
static {
27-
Skript.registerCondition(CondExpressionStatement.class, "[(1¦await)] %~javaobject%");
28+
public static void register(SyntaxRegistry registry) {
29+
registry.register(
30+
SyntaxRegistry.CONDITION,
31+
SyntaxInfo.builder(CondExpressionStatement.class)
32+
.addPattern("[1:await] <.+>")
33+
.supplier(CondExpressionStatement::new)
34+
.priority(SkriptMirror.SHADOW_REALM)
35+
.build());
2836
}
2937

3038
private static final ExecutorService threadPool = Executors.newCachedThreadPool();
3139

32-
private Expression<Object> arg;
40+
private Expression<?> arg;
3341
private boolean isAsynchronous;
3442
private boolean isCondition;
3543

@@ -74,10 +82,13 @@ public String toString(Event e, boolean debug) {
7482
@Override
7583
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed,
7684
SkriptParser.ParseResult parseResult) {
77-
arg = SkriptUtil.defendExpression(exprs[0]);
85+
String rawInput = parseResult.regexes.getFirst().group();
86+
// parse directly as ExprJavaCall to avoid useless parse attempts
87+
arg = ExprJavaCall.parse(rawInput);
7888

79-
if (!(arg instanceof ExprJavaCall))
89+
if (arg == null) {
8090
return false;
91+
}
8192

8293
isAsynchronous = (parseResult.mark & 1) == 1;
8394
isCondition = SkriptLogger.getNode() instanceof SectionNode;

src/main/java/com/btk5h/skriptmirror/skript/EffExpressionStatement.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.btk5h.skriptmirror.skript;
22

3-
import ch.njol.skript.Skript;
43
import ch.njol.skript.effects.Delay;
54
import ch.njol.skript.lang.Effect;
65
import ch.njol.skript.lang.Expression;
@@ -13,20 +12,28 @@
1312
import com.btk5h.skriptmirror.util.SkriptUtil;
1413
import org.bukkit.Bukkit;
1514
import org.bukkit.event.Event;
15+
import org.skriptlang.skript.registration.SyntaxInfo;
16+
import org.skriptlang.skript.registration.SyntaxRegistry;
1617

1718
import java.util.concurrent.CompletableFuture;
1819
import java.util.concurrent.ExecutorService;
1920
import java.util.concurrent.Executors;
2021

2122
public class EffExpressionStatement extends Effect {
22-
static {
23-
Skript.registerEffect(EffExpressionStatement.class, "[(1¦await)] %~javaobject%");
23+
public static void register(SyntaxRegistry registry) {
24+
registry.register(
25+
SyntaxRegistry.EFFECT,
26+
SyntaxInfo.builder(EffExpressionStatement.class)
27+
.addPattern("[1:await] <.+>")
28+
.supplier(EffExpressionStatement::new)
29+
.priority(SkriptMirror.SHADOW_REALM)
30+
.build());
2431
}
2532

2633
private static final ExecutorService threadPool =
2734
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
2835

29-
private Expression<Object> arg;
36+
private Expression<?> arg;
3037
private boolean isAsynchronous;
3138

3239
@Override
@@ -63,9 +70,11 @@ public String toString(Event e, boolean debug) {
6370
@Override
6471
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed,
6572
SkriptParser.ParseResult parseResult) {
66-
arg = SkriptUtil.defendExpression(exprs[0]);
73+
String rawInput = parseResult.regexes.getFirst().group();
74+
// parse directly as ExprJavaCall to avoid useless parse attempts
75+
arg = ExprJavaCall.parse(rawInput);
6776

68-
if (!(arg instanceof ExprJavaCall)) {
77+
if (arg == null) {
6978
return false;
7079
}
7180

src/main/java/com/btk5h/skriptmirror/skript/reflect/ExprJavaCall.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
import ch.njol.skript.Skript;
44
import ch.njol.skript.classes.Changer;
5-
import ch.njol.skript.lang.*;
5+
import ch.njol.skript.lang.Expression;
6+
import ch.njol.skript.lang.ExpressionList;
7+
import ch.njol.skript.lang.Literal;
8+
import ch.njol.skript.lang.SkriptParser;
69
import ch.njol.skript.lang.util.SimpleExpression;
710
import ch.njol.skript.registrations.Classes;
811
import ch.njol.skript.util.Utils;
9-
import ch.njol.util.Checker;
1012
import ch.njol.util.Kleenean;
1113
import ch.njol.util.coll.iterator.ArrayIterator;
1214
import com.btk5h.skriptmirror.Descriptor;
@@ -15,17 +17,19 @@
1517
import com.btk5h.skriptmirror.JavaType;
1618
import com.btk5h.skriptmirror.Null;
1719
import com.btk5h.skriptmirror.ObjectWrapper;
18-
import org.jetbrains.annotations.Nullable;
19-
import org.skriptlang.reflect.java.elements.structures.StructImport;
20+
import com.btk5h.skriptmirror.SkriptMirror;
2021
import com.btk5h.skriptmirror.util.JavaUtil;
2122
import com.btk5h.skriptmirror.util.LRUCache;
2223
import com.btk5h.skriptmirror.util.SkriptMirrorUtil;
2324
import com.btk5h.skriptmirror.util.SkriptUtil;
2425
import com.btk5h.skriptmirror.util.StringSimilarity;
2526
import com.btk5h.skriptmirror.util.lookup.LookupGetter;
2627
import org.bukkit.event.Event;
28+
import org.jetbrains.annotations.Nullable;
2729
import org.skriptlang.skript.lang.converter.Converters;
2830
import org.skriptlang.skript.lang.script.Script;
31+
import org.skriptlang.skript.registration.SyntaxInfo;
32+
import org.skriptlang.skript.registration.SyntaxRegistry;
2933

3034
import java.io.PrintWriter;
3135
import java.io.StringWriter;
@@ -57,7 +61,6 @@ public class ExprJavaCall<T> implements Expression<T> {
5761
private static final MethodHandles.Lookup LOOKUP = LookupGetter.getLookup();
5862
private static final Object[] NO_ARGS = new Object[0];
5963
private static final Descriptor CONSTRUCTOR_DESCRIPTOR = new Descriptor(null, "<init>", null);
60-
6164
/**
6265
* A regular expression that captures potential descriptors without actually validating the descriptor. This is done
6366
* both for performance reasons and to provide more helpful error messages when using a malformed descriptor.
@@ -67,13 +70,22 @@ public class ExprJavaCall<T> implements Expression<T> {
6770
"([^0-9. \\[\\]][^. \\[\\]]*\\b)" +
6871
"(\\[[\\w.$, ]*])?";
6972

70-
static {
71-
//noinspection unchecked
72-
Skript.registerExpression(ExprJavaCall.class, Object.class,
73-
ExpressionType.PATTERN_MATCHES_EVERYTHING,
74-
"[(2¦try)] %object%..%string%[\\((1¦[%-objects%])\\)]",
75-
"[(2¦try)] %object%.<" + LITE_DESCRIPTOR + ">[\\((1¦[%-objects%])\\)]",
76-
"[(2¦try)] [a] new %javatype%\\([%-objects%]\\)");
73+
@SuppressWarnings({"unchecked", "UnstableApiUsage"})
74+
static final SyntaxInfo<?> SYNTAX_INFO = SyntaxInfo.Expression.builder(ExprJavaCall.class, Object.class)
75+
.addPattern("[2:try] %object%..%string%[\\((1:[%-objects%])\\)]")
76+
.addPattern("[2:try] %object%.<" + LITE_DESCRIPTOR + ">[\\((1:[%-objects%])\\)]")
77+
.addPattern("[2:try] [a] new %javatype%\\([%-objects%]\\)")
78+
.supplier(ExprJavaCall::new)
79+
.priority(SkriptMirror.SHADOW_REALM)
80+
.build();
81+
82+
@SuppressWarnings({"UnstableApiUsage", "rawtypes"})
83+
public static void register(SyntaxRegistry registry) {
84+
registry.register(SyntaxRegistry.EXPRESSION, (SyntaxInfo.Expression) SYNTAX_INFO);
85+
}
86+
87+
public static @Nullable ExprJavaCall<?> parse(String rawInput) {
88+
return (ExprJavaCall<?>) SkriptParser.parse(rawInput, List.of(SYNTAX_INFO).iterator(), null);
7789
}
7890

7991
private enum CallType {

src/main/java/org/skriptlang/reflect/syntax/event/elements/ExprCustomEventValue.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,32 @@
55
import ch.njol.skript.classes.ClassInfo;
66
import ch.njol.skript.expressions.base.EventValueExpression;
77
import ch.njol.skript.lang.Expression;
8-
import ch.njol.skript.lang.ExpressionType;
98
import ch.njol.skript.lang.SkriptParser;
109
import ch.njol.skript.registrations.Classes;
1110
import ch.njol.util.Kleenean;
11+
import com.btk5h.skriptmirror.SkriptMirror;
1212
import org.bukkit.event.Event;
1313
import org.jetbrains.annotations.Nullable;
1414
import org.skriptlang.reflect.syntax.event.BukkitCustomEvent;
1515
import org.skriptlang.reflect.syntax.event.EventSyntaxInfo;
1616
import org.skriptlang.reflect.syntax.event.EventTriggerEvent;
17+
import org.skriptlang.skript.registration.SyntaxInfo;
18+
import org.skriptlang.skript.registration.SyntaxRegistry;
1719

1820
import java.lang.reflect.Array;
1921

2022
@SuppressWarnings("unused")
2123
public class ExprCustomEventValue<T> extends EventValueExpression<T> {
2224

23-
static {
24-
//noinspection unchecked
25-
Skript.registerExpression(ExprCustomEventValue.class, Object.class, ExpressionType.PATTERN_MATCHES_EVERYTHING, "[the] [event-]<.+>");
25+
@SuppressWarnings({"unchecked", "UnstableApiUsage", "RedundantCast", "rawtypes"})
26+
public static void register(SyntaxRegistry registry) {
27+
registry.register(
28+
SyntaxRegistry.EXPRESSION,
29+
(SyntaxInfo.Expression) SyntaxInfo.Expression.builder(ExprCustomEventValue.class, Object.class)
30+
.addPattern("[the] [event-]<.+>")
31+
.supplier(ExprCustomEventValue::new)
32+
.priority(SkriptMirror.SHADOW_REALM)
33+
.build());
2634
}
2735

2836
private ClassInfo<? super T> classInfo;
@@ -38,6 +46,7 @@ public ExprCustomEventValue() {
3846
public boolean init(final Expression<?>[] exprs, final int matchedPattern, final Kleenean isDelayed, final SkriptParser.ParseResult parseResult) {
3947
if (!getParser().isCurrentEvent(BukkitCustomEvent.class, EventTriggerEvent.class))
4048
return false;
49+
4150
EventSyntaxInfo which = CustomEvent.lastWhich;
4251
if (which == null)
4352
return false;

0 commit comments

Comments
 (0)