/// <summary>
        /// Deserializes a call expression where the target is an array expression.
        ///
        /// System.Array[String](["a", "b"])
        /// </summary>
        object DeserializeCreateArrayExpression(CallExpression callExpression, IndexExpression target)
        {
            ListExpression list      = callExpression.Args[0].Expression as ListExpression;
            Type           arrayType = GetType(target.Index as MemberExpression);
            Array          array     = Array.CreateInstance(arrayType, list.Items.Count);

            for (int i = 0; i < list.Items.Count; ++i)
            {
                Expression         listItemExpression     = list.Items[i];
                ConstantExpression constantExpression     = listItemExpression as ConstantExpression;
                MemberExpression   memberExpression       = listItemExpression as MemberExpression;
                NameExpression     nameExpression         = listItemExpression as NameExpression;
                CallExpression     listItemCallExpression = listItemExpression as CallExpression;
                if (constantExpression != null)
                {
                    array.SetValue(constantExpression.Value, i);
                }
                else if (memberExpression != null)
                {
                    string name = PythonControlFieldExpression.GetVariableName(memberExpression.Name);
                    array.SetValue(componentCreator.GetComponent(name), i);
                }
                else if (nameExpression != null)
                {
                    array.SetValue(componentCreator.GetInstance(nameExpression.Name), i);
                }
                else if (listItemCallExpression != null)
                {
                    Type   arrayInstanceType = GetType(listItemCallExpression.Target as MemberExpression);
                    object instance          = componentCreator.CreateInstance(arrayInstanceType, GetArguments(listItemCallExpression), null, false);
                    array.SetValue(instance, i);
                }
            }
            return(array);
        }
        object CreateInstance(string name, MethodCall methodCall)
        {
            RubyControlFieldExpression field = RubyControlFieldExpression.Create(methodCall);
            Type type = GetType(field);

            if (type != null)
            {
                if (type.IsEnum)
                {
                    return(Enum.Parse(type, methodCall.MethodName));
                }

                BindingFlags propertyBindingFlags = BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static | BindingFlags.Instance;
                PropertyInfo propertyInfo         = type.GetProperty(methodCall.MethodName, propertyBindingFlags);
                if (propertyInfo != null)
                {
                    return(propertyInfo.GetValue(type, null));
                }

                if (type.IsAssignableFrom(typeof(ComponentResourceManager)))
                {
                    return(componentCreator.CreateInstance(type, new object[0], name, false));
                }

                if (methodCall.Arguments != null)
                {
                    return(CreateInstance(type, name, methodCall));
                }
            }
            else
            {
                return(componentCreator.GetInstance(field.MethodName));
            }
            return(null);
        }
        /// <summary>
        /// Creates a new instance with the specified name.
        /// </summary>
        object CreateInstance(string name, CallExpression node)
        {
            MemberExpression memberExpression = node.Target as MemberExpression;

            if (memberExpression != null)
            {
                string typeName = PythonControlFieldExpression.GetMemberName(memberExpression);
                Type   type     = componentCreator.GetType(typeName);
                if (type != null)
                {
                    if (type.IsAssignableFrom(typeof(ComponentResourceManager)))
                    {
                        return(componentCreator.CreateInstance(type, new object[0], name, false));
                    }
                    List <object> args = deserializer.GetArguments(node);
                    return(componentCreator.CreateInstance(type, args, name, false));
                }
            }
            return(null);
        }