Exemplo n.º 1
0
        //TODO: Добавление уровня - неправильный путь борьбы с рекурсивными типами, но пока ...
        //TODO: А еще я похоже "напортачил" с вариантом (растущих) последовательностей ...
        public object ToPObject(int level)
        {
            if (level < 0)
            {
                return(null);
            }
            switch (this.vid)
            {
            case PTypeEnumeration.fstring:
            {
                return(new object[] { PType.ToInt(this.vid), ((PTypeFString)this).Size });
            }

            case PTypeEnumeration.record:
            {
                PTypeRecord ptr   = (PTypeRecord)this;
                var         query = ptr.Fields.Select(pair => new object[] { pair.Name, pair.Type.ToPObject(level - 1) }).ToArray();
                return(new object[] { PType.ToInt(this.vid), query });
            }

            case PTypeEnumeration.sequence:
            {
                PTypeSequence pts = (PTypeSequence)this;
                return(new object[] { PType.ToInt(this.vid),
                                      new object[] {
                                          new object[] { "growing", new object[] { PType.ToInt(PTypeEnumeration.boolean), null } },
                                          new object[] { "Type", pts.ElementType.ToPObject(level - 1) }
                                      } });
            }

            case PTypeEnumeration.union:
            {
                PTypeUnion ptu   = (PTypeUnion)this;
                var        query = ptu.Variants.Select(pair => new object[] { pair.Name, pair.Type.ToPObject(level - 1) }).ToArray();
                return(new object[] { PType.ToInt(this.vid), query });
            }

            default: return(new object[] { PType.ToInt(this.vid), null });
            }
        }