diff --git a/src/main/java/ch/njol/skript/lang/function/Function.java b/src/main/java/ch/njol/skript/lang/function/Function.java index 37301f2b03f..0d6c96ab4af 100644 --- a/src/main/java/ch/njol/skript/lang/function/Function.java +++ b/src/main/java/ch/njol/skript/lang/function/Function.java @@ -90,7 +90,19 @@ public boolean isSingle() { for (int i = 0; i < parameters.length; i++) { Parameter parameter = parameters[i]; Object[] parameterValue = parameter.keyed ? convertToKeyed(parameterValues[i]) : parameterValues[i]; - if (parameterValue == null) { // Go for default value + + // see https://github.com/SkriptLang/Skript/pull/8135 + if ((parameterValues[i] == null || parameterValues[i].length == 0) + && parameter.keyed + && parameter.def != null + ) { + Object[] defaultValue = parameter.def.getArray(event); + if (defaultValue.length == 1) { + parameterValue = KeyedValue.zip(defaultValue, null); + } else { + parameterValue = defaultValue; + } + } else if (parameterValue == null) { // Go for default value assert parameter.def != null; // Should've been parse error Object[] defaultValue = parameter.def.getArray(event); if (parameter.keyed && KeyProviderExpression.areKeysRecommended(parameter.def)) { diff --git a/src/main/java/ch/njol/skript/lang/function/Functions.java b/src/main/java/ch/njol/skript/lang/function/Functions.java index 637f61b005d..624a6f0e878 100644 --- a/src/main/java/ch/njol/skript/lang/function/Functions.java +++ b/src/main/java/ch/njol/skript/lang/function/Functions.java @@ -98,7 +98,17 @@ public static JavaFunction registerFunction(JavaFunction function) { Skript.debug((signature.local ? "local " : "") + "function " + name + "(" + StringUtils.join(params, ", ") + ")" + (c != null ? " :: " + (signature.isSingle() ? c.getName().getSingular() : c.getName().getPlural()) : "") + ":"); - Function function = new ScriptFunction<>(signature, node); + Function function; + try { + function = new ScriptFunction<>(signature, node); + } catch (SkriptAPIException ex) { + //noinspection ThrowableNotThrown + Skript.exception(ex, "Error while trying to load a function"); + + // avoid getting a "function is already registered" error when the function implementation is not known yet + Functions.unregisterFunction(signature); + return null; + } if (namespace.getFunction(signature.name) == null) { namespace.addFunction(function); diff --git a/src/test/skript/tests/syntaxes/structures/StructFunction.sk b/src/test/skript/tests/syntaxes/structures/StructFunction.sk index b2231ac9d28..1fa8f21a682 100644 --- a/src/test/skript/tests/syntaxes/structures/StructFunction.sk +++ b/src/test/skript/tests/syntaxes/structures/StructFunction.sk @@ -47,6 +47,12 @@ test "function structure type hints": type_hint_argument_test({_number}) assert the first element of the last parse logs is set # contains "The function 'type_hint_argument_test(boolean)' does not exist." (NEEDS FIXING) +local function list_argument_single_default(x: texts="hey") :: texts: + return {_x::*} + +test "function list argument with a single default": + assert list_argument_single_default() = "hey" + local function literal_test(x: entity type): stop local function literal_test_projectile(x: entity):