From 661528f8e0c4117190609afb97448fc09ec31b14 Mon Sep 17 00:00:00 2001 From: 3add <3add.development@gmail.com> Date: Sun, 31 May 2026 17:47:06 +0200 Subject: [PATCH 1/4] add: Script.java record to encapsulate script paths fix: scripts with the same name in different directories colliding fix: memory leak when removing functions in Functions#removeFunctions(Script) deprecated: all methods using the old string-based scriptName system removed: some unused imports --- .../github/syst3ms/skriptparser/Skript.java | 7 +- .../expressions/LitScriptName.java | 3 +- .../syst3ms/skriptparser/lang/TriggerMap.java | 53 ++++++++++--- .../skriptparser/log/SkriptLogger.java | 28 +++++-- .../syst3ms/skriptparser/parsing/Script.java | 20 +++++ .../skriptparser/parsing/ScriptLoader.java | 51 ++++++++++-- .../registration/SkriptAddon.java | 20 ++++- .../structures/functions/EffFunctionCall.java | 2 +- .../functions/ExprFunctionCall.java | 2 +- .../structures/functions/Functions.java | 78 ++++++++++++++----- .../structures/functions/ScriptFunction.java | 12 +-- .../structures/functions/StructFunction.java | 5 +- .../skriptparser/syntax/EffAssert.java | 8 +- .../syst3ms/skriptparser/syntax/SecBirth.java | 4 +- 14 files changed, 227 insertions(+), 66 deletions(-) create mode 100644 src/main/java/io/github/syst3ms/skriptparser/parsing/Script.java diff --git a/src/main/java/io/github/syst3ms/skriptparser/Skript.java b/src/main/java/io/github/syst3ms/skriptparser/Skript.java index f0ed8a2fa..9e7591601 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/Skript.java +++ b/src/main/java/io/github/syst3ms/skriptparser/Skript.java @@ -3,6 +3,7 @@ import io.github.syst3ms.skriptparser.lang.Trigger; import io.github.syst3ms.skriptparser.lang.TriggerMap; import io.github.syst3ms.skriptparser.lang.event.StartOnLoadEvent; +import io.github.syst3ms.skriptparser.parsing.Script; import io.github.syst3ms.skriptparser.registration.SkriptAddon; import io.github.syst3ms.skriptparser.registration.SkriptRegistration; import io.github.syst3ms.skriptparser.structures.functions.StructFunction; @@ -24,12 +25,12 @@ public Skript(String[] mainArgs) { } @Override - public void finishedLoading(@Nullable String scriptName) { + public void finishedLoading(@Nullable Script script) { List triggers; - if (scriptName == null) { + if (script == null) { triggers = TriggerMap.getAllTriggers(); } else { - triggers = TriggerMap.getTriggersByScript(scriptName).values().stream().flatMap(List::stream).toList(); + triggers = TriggerMap.getTriggersByScript(script).values().stream().flatMap(List::stream).toList(); } triggers.stream().sorted(Comparator.comparing(trigger -> trigger.getEvent().getLoadingPriority())).forEach(trigger -> { if (trigger.getEvent() instanceof StartOnLoadEvent event) { diff --git a/src/main/java/io/github/syst3ms/skriptparser/expressions/LitScriptName.java b/src/main/java/io/github/syst3ms/skriptparser/expressions/LitScriptName.java index 3ae31a9ce..bcd5584d0 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/expressions/LitScriptName.java +++ b/src/main/java/io/github/syst3ms/skriptparser/expressions/LitScriptName.java @@ -6,7 +6,6 @@ import io.github.syst3ms.skriptparser.lang.TriggerContext; import io.github.syst3ms.skriptparser.log.SkriptLogger; import io.github.syst3ms.skriptparser.parsing.ParseContext; -import io.github.syst3ms.skriptparser.util.FileUtils; /** * The name of the current executed script, without the extension. @@ -38,7 +37,7 @@ public boolean init(Expression[] expressions, int matchedPattern, ParseContex @Override public String[] getValues() { - return new String[]{FileUtils.removeExtension(logger.getFileName())}; + return new String[]{logger.getScript().scriptName()}; } @Override diff --git a/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java b/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java index e3f6b1bb1..ad764b214 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java +++ b/src/main/java/io/github/syst3ms/skriptparser/lang/TriggerMap.java @@ -1,5 +1,7 @@ package io.github.syst3ms.skriptparser.lang; +import io.github.syst3ms.skriptparser.parsing.Script; +import io.github.syst3ms.skriptparser.parsing.ScriptLoader; import io.github.syst3ms.skriptparser.structures.functions.Functions; import io.github.syst3ms.skriptparser.variables.Variables; @@ -14,40 +16,67 @@ */ public class TriggerMap { - private static final Map, List>> TRIGGERS = new TreeMap<>(); + private static final Map, List>> TRIGGERS = new TreeMap<>(); + + /** + * @deprecated Use {@link #addTrigger(Script, Class, Trigger)} instead. + */ + @Deprecated(forRemoval = true) + public static void addTrigger(String scriptName, Class context, Trigger trigger) { + Script script = ScriptLoader.getScriptByName(scriptName); + if (script != null) addTrigger(script, context, trigger); + } /** * Add a trigger to the map. * - * @param scriptName Name of a script + * @param script The script to add the trigger to * @param context Trigger context class to which the trigger should be added * @param trigger Trigger to add */ - public static void addTrigger(String scriptName, Class context, Trigger trigger) { - TRIGGERS.computeIfAbsent(scriptName, k -> new HashMap<>()).computeIfAbsent(context, k -> new ArrayList<>()).add(trigger); + public static void addTrigger(Script script, Class context, Trigger trigger) { + TRIGGERS.computeIfAbsent(script, k -> new HashMap<>()).computeIfAbsent(context, k -> new ArrayList<>()).add(trigger); + } + + /** + * @deprecated Use {@link #clearTriggers(Script)} instead. + */ + @Deprecated(forRemoval = true) + public static void clearTriggers(String scriptName) { + Script script = ScriptLoader.getScriptByName(scriptName); + if (script != null) clearTriggers(script); } /** * Clear all triggers for a script. * - * @param scriptName Script name to clear triggers for + * @param script Script to clear triggers for */ - public static void clearTriggers(String scriptName) { - TRIGGERS.getOrDefault(scriptName, Map.of()).values().forEach(triggers -> { + public static void clearTriggers(Script script) { + TRIGGERS.getOrDefault(script, Map.of()).values().forEach(triggers -> { triggers.forEach(trigger -> trigger.getEvent().unload()); }); - TRIGGERS.remove(scriptName); - Functions.removeFunctions(scriptName); + TRIGGERS.remove(script); + Functions.removeFunctions(script); + } + + /** + * @deprecated Use {@link #getTriggersByScript(Script)} instead. + */ + @Deprecated(forRemoval = true) + public static Map, List> getTriggersByScript(String scriptName) { + Script script = ScriptLoader.getScriptByName(scriptName); + return script != null ? getTriggersByScript(script) : Map.of(); } /** * Get all the triggers associated with a script. * - * @param scriptName Script name to get triggers for + * @param script Script to get triggers for * @return Map of trigger contexts to triggers */ - public static Map, List> getTriggersByScript(String scriptName) { - return TRIGGERS.getOrDefault(scriptName, Map.of()); + public static Map, List> getTriggersByScript(Script script) { + return TRIGGERS.getOrDefault(script, Map.of()); } /** diff --git a/src/main/java/io/github/syst3ms/skriptparser/log/SkriptLogger.java b/src/main/java/io/github/syst3ms/skriptparser/log/SkriptLogger.java index 5dc51d873..befd80cf2 100644 --- a/src/main/java/io/github/syst3ms/skriptparser/log/SkriptLogger.java +++ b/src/main/java/io/github/syst3ms/skriptparser/log/SkriptLogger.java @@ -2,6 +2,8 @@ import io.github.syst3ms.skriptparser.file.FileElement; import io.github.syst3ms.skriptparser.file.FileSection; +import io.github.syst3ms.skriptparser.parsing.Script; +import io.github.syst3ms.skriptparser.parsing.ScriptLoader; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -56,7 +58,7 @@ public class SkriptLogger { private boolean hasError = false; private final LinkedList errorContext = new LinkedList<>(); // File - private String fileName; + private Script script; private List fileElements; private int line = -1; // Logs @@ -72,13 +74,19 @@ public SkriptLogger() { this(false); } + @Deprecated(forRemoval = true) + public void setFileInfo(String fileName, List fileElements) { + Script script = ScriptLoader.getScriptByName(fileName); + setFileInfo(script, fileElements); + } + /** * Provides the logger information about the file it's currently parsing - * @param fileName the file name + * @param script the {@link Script} this logger is for * @param fileElements the {@link FileElement}s of the current file */ - public void setFileInfo(String fileName, List fileElements) { - this.fileName = fileName; + public void setFileInfo(Script script, List fileElements) { + this.script = script; this.fileElements = flatten(fileElements); } @@ -153,7 +161,7 @@ private void log(String message, LogType type, @Nullable ErrorType error, @Nulla message, line + 1, fileElements.get(line).getLineContent(), - fileName), + script.scriptName()), type, line, ctx, error, tip )); } @@ -298,8 +306,16 @@ public void setDebug(boolean debug) { this.debug = debug; } + /** + * @deprecated use {@link #getScript()} instead. + */ + @Deprecated(forRemoval = true) public String getFileName() { - return fileName; + return script.scriptName(); + } + + public Script getScript() { + return script; } /** diff --git a/src/main/java/io/github/syst3ms/skriptparser/parsing/Script.java b/src/main/java/io/github/syst3ms/skriptparser/parsing/Script.java new file mode 100644 index 000000000..9b600fe5b --- /dev/null +++ b/src/main/java/io/github/syst3ms/skriptparser/parsing/Script.java @@ -0,0 +1,20 @@ +package io.github.syst3ms.skriptparser.parsing; + +import java.nio.file.Path; + +public record Script(Path scriptPath) implements Comparable