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; }
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}"); } }