コード例 #1
0
        public void AddAtomic(DcAtomicField field)
        {
            // Copy our keywords from our first field
            if (_fields.Count == 0)
            {
                KeywordList = new DcKeywordList(field.KeywordList);
            }

            _fields.Add(field);
            NumNestedFields = _fields.Count;

            if (HasFixedByteSize)
            {
                HasFixedByteSize = field.HasFixedByteSize;
                FixedByteSize   += field.FixedByteSize;
            }

            if (HasFixedStructure)
            {
                HasFixedStructure = field.HasFixedStructure;
            }

            if (!HasRangeLimits)
            {
                HasRangeLimits = field.HasRangeLimits;
            }

            if (!HasDefaultValue)
            {
                HasDefaultValue = field.HasDefaultValue;
            }

            DefaultValueStale = true;
        }
コード例 #2
0
        public override void EnterAtomic_field(DcParser.Atomic_fieldContext context)
        {
            var field = new DcAtomicField(context.name.Text, _currentClass, false);

            // Read keywords
            ReadKeywordsIntoList(context.keywords, field.KeywordList);

            var hasDefaultValue = false;

            // Read each parameter
            var parameters = context.parameters;

            while (parameters != null)
            {
                var parameter = BuildDcParameterFromContext(parameters.p);
                hasDefaultValue = parameter.HasDefaultValue;
                field.AddElement(parameter);
                parameters = parameters.next;
            }

            if (hasDefaultValue)
            {
                var bw = new SpanBufferWriter(stackalloc byte[512]);
                foreach (var element in field.Elements)
                {
                    bw.WriteBytes(element.DefaultValue.Span);
                }
                field.DefaultValue    = bw.Data.ToArray();
                field.HasDefaultValue = true;
            }

            if (!_currentClass.AddField(field))
            {
                throw new Exception($"Failed to add field {context.name.Text} to class {_currentClass.Name}");
            }
        }