internal static bool TryGetListInitializers(SyntaxTreeNode listNode, BindingContext bindingContext, out ElementInit[] initializers, out Exception bindingError) { if (listNode == null) { throw new ArgumentNullException("listNode"); } if (bindingContext == null) { throw new ArgumentNullException("bindingContext"); } bindingError = null; var initializerNodes = listNode.GetInitializers(throwOnError: true); initializers = new ElementInit[initializerNodes.Count]; for (var i = 0; i < initializers.Length; i++) { var index = Constants.GetIndexAsString(i); var initializerObj = default(object); if (initializerNodes.TryGetValue(index, out initializerObj) == false || initializerObj is SyntaxTreeNode == false) { return(false); // failed to get initializer #i } var initializerNode = (SyntaxTreeNode)initializerObj; var addMethodName = initializerNode.GetMethodName(throwOnError: true); var addMethod = default(MemberDescription); if (bindingContext.TryResolveMember(addMethodName, out addMethod) == false || addMethod.IsMethod == false) { return(false); // failed to resolve 'Add' method } var argumentNodes = initializerNode.GetArguments(throwOnError: true); var arguments = new Expression[argumentNodes.Count]; for (var p = 0; p < arguments.Length; p++) { var parameter = addMethod.GetParameter(p); var parameterType = TypeDescription.GetTypeDescription(parameter.ParameterType); var argumentNode = default(SyntaxTreeNode); if (argumentNodes.TryGetValue(p, out argumentNode) == false && argumentNodes.TryGetValue(parameter.Name, out argumentNode) == false) { return(false); // failed to find argument #p } if (AnyBinder.TryBindInNewScope(argumentNode, bindingContext, parameterType, out arguments[p], out bindingError) == false) { return(false); // failed to bind argument #p } } initializers[i] = Expression.ElementInit(addMethod, arguments); } return(true); }