< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 60
Coverable lines: 60
Total lines: 143
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 12
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%110%
DecodeFieldSignature(...)100%110%
DecodeMethodSignature(...)100%110%
GetKind()0%440%
GetCustomAttributes()100%110%
GetProjectedParent()100%110%
GetProjectedName()0%220%
GetProjectedSignature()100%110%

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/TypeSystem/MemberReference.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Reflection.Metadata.Ecma335;
 5
 6namespace System.Reflection.Metadata
 7{
 8    public readonly struct MemberReference
 9    {
 10        private readonly MetadataReader _reader;
 11
 12        // Workaround: JIT doesn't generate good code for nested structures, so use RowId.
 13        private readonly uint _treatmentAndRowId;
 14
 15        internal MemberReference(MetadataReader reader, uint treatmentAndRowId)
 016        {
 017            _reader = reader;
 018            _treatmentAndRowId = treatmentAndRowId;
 019        }
 20
 21        private int RowId
 22        {
 023            get { return (int)(_treatmentAndRowId & TokenTypeIds.RIDMask); }
 24        }
 25
 26        private MemberRefTreatment Treatment
 27        {
 028            get { return (MemberRefTreatment)(_treatmentAndRowId >> TokenTypeIds.RowIdBitCount); }
 29        }
 30
 31        private MemberReferenceHandle Handle
 32        {
 033            get { return MemberReferenceHandle.FromRowId(RowId); }
 34        }
 35
 36        /// <summary>
 37        /// MethodDef, ModuleRef,TypeDef, TypeRef, or TypeSpec handle.
 38        /// </summary>
 39        public EntityHandle Parent
 40        {
 41            get
 042            {
 043                if (Treatment == 0)
 044                {
 045                    return _reader.MemberRefTable.GetClass(Handle);
 46                }
 47
 048                return GetProjectedParent();
 049            }
 50        }
 51
 52        public StringHandle Name
 53        {
 54            get
 055            {
 056                if (Treatment == 0)
 057                {
 058                    return _reader.MemberRefTable.GetName(Handle);
 59                }
 60
 061                return GetProjectedName();
 062            }
 63        }
 64
 65        /// <summary>
 66        /// Gets a handle to the signature blob.
 67        /// </summary>
 68        public BlobHandle Signature
 69        {
 70            get
 071            {
 072                if (Treatment == 0)
 073                {
 074                    return _reader.MemberRefTable.GetSignature(Handle);
 75                }
 76
 077                return GetProjectedSignature();
 078            }
 79        }
 80
 81        public TType DecodeFieldSignature<TType, TGenericContext>(ISignatureTypeProvider<TType, TGenericContext> provide
 082        {
 083            var decoder = new SignatureDecoder<TType, TGenericContext>(provider, _reader, genericContext);
 084            var blobReader = _reader.GetBlobReader(Signature);
 085            return decoder.DecodeFieldSignature(ref blobReader);
 086        }
 87
 88        public MethodSignature<TType> DecodeMethodSignature<TType, TGenericContext>(ISignatureTypeProvider<TType, TGener
 089        {
 090            var decoder = new SignatureDecoder<TType, TGenericContext>(provider, _reader, genericContext);
 091            var blobReader = _reader.GetBlobReader(Signature);
 092            return decoder.DecodeMethodSignature(ref blobReader);
 093        }
 94
 95        /// <summary>
 96        /// Determines if the member reference is to a method or field.
 97        /// </summary>
 98        /// <exception cref="BadImageFormatException">The member reference signature is invalid.</exception>
 99        public MemberReferenceKind GetKind()
 0100        {
 0101            BlobReader blobReader = _reader.GetBlobReader(this.Signature);
 0102            SignatureHeader header = blobReader.ReadSignatureHeader();
 103
 0104            return header.Kind switch
 0105            {
 0106                SignatureKind.Method => MemberReferenceKind.Method,
 0107                SignatureKind.Field => MemberReferenceKind.Field,
 0108                _ => throw new BadImageFormatException(),
 0109            };
 0110        }
 111
 112        public CustomAttributeHandleCollection GetCustomAttributes()
 0113        {
 0114            return new CustomAttributeHandleCollection(_reader, Handle);
 0115        }
 116
 117#region Projections
 118
 119        private EntityHandle GetProjectedParent()
 0120        {
 121            // no change
 0122            return _reader.MemberRefTable.GetClass(Handle);
 0123        }
 124
 125        private StringHandle GetProjectedName()
 0126        {
 0127            if (Treatment == MemberRefTreatment.Dispose)
 0128            {
 0129                return StringHandle.FromVirtualIndex(StringHandle.VirtualIndex.Dispose);
 130            }
 131
 0132            return _reader.MemberRefTable.GetName(Handle);
 0133        }
 134
 135        private BlobHandle GetProjectedSignature()
 0136        {
 137            // no change
 0138            return _reader.MemberRefTable.GetSignature(Handle);
 0139        }
 140#endregion
 141    }
 142}
 143