Ejemplo n.º 1
0
        private OMCLItem DoParseArray(List <string> tags)
        {
            OMCLArray resultArray = new OMCLArray();

            if (!Expect(TokenType.OpenBracket))
            {
                ReportError("Failed to parse array. Expected '['");
            }

            SkipNewlines();

            var next = PeekToken();

            while (true)
            {
                if (next.Type == TokenType.EOF)
                {
                    ReportError("Unexpected end of file in array");
                    return(null);
                }

                if (next.Type == TokenType.ClosingBracket)
                {
                    break;
                }

                var item = ParseItem();
                resultArray.Add(item);

                bool nl = SkipNewlines();
                next = PeekToken();
                if (next.Type == TokenType.ClosingBracket)
                {
                    break;
                }
                else if (next.Type == TokenType.Comma)
                {
                    NextToken();
                    SkipNewlines();
                    next = PeekToken();
                }
                else if (!nl)
                {
                    ReportError("Failed to parse array. Expected '\\n' or ',' after value in array");
                    return(null);
                }
            }

            if (!Expect(TokenType.ClosingBracket))
            {
                ReportError("Failed to parse array. Expected ']'");
                return(null);
            }

            OMCLItem result = resultArray;

            result.Tags = tags;
            return(result);
        }
Ejemplo n.º 2
0
        private object ConvertArray(Type type, List <string> tags, OMCLArray array)
        {
            // handle custom converters
            if (_arrayConverters.ContainsKey(type))
            {
                var conv       = _arrayConverters[type];
                var collection = conv.CreateInstance();
                foreach (var item in array)
                {
                    var value = ConvertItemToValue(conv.ElementType, item);
                    conv.AddValue(collection, value);
                }
                return(collection);
            }

            // arrays
            if (type.IsArray)
            {
                var elemType = type.GetElementType();
                var arr      = Array.CreateInstance(elemType, array.Length);

                for (int i = 0; i < arr.Length; i++)
                {
                    var item  = array[i];
                    var value = ConvertItemToValue(elemType, item);
                    arr.SetValue(value, i);
                }

                return(arr);
            }

            // collections
            var iCollection = type.GetInterfaces().Where(t => t.Name.StartsWith(nameof(ICollection) + "`") && t.GenericTypeArguments.Length == 1).FirstOrDefault();

            if (iCollection != null)
            {
                var elemType  = iCollection.GenericTypeArguments[0];
                var col       = Activator.CreateInstance(type);
                var addMethod = col.GetType().GetMethod("Add", new Type[] { elemType });

                foreach (var item in array)
                {
                    var value = ConvertItemToValue(elemType, item);
                    addMethod.Invoke(col, new object[] { value });
                }

                return(col);
            }

            throw new Exception($"Failed to deserialize array into type '{type.FullName}'. Please provide a custom converter if you want this type to be deserializable.");
        }
Ejemplo n.º 3
0
        public void Write(OMCLArray obj)
        {
            _writer.Write("[");
            if (obj.Empty)
            {
                _writer.WriteLine("]");
                return;
            }

            _writer.WriteLine();

            foreach (var val in obj)
            {
                Indent(1);
                WriteValue(val);
            }

            Indent();
            _writer.WriteLine("]");
        }
Ejemplo n.º 4
0
 public OMCLItem(OMCLArray item)
 {
     _value = item;
     Type   = OMCLItemType.Array;
 }
Ejemplo n.º 5
0
 public void Add(OMCLArray item)
 {
     Add(new OMCLItem(item));
 }