/// <summary>
        /// Reads <see cref="MethodOverloadListRecord"/> from the stream.
        /// </summary>
        /// <param name="reader">Stream binary reader.</param>
        /// <param name="kind">Type record kind.</param>
        /// <param name="dataLength">Record data length.</param>
        public static MethodOverloadListRecord Read(IBinaryReader reader, TypeLeafKind kind, uint dataLength)
        {
            long endPosition = reader.Position + dataLength;
            List <OneMethodRecord> methods = new List <OneMethodRecord>();

            while (reader.Position < endPosition)
            {
                methods.Add(OneMethodRecord.Read(reader, TypeLeafKind.LF_ONEMETHOD, isFromOverloadedList: true));
            }
            return(new MethodOverloadListRecord
            {
                Kind = kind,
                Methods = methods,
            });
        }
        /// <summary>
        /// Reads <see cref="OneMethodRecord"/> from the stream.
        /// </summary>
        /// <param name="reader">Stream binary reader.</param>
        /// <param name="kind">Type record kind.</param>
        /// <param name="isFromOverloadedList"><c>true</c> if we are reading this from <see cref="MethodOverloadListRecord"/>.</param>
        public static OneMethodRecord Read(IBinaryReader reader, TypeLeafKind kind, bool isFromOverloadedList = false)
        {
            var record = new OneMethodRecord
            {
                Kind       = kind,
                Attributes = MemberAttributes.Read(reader)
            };

            if (isFromOverloadedList)
            {
                reader.Move(2); // 2 = sizeof(ushort)
            }
            record.Type          = TypeIndex.Read(reader);
            record.VFTableOffset = record.Attributes.IsIntroducedVirtual ? reader.ReadInt() : -1;
            if (!isFromOverloadedList)
            {
                record.Name = reader.ReadCString();
            }
            return(record);
        }
        /// <summary>
        /// Reads <see cref="FieldListRecord"/> from the stream.
        /// </summary>
        /// <param name="reader">Stream binary reader.</param>
        /// <param name="kind">Type record kind.</param>
        /// <param name="dataLength">Record data length.</param>
        public static FieldListRecord Read(IBinaryReader reader, TypeLeafKind kind, uint dataLength)
        {
            long positionEnd         = reader.Position + dataLength;
            List <TypeRecord> fields = new List <TypeRecord>();

            while (reader.Position < positionEnd)
            {
                // Read leaf
                TypeRecord   record;
                TypeLeafKind leaf = (TypeLeafKind)reader.ReadUshort();

                switch (leaf)
                {
                case TypeLeafKind.LF_ENUMERATE:
                    record = EnumeratorRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_MEMBER:
                    record = DataMemberRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_NESTTYPE:
                    record = NestedTypeRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_ONEMETHOD:
                    record = OneMethodRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_METHOD:
                    record = OverloadedMethodRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_BCLASS:
                case TypeLeafKind.LF_INTERFACE:
                    record = BaseClassRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_VFUNCTAB:
                    record = VirtualFunctionPointerRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_STMEMBER:
                    record = StaticDataMemberRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_VBCLASS:
                case TypeLeafKind.LF_IVBCLASS:
                    record = VirtualBaseClassRecord.Read(reader, leaf);
                    break;

                case TypeLeafKind.LF_INDEX:
                    record = ListContinuationRecord.Read(reader, leaf);
                    break;

                default:
                    throw new NotImplementedException();
                }
                fields.Add(record);

                // Read padding
                if (reader.Position < positionEnd)
                {
                    byte padding = reader.ReadByte();

                    if (padding > 0xf0)
                    {
                        byte offset = (byte)((padding & 0x0f) - 1);

                        if (offset > 0)
                        {
                            reader.Position += offset;
                        }
                    }
                    else
                    {
                        reader.Position--;
                    }
                }
            }

            return(new FieldListRecord
            {
                Kind = kind,
                Fields = fields,
            });
        }