public ImmutableArray <DynamicAnalysisSpan> GetSpans(BlobHandle handle)
        {
            if (handle.IsNil)
            {
                return(ImmutableArray <DynamicAnalysisSpan> .Empty);
            }

            var builder = ArrayBuilder <DynamicAnalysisSpan> .GetInstance();

            var reader = GetBlobReader(handle);

            // header:
            int    documentRowId       = ReadDocumentRowId(ref reader);
            int    previousStartLine   = -1;
            ushort previousStartColumn = 0;

            // records:
            while (reader.RemainingBytes > 0)
            {
                int deltaLines, deltaColumns;
                ReadDeltaLinesAndColumns(ref reader, out deltaLines, out deltaColumns);

                // document:
                if (deltaLines == 0 && deltaColumns == 0)
                {
                    documentRowId = ReadDocumentRowId(ref reader);
                    continue;
                }

                int    startLine;
                ushort startColumn;

                // delta Start Line & Column:
                if (previousStartLine < 0)
                {
                    Debug.Assert(previousStartColumn == 0);

                    startLine   = ReadLine(ref reader);
                    startColumn = ReadColumn(ref reader);
                }
                else
                {
                    startLine   = AddLines(previousStartLine, reader.ReadCompressedSignedInteger());
                    startColumn = AddColumns(previousStartColumn, reader.ReadCompressedSignedInteger());
                }

                previousStartLine   = startLine;
                previousStartColumn = startColumn;

                int endLine          = AddLines(startLine, deltaLines);
                int endColumn        = AddColumns(startColumn, deltaColumns);
                var linePositionSpan = new DynamicAnalysisSpan(documentRowId, startLine, startColumn, endLine, endColumn);
                builder.Add(linePositionSpan);
            }

            return(builder.ToImmutableAndFree());
        }
        public ImmutableArray<DynamicAnalysisSpan> GetSpans(BlobHandle handle)
        {
            if (handle.IsNil)
            {
                return ImmutableArray<DynamicAnalysisSpan>.Empty;
            }

            var builder = ArrayBuilder<DynamicAnalysisSpan>.GetInstance();

            var reader = GetBlobReader(handle);

            // header:
            int documentRowId = ReadDocumentRowId(ref reader);
            int previousStartLine = -1;
            ushort previousStartColumn = 0;

            // records:
            while (reader.RemainingBytes > 0)
            {
                int deltaLines, deltaColumns;
                ReadDeltaLinesAndColumns(ref reader, out deltaLines, out deltaColumns);

                // document:
                if (deltaLines == 0 && deltaColumns == 0)
                {
                    documentRowId = ReadDocumentRowId(ref reader);
                    continue;
                }

                int startLine;
                ushort startColumn;

                // delta Start Line & Column:
                if (previousStartLine < 0)
                {
                    Debug.Assert(previousStartColumn == 0);

                    startLine = ReadLine(ref reader);
                    startColumn = ReadColumn(ref reader);
                }
                else
                {
                    startLine = AddLines(previousStartLine, reader.ReadCompressedSignedInteger());
                    startColumn = AddColumns(previousStartColumn, reader.ReadCompressedSignedInteger());
                }

                previousStartLine = startLine;
                previousStartColumn = startColumn;

                int endLine = AddLines(startLine, deltaLines);
                int endColumn = AddColumns(startColumn, deltaColumns);
                var linePositionSpan = new DynamicAnalysisSpan(documentRowId, startLine, startColumn, endLine, endColumn);
                builder.Add(linePositionSpan);
            }

            return builder.ToImmutableAndFree();
        }