示例#1
0
        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);
        }
示例#2
0
        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));
            }
        }
示例#3
0
        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);
                    }
                }
            }
        }