diff --git a/WeaverGenerator/src/org/lara/interpreter/weaver/generator/generator/java/utils/GeneratorUtils.java b/WeaverGenerator/src/org/lara/interpreter/weaver/generator/generator/java/utils/GeneratorUtils.java index f59bd0b1c..934ccef63 100644 --- a/WeaverGenerator/src/org/lara/interpreter/weaver/generator/generator/java/utils/GeneratorUtils.java +++ b/WeaverGenerator/src/org/lara/interpreter/weaver/generator/generator/java/utils/GeneratorUtils.java @@ -648,6 +648,31 @@ private static JavaType getJavaType(String type, String paramName, Action action return jType; } + /** + * Processes the arguments. Processing includes: + * + *

+ * - Arrays are converted to arrays of Objects, for compatibility with the JavaScript layer. + *

+ * + * @param arguments + * @return + */ + public static List convertParamArrayToObjArray(List arguments) { + var newArgs = new ArrayList(arguments.size()); + + for (var arg : arguments) { + if (arg.getClassType().isArray()) { + arg = arg.clone(); + arg.getClassType().setName("Object"); + } + + newArgs.add(arg); + } + + return newArgs; + } + /** * Convert an action method to actionImpl,which will be the one the user should implement, and generate the action * implementation that invokes this new actionImpl @@ -726,6 +751,8 @@ public static Method generateActionImplMethod(Method original, Action action, argStr = "NamedEnum.fromString(" + arg.getClassType().getName() + ".class, " + arg.getName() + ", \"parameter " + arg.getName() + "\")"; arg.setClassType(stringType); + } else if (arg.getClassType().isArray()) { + argStr = "pt.up.fe.specs.util.SpecsCollections.cast(" + arg.getName() + ", " + arg.getClassType().getName() + ".class)"; } else { argStr = arg.getName(); } @@ -765,6 +792,12 @@ public static Method generateActionImplMethod(Method original, Action action, cloned.appendCodeln("(" + GenConstants.getClassName() + "(), \"" + actionName + "\", e);"); cloned.appendCodeln("}"); targetClass.addImport(ActionException.class); + + // Adapts parameters after processing and code generation is done, to improve compatibility with + // calls from JavaScript + cloned.setArguments(convertParamArrayToObjArray(cloned.getParams())); + + return cloned; }