@@ -19,20 +19,24 @@ final class DefaultFunctionImpl<T> extends ch.njol.skript.lang.function.Function
1919 private final SkriptAddon source ;
2020 private final SequencedMap <String , Parameter <?>> parameters ;
2121 private final Function <FunctionArguments , T > execute ;
22+ private final Function <FunctionArguments , SequencedCollection <String >> keys ;
2223
2324 private final List <String > description ;
2425 private final List <String > since ;
2526 private final List <String > examples ;
2627 private final List <String > keywords ;
2728 private final List <String > requires ;
2829
30+ private SequencedCollection <String > returnedKeys ;
31+
2932 DefaultFunctionImpl (
3033 SkriptAddon source ,
3134 String name ,
3235 SequencedMap <String , Parameter <?>> parameters ,
3336 Class <T > returnType , boolean single ,
3437 @ Nullable ch .njol .skript .util .Contract contract ,
3538 Function <FunctionArguments , T > execute ,
39+ Function <FunctionArguments , SequencedCollection <String >> keys ,
3640 String [] description , String [] since , String [] examples ,
3741 String [] keywords , String [] requires
3842 ) {
@@ -47,6 +51,7 @@ final class DefaultFunctionImpl<T> extends ch.njol.skript.lang.function.Function
4751 this .source = source ;
4852 this .parameters = parameters ;
4953 this .execute = execute ;
54+ this .keys = keys ;
5055 this .description = description != null ? List .of (description ) : Collections .emptyList ();
5156 this .since = since != null ? List .of (since ) : Collections .emptyList ();
5257 this .examples = examples != null ? List .of (examples ) : Collections .emptyList ();
@@ -100,6 +105,7 @@ final class DefaultFunctionImpl<T> extends ch.njol.skript.lang.function.Function
100105 }
101106
102107 FunctionArgumentsImpl arguments = new FunctionArgumentsImpl (args );
108+ returnedKeys = keys .apply (arguments );
103109 T result = execute .apply (arguments );
104110
105111 if (result == null ) {
@@ -133,6 +139,7 @@ public T execute(@NotNull FunctionEvent<?> event, @NotNull FunctionArguments arg
133139 }
134140 }
135141
142+ returnedKeys = keys .apply (arguments );
136143 return execute .apply (arguments );
137144 }
138145
@@ -141,6 +148,16 @@ public boolean resetReturnValue() {
141148 return true ;
142149 }
143150
151+ @ Override
152+ public @ NotNull String @ Nullable [] returnedKeys () {
153+ return returnedKeys .toArray (new String [0 ]);
154+ }
155+
156+ @ Override
157+ public @ NotNull SequencedCollection <String > getReturnedKeys () {
158+ return returnedKeys ;
159+ }
160+
144161 @ Override
145162 public @ NotNull String name () {
146163 return getName ();
@@ -273,7 +290,19 @@ public DefaultFunction<T> build(@NotNull Function<FunctionArguments, T> execute)
273290 Preconditions .checkNotNull (execute , "execute cannot be null" );
274291
275292 return new DefaultFunctionImpl <>(source , name , parameters ,
276- returnType , !returnType .isArray (), contract , execute ,
293+ returnType , !returnType .isArray (), contract , execute , (_ ) -> Collections .emptyList (),
294+ description , since , examples , keywords , requires );
295+ }
296+
297+ @ Override
298+ public DefaultFunction <T > buildKeyed (@ NotNull Function <FunctionArguments , SequencedCollection <String >> keys ,
299+ @ NotNull Function <FunctionArguments , T > execute ) {
300+ Preconditions .checkNotNull (execute , "execute cannot be null" );
301+ Preconditions .checkArgument (parameters .values ().stream ().anyMatch (it -> it .hasModifier (Modifier .KEYED )),
302+ "buildKeyed cannot be called without any keyed arguments" );
303+
304+ return new DefaultFunctionImpl <>(source , name , parameters ,
305+ returnType , !returnType .isArray (), contract , execute , keys ,
277306 description , since , examples , keywords , requires );
278307 }
279308
@@ -293,10 +322,10 @@ private static void checkNotNull(@NotNull String[] strings, @NotNull String mess
293322 /**
294323 * A parameter for a {@link DefaultFunction}.
295324 *
296- * @param name The name.
297- * @param type The type's class.
325+ * @param name The name.
326+ * @param type The type's class.
298327 * @param modifiers The modifiers.
299- * @param <T> The type.
328+ * @param <T> The type.
300329 */
301330 record DefaultParameter <T >(String name , Class <T > type , Set <Modifier > modifiers )
302331 implements Parameter <T > {
0 commit comments