< Summary

Line coverage
0%
Covered lines: 0
Uncovered lines: 120
Coverable lines: 120
Total lines: 214
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 32
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

https://raw.githubusercontent.com/dotnet/runtime/811a7eabb75c42db53440e8ba3f60c07511cfd1f/src/libraries/System.Reflection.Metadata/src/System/Reflection/Metadata/PortablePdb/SequencePointCollection.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.Collections;
 5using System.Collections.Generic;
 6using System.Diagnostics;
 7using System.Reflection.Internal;
 8using System.Reflection.Metadata.Ecma335;
 9
 10namespace System.Reflection.Metadata
 11{
 12    public readonly struct SequencePointCollection : IEnumerable<SequencePoint>
 13    {
 14        private readonly MemoryBlock _block;
 15        private readonly DocumentHandle _document;
 16
 17        internal SequencePointCollection(MemoryBlock block, DocumentHandle document)
 018        {
 019            _block = block;
 020            _document = document;
 021        }
 22
 23        public Enumerator GetEnumerator()
 024        {
 025            return new Enumerator(_block, _document);
 026        }
 27
 28        IEnumerator IEnumerable.GetEnumerator()
 029        {
 030            return GetEnumerator();
 031        }
 32
 33        IEnumerator<SequencePoint> IEnumerable<SequencePoint>.GetEnumerator()
 034        {
 035            return GetEnumerator();
 036        }
 37
 38        public struct Enumerator : IEnumerator<SequencePoint>
 39        {
 40            private BlobReader _reader;
 41            private SequencePoint _current;
 42            private int _previousNonHiddenStartLine;
 43            private ushort _previousNonHiddenStartColumn;
 44
 45            internal Enumerator(MemoryBlock block, DocumentHandle document)
 046            {
 047                _reader = new BlobReader(block);
 048                _current = new SequencePoint(document, -1);
 049                _previousNonHiddenStartLine = -1;
 050                _previousNonHiddenStartColumn = 0;
 051            }
 52
 53            public bool MoveNext()
 054            {
 055                if (_reader.RemainingBytes == 0)
 056                {
 057                    return false;
 58                }
 59
 060                DocumentHandle document = _current.Document;
 61                int offset, deltaLines, deltaColumns, startLine;
 62                ushort startColumn;
 63
 064                if (_reader.Offset == 0)
 065                {
 66                    // header (skip local signature rid):
 067                    _reader.ReadCompressedInteger();
 68
 069                    if (document.IsNil)
 070                    {
 071                        document = ReadDocumentHandle();
 072                    }
 73                    // IL offset:
 074                    offset = _reader.ReadCompressedInteger();
 075                }
 76                else
 077                {
 78                    // skip all document records and update the current document accordingly:
 79                    int deltaOffset;
 080                    while ((deltaOffset = _reader.ReadCompressedInteger()) == 0)
 081                    {
 082                        document = ReadDocumentHandle();
 083                    }
 84
 85                    // IL offset:
 086                    offset = AddOffsets(_current.Offset, deltaOffset);
 087                }
 88
 089                ReadDeltaLinesAndColumns(out deltaLines, out deltaColumns);
 90
 91                // hidden
 092                if (deltaLines == 0 && deltaColumns == 0)
 093                {
 094                    _current = new SequencePoint(document, offset);
 095                    return true;
 96                }
 97
 98                // delta Start Line & Column:
 099                if (_previousNonHiddenStartLine < 0)
 0100                {
 0101                    Debug.Assert(_previousNonHiddenStartColumn == 0);
 102
 0103                    startLine = ReadLine();
 0104                    startColumn = ReadColumn();
 0105                }
 106                else
 0107                {
 0108                    startLine = AddLines(_previousNonHiddenStartLine, _reader.ReadCompressedSignedInteger());
 0109                    startColumn = AddColumns(_previousNonHiddenStartColumn, _reader.ReadCompressedSignedInteger());
 0110                }
 111
 0112                _previousNonHiddenStartLine = startLine;
 0113                _previousNonHiddenStartColumn = startColumn;
 114
 0115                _current = new SequencePoint(
 0116                    document,
 0117                    offset,
 0118                    startLine,
 0119                    startColumn,
 0120                    AddLines(startLine, deltaLines),
 0121                    AddColumns(startColumn, deltaColumns));
 122
 0123                return true;
 0124            }
 125
 126            private void ReadDeltaLinesAndColumns(out int deltaLines, out int deltaColumns)
 0127            {
 0128                deltaLines = _reader.ReadCompressedInteger();
 0129                deltaColumns = (deltaLines == 0) ? _reader.ReadCompressedInteger() : _reader.ReadCompressedSignedInteger
 0130            }
 131
 132            private int ReadLine()
 0133            {
 0134                return _reader.ReadCompressedInteger();
 0135            }
 136
 137            private ushort ReadColumn()
 0138            {
 0139                int column = _reader.ReadCompressedInteger();
 0140                if (column > ushort.MaxValue)
 0141                {
 0142                    Throw.SequencePointValueOutOfRange();
 0143                }
 144
 0145                return (ushort)column;
 0146            }
 147
 148            private static int AddOffsets(int value, int delta)
 0149            {
 0150                int result = unchecked(value + delta);
 0151                if (result < 0)
 0152                {
 0153                    Throw.SequencePointValueOutOfRange();
 0154                }
 155
 0156                return result;
 0157            }
 158
 159            private static int AddLines(int value, int delta)
 0160            {
 0161                int result = unchecked(value + delta);
 0162                if (result < 0 || result >= SequencePoint.HiddenLine)
 0163                {
 0164                    Throw.SequencePointValueOutOfRange();
 0165                }
 166
 0167                return result;
 0168            }
 169
 170            private static ushort AddColumns(ushort value, int delta)
 0171            {
 0172                int result = unchecked(value + delta);
 0173                if (result < 0 || result >= ushort.MaxValue)
 0174                {
 0175                    Throw.SequencePointValueOutOfRange();
 0176                }
 177
 0178                return (ushort)result;
 0179            }
 180
 181            private DocumentHandle ReadDocumentHandle()
 0182            {
 0183                int rowId = _reader.ReadCompressedInteger();
 0184                if (rowId == 0 || !TokenTypeIds.IsValidRowId(rowId))
 0185                {
 0186                    Throw.InvalidHandle();
 187                }
 188
 0189                return DocumentHandle.FromRowId(rowId);
 0190            }
 191
 192            public SequencePoint Current
 193            {
 0194                get { return _current; }
 195            }
 196
 197            object IEnumerator.Current
 198            {
 0199                get { return _current; }
 200            }
 201
 202            public void Reset()
 0203            {
 0204                _reader.Reset();
 0205                _current = default(SequencePoint);
 0206            }
 207
 208            void IDisposable.Dispose()
 0209            {
 0210            }
 211        }
 212    }
 213}
 214