Skip to content

Commit

Permalink
Merge branch 'dev/feature' into dev/RidingUpdate
Browse files Browse the repository at this point in the history
  • Loading branch information
TheAbsolutionism authored Jan 29, 2025
2 parents 82ca034 + e1565dc commit 96f7219
Show file tree
Hide file tree
Showing 93 changed files with 3,492 additions and 712 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ org.gradle.parallel=true

groupid=ch.njol
name=skript
version=2.10.0-pre1
version=2.10.0
jarName=Skript.jar
testEnv=java21/paper-1.21.4
testEnvJavaVersion=21
89 changes: 89 additions & 0 deletions src/main/java/ch/njol/skript/ModernSkriptBridge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package ch.njol.skript;

import org.jetbrains.annotations.Unmodifiable;
import org.skriptlang.skript.Skript;
import org.skriptlang.skript.addon.SkriptAddon;
import org.skriptlang.skript.localization.Localizer;
import org.skriptlang.skript.registration.SyntaxRegistry;
import org.skriptlang.skript.util.Registry;

import java.util.Collection;
import java.util.function.Supplier;

/**
* Bridge for interacting with the modern API classes from {@link org.skriptlang.skript}.
*/
final class ModernSkriptBridge {

private ModernSkriptBridge() { }

/**
* Similar to {@link Skript#unmodifiableView()}, but permits addon registration.
*/
public static final class SpecialUnmodifiableSkript implements Skript {

private final Skript skript;
private final Skript unmodifiableSkript;

public SpecialUnmodifiableSkript(Skript skript) {
this.skript = skript;
this.unmodifiableSkript = skript.unmodifiableView();
}

@Override
public SkriptAddon registerAddon(Class<?> source, String name) {
return skript.registerAddon(source, name);
}

@Override
public @Unmodifiable Collection<SkriptAddon> addons() {
return unmodifiableSkript.addons();
}

@Override
public Class<?> source() {
return unmodifiableSkript.source();
}

@Override
public String name() {
return unmodifiableSkript.name();
}

@Override
public <R extends Registry<?>> void storeRegistry(Class<R> registryClass, R registry) {
unmodifiableSkript.storeRegistry(registryClass, registry);
}

@Override
public void removeRegistry(Class<? extends Registry<?>> registryClass) {
unmodifiableSkript.removeRegistry(registryClass);
}

@Override
public boolean hasRegistry(Class<? extends Registry<?>> registryClass) {
return unmodifiableSkript.hasRegistry(registryClass);
}

@Override
public <R extends Registry<?>> R registry(Class<R> registryClass) {
return unmodifiableSkript.registry(registryClass);
}

@Override
public <R extends Registry<?>> R registry(Class<R> registryClass, Supplier<R> putIfAbsent) {
return unmodifiableSkript.registry(registryClass, putIfAbsent);
}

@Override
public SyntaxRegistry syntaxRegistry() {
return unmodifiableSkript.syntaxRegistry();
}

@Override
public Localizer localizer() {
return unmodifiableSkript.localizer();
}
}

}
16 changes: 5 additions & 11 deletions src/main/java/ch/njol/skript/ScriptLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,22 @@
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.Statement;
import ch.njol.skript.lang.TriggerItem;
import ch.njol.skript.lang.TriggerSection;
import ch.njol.skript.lang.function.EffFunctionCall;
import ch.njol.skript.lang.parser.ParserInstance;
import ch.njol.skript.log.*;
import ch.njol.skript.sections.SecLoop;
import ch.njol.skript.log.CountingLogHandler;
import ch.njol.skript.log.LogEntry;
import ch.njol.skript.log.RetainingLogHandler;
import ch.njol.skript.log.SkriptLogger;
import ch.njol.skript.structures.StructOptions.OptionsData;
import ch.njol.skript.test.runner.TestMode;
import ch.njol.skript.util.ExceptionUtils;
import ch.njol.skript.util.SkriptColor;
import ch.njol.skript.util.Task;
import ch.njol.skript.util.Timespan;
import ch.njol.skript.variables.TypeHints;
import ch.njol.util.Kleenean;
import ch.njol.util.NonNullPair;
import ch.njol.util.OpenCloseable;
import ch.njol.util.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.lang.script.Script;
Expand All @@ -41,11 +39,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down
89 changes: 61 additions & 28 deletions src/main/java/ch/njol/skript/Skript.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@
import ch.njol.skript.hooks.Hook;
import ch.njol.skript.lang.*;
import ch.njol.skript.lang.Effect;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.ExpressionInfo;
import ch.njol.skript.lang.ExpressionType;
import ch.njol.skript.lang.Section;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptEventInfo;
import ch.njol.skript.lang.Statement;
import ch.njol.skript.lang.SyntaxElementInfo;
import ch.njol.skript.lang.Trigger;
import ch.njol.skript.lang.TriggerItem;
import ch.njol.skript.lang.Condition.ConditionType;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.skript.localization.Language;
Expand Down Expand Up @@ -85,6 +95,7 @@
import org.skriptlang.skript.registration.SyntaxInfo;
import org.skriptlang.skript.registration.SyntaxOrigin;
import org.skriptlang.skript.registration.SyntaxRegistry;
import org.skriptlang.skript.util.ClassLoader;

import java.io.File;
import java.io.IOException;
Expand Down Expand Up @@ -148,7 +159,7 @@ public final class Skript extends JavaPlugin implements Listener {
@Nullable
private static Skript instance = null;

static org.skriptlang.skript.@UnknownNullability Skript skript = null;
private static org.skriptlang.skript.@UnknownNullability Skript skript = null;
private static org.skriptlang.skript.@UnknownNullability Skript unmodifiableSkript = null;

private static boolean disabled = false;
Expand Down Expand Up @@ -453,7 +464,7 @@ public void onEnable() {

// initialize the modern Skript instance
skript = org.skriptlang.skript.Skript.of(getClass(), getName());
unmodifiableSkript = skript.unmodifiableView();
unmodifiableSkript = new ModernSkriptBridge.SpecialUnmodifiableSkript(skript);
skript.localizer().setSourceDirectories("lang",
getDataFolder().getAbsolutePath() + "lang");
// initialize the old Skript SkriptAddon instance
Expand Down Expand Up @@ -669,10 +680,11 @@ protected void afterErrors() {
debug("Early init done");

if (TestMode.ENABLED) {
if (TestMode.DEV_MODE)
if (TestMode.DEV_MODE) {
runTests(); // Dev mode doesn't need a delay
else
} else {
Bukkit.getWorlds().get(0).getChunkAtAsync(100, 100).thenRun(() -> runTests());
}
}

Skript.metrics = new Metrics(Skript.getInstance(), 722); // 722 is our bStats plugin ID
Expand Down Expand Up @@ -813,9 +825,14 @@ private void runTests() {
TestingLogHandler errorCounter = new TestingLogHandler(Level.SEVERE);
try {
errorCounter.start();
File testDir = TestMode.TEST_DIR.toFile();
assert testDir != null;
ScriptLoader.loadScripts(testDir, errorCounter);

// load example scripts (cleanup after)
ScriptLoader.loadScripts(new File(getScriptsFolder(), "-examples" + File.separator), errorCounter);
// unload these as to not interfere with the tests
ScriptLoader.unloadScripts(ScriptLoader.getLoadedScripts());

// load test directory scripts
ScriptLoader.loadScripts(TestMode.TEST_DIR.toFile(), errorCounter);
} finally {
errorCounter.stop();
}
Expand All @@ -836,14 +853,24 @@ private void runTests() {

info("Running sync JUnit tests...");
try {
List<Class<?>> classes = Lists.newArrayList(Utils.getClasses(Skript.getInstance(), "org.skriptlang.skript.test", "tests"));
// Don't attempt to run inner/anonymous classes as tests
classes.removeIf(Class::isAnonymousClass);
classes.removeIf(Class::isLocalClass);
// Test that requires package access. This is only present when compiling with src/test.
classes.add(Class.forName("ch.njol.skript.variables.FlatFileStorageTest"));
classes.add(Class.forName("ch.njol.skript.config.ConfigTest"));
classes.add(Class.forName("ch.njol.skript.config.NodeTest"));
// Search for all test classes
Set<Class<?>> classes = new HashSet<>();
ClassLoader.builder()
.addSubPackages("org.skriptlang.skript", "ch.njol.skript")
.filter(fqn -> fqn.endsWith("Test"))
.initialize(true)
.deep(true)
.forEachClass(clazz -> {
if (clazz.isAnonymousClass() || clazz.isLocalClass())
return;
classes.add(clazz);
})
.build()
.loadClasses(Skript.class, getFile());
// remove some known non-tests that get picked up
classes.remove(SkriptJUnitTest.class);
classes.remove(SkriptAsyncJUnitTest.class);

size.set(classes.size());
for (Class<?> clazz : classes) {
if (SkriptAsyncJUnitTest.class.isAssignableFrom(clazz)) {
Expand All @@ -853,11 +880,6 @@ private void runTests() {

runTest(clazz, shutdownDelay, tests, milliseconds, ignored, fails);
}
} catch (IOException e) {
Skript.exception(e, "Failed to execute JUnit runtime tests.");
} catch (ClassNotFoundException e) {
// Should be the Skript test jar gradle task.
assert false : "Class 'ch.njol.skript.variables.FlatFileStorageTest' was not found.";
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException |
InvocationTargetException | NoSuchMethodException | SecurityException e) {
Skript.exception(e, "Failed to initalize test JUnit classes.");
Expand Down Expand Up @@ -1437,7 +1459,18 @@ public String name() {

}

private static SyntaxOrigin getSyntaxOrigin(JavaPlugin plugin) {
/**
* Attempts to create a SyntaxOrigin from a provided class.
*/
@ApiStatus.Internal
@ApiStatus.Experimental
public static SyntaxOrigin getSyntaxOrigin(Class<?> source) {
JavaPlugin plugin;
try {
plugin = JavaPlugin.getProvidingPlugin(source);
} catch (IllegalArgumentException e) { // Occurs when the method fails to determine the providing plugin
return () -> source.getName();
}
SkriptAddon addon = getAddon(plugin);
if (addon != null) {
return SyntaxOrigin.of(addon);
Expand Down Expand Up @@ -1466,7 +1499,7 @@ public static <E extends Condition> void registerCondition(Class<E> conditionCla
checkAcceptRegistrations();
skript.syntaxRegistry().register(SyntaxRegistry.CONDITION, SyntaxInfo.builder(conditionClass)
.priority(type.priority())
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(conditionClass)))
.origin(getSyntaxOrigin(conditionClass))
.addPatterns(patterns)
.build()
);
Expand All @@ -1481,7 +1514,7 @@ public static <E extends Condition> void registerCondition(Class<E> conditionCla
public static <E extends Effect> void registerEffect(Class<E> effectClass, String... patterns) throws IllegalArgumentException {
checkAcceptRegistrations();
skript.syntaxRegistry().register(SyntaxRegistry.EFFECT, SyntaxInfo.builder(effectClass)
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(effectClass)))
.origin(getSyntaxOrigin(effectClass))
.addPatterns(patterns)
.build()
);
Expand All @@ -1497,7 +1530,7 @@ public static <E extends Effect> void registerEffect(Class<E> effectClass, Strin
public static <E extends Section> void registerSection(Class<E> sectionClass, String... patterns) throws IllegalArgumentException {
checkAcceptRegistrations();
skript.syntaxRegistry().register(SyntaxRegistry.SECTION, SyntaxInfo.builder(sectionClass)
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(sectionClass)))
.origin(getSyntaxOrigin(sectionClass))
.addPatterns(patterns)
.build()
);
Expand Down Expand Up @@ -1548,7 +1581,7 @@ public static <E extends Expression<T>, T> void registerExpression(
checkAcceptRegistrations();
skript.syntaxRegistry().register(SyntaxRegistry.EXPRESSION, SyntaxInfo.Expression.builder(expressionType, returnType)
.priority(type.priority())
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(expressionType)))
.origin(getSyntaxOrigin(expressionType))
.addPatterns(patterns)
.build()
);
Expand Down Expand Up @@ -1615,7 +1648,7 @@ public static <E extends SkriptEvent> SkriptEventInfo<E> registerEvent(
public static <E extends Structure> void registerStructure(Class<E> structureClass, String... patterns) {
checkAcceptRegistrations();
skript.syntaxRegistry().register(SyntaxRegistry.STRUCTURE, SyntaxInfo.Structure.builder(structureClass)
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(structureClass)))
.origin(getSyntaxOrigin(structureClass))
.addPatterns(patterns)
.build()
);
Expand All @@ -1624,7 +1657,7 @@ public static <E extends Structure> void registerStructure(Class<E> structureCla
public static <E extends Structure> void registerSimpleStructure(Class<E> structureClass, String... patterns) {
checkAcceptRegistrations();
skript.syntaxRegistry().register(SyntaxRegistry.STRUCTURE, SyntaxInfo.Structure.builder(structureClass)
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(structureClass)))
.origin(getSyntaxOrigin(structureClass))
.addPatterns(patterns)
.nodeType(SyntaxInfo.Structure.NodeType.SIMPLE)
.build()
Expand All @@ -1636,7 +1669,7 @@ public static <E extends Structure> void registerStructure(
) {
checkAcceptRegistrations();
skript.syntaxRegistry().register(SyntaxRegistry.STRUCTURE, SyntaxInfo.Structure.builder(structureClass)
.origin(getSyntaxOrigin(JavaPlugin.getProvidingPlugin(structureClass)))
.origin(getSyntaxOrigin(structureClass))
.addPatterns(patterns)
.entryValidator(entryValidator)
.build()
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/ch/njol/skript/SkriptAddon.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public final class SkriptAddon implements org.skriptlang.skript.addon.SkriptAddo
* Package-private constructor. Use {@link Skript#registerAddon(JavaPlugin)} to get a SkriptAddon for your plugin.
*/
SkriptAddon(JavaPlugin plugin) {
this(plugin, Skript.skript.registerAddon(plugin.getClass(), plugin.getName()));
this(plugin, Skript.instance().registerAddon(plugin.getClass(), plugin.getName()));
}

SkriptAddon(JavaPlugin plugin, org.skriptlang.skript.addon.SkriptAddon addon) {
Expand Down
Loading

0 comments on commit 96f7219

Please sign in to comment.