public Array Get(Type type, IEnumerable <Type>?overrides) { if (type is null) { throw new ArgumentNullException(nameof(type)); } var arrType = type.MakeArrayType(); var arr = Activator.CreateInstance(arrType, new object[] { array.Length }) as Array ?? throw new InvalidOperationException($"Could not create array of type '{type.FormattedName()}'."); for (int i = 0; i < arr.Length; i++) { var argument = array[i]; if (argument.Value != null) { if (DynamicDispatch.IsAssignableFrom(CompilerState, type, overrides, argument, out var transformed)) { arr.SetValue(transformed, i); } else { throw new CompilerException(argument.Source, $"Cannot convert element of type '{argument.Value.GetType().FormattedName()}' to '{type.FormattedName()}' because no appropriate converter was found."); } } } CompilerState.Context.Logger.Debug($"Created array of type {type.FormattedName()}."); return(arr); }
private static CommandExecution CreateDelegate(string command, MethodInfo method, out ParameterInfo[] parameters) { var param = method.GetParameters(); parameters = param; return(InvokeDynamic); // inline method for better debugging object?InvokeDynamic(Element element, CompilerState state, Argument[] args) { var sorted = DynamicDispatch.PadArguments(command, element, state, args, param); DynamicDispatch.MatchArguments(state, sorted, param); return(method.Invoke(null, sorted)); } }
private static CommandExecution CreateDelegate(string command, MethodInfo method, out Parameter[] parameters) { var param = method.GetParameters(); var items = new Parameter[param.Length]; for (int i = 0; i < param.Length; i++) { items[i] = new Parameter(param[i]); } parameters = items; if (items.Length > 0 && items[0].Type == typeof(CompilerState)) { parameters = items.Skip(1).ToArray(); } return(InvokeDynamic); // inline method for better debugging object?InvokeDynamic(SyntaxNode element, CompilerState state, Argument[] args) { var paddedArgs = DynamicDispatch.PadArguments(command, element, state, args, items); var matchedArgs = DynamicDispatch.MatchArguments(state, paddedArgs, items); try { return(method.Invoke(null, matchedArgs)); } catch (TargetInvocationException ex) { if (ex.InnerException is CompilerException compilerException) { throw compilerException; } else if (ex.InnerException != null) { throw new CompilerException(element, ex.InnerException.Message, ex.InnerException); } else { throw new CompilerException(element, ex.Message, ex); } } } }