Esempio n. 1
0
 public ITextSnapshotLine GetLineFromPosition(int position)
 {
     if (TextBuffer.IsSafeToAccessDocumentFromSnapshot(this))
     {
         var docLine = TextBuffer.Document.GetLineByOffset(position);
         return(new TextSnapshotLine(this, docLine.LineNumber - 1, docLine.Offset, docLine.Length, docLine.DelimiterLength));
     }
     return(GetLineFromLineNumber(GetLineNumberFromPosition(position)));
 }
Esempio n. 2
0
 public TextImageLine GetLineFromLineNumber(int lineNumber)
 {
     if (TextBuffer.IsSafeToAccessDocumentFromSnapshot(this))
     {
         var docLine = TextBuffer.Document.GetLineByNumber(lineNumber + 1);
         return(new TextImageLine(this, lineNumber, new Span(docLine.Offset, docLine.Length), docLine.DelimiterLength));
     }
     if (lineOffsets is null)
     {
         lineOffsets = TextImageUtils.CreateLineOffsets(this);
     }
     TextImageUtils.GetLineInfo(lineOffsets, lineNumber, Length, out int start, out int end, out int lineBreakLength);
     return(new TextImageLine(this, lineNumber, new Span(start, end - start), lineBreakLength));
 }
Esempio n. 3
0
 public int GetLineNumberFromPosition(int position)
 {
     if ((uint)position > (uint)Length)
     {
         throw new ArgumentOutOfRangeException(nameof(position));
     }
     if (TextBuffer.IsSafeToAccessDocumentFromSnapshot(this))
     {
         return(TextBuffer.Document.GetLineByOffset(position).LineNumber - 1);
     }
     if (lineOffsets is null)
     {
         lineOffsets = TextImageUtils.CreateLineOffsets(this);
     }
     return(TextImageUtils.GetLineNumberFromPosition(lineOffsets, position, Length));
 }
Esempio n. 4
0
        public int GetLineNumberFromPosition(int position)
        {
            if ((uint)position > (uint)Length)
            {
                throw new ArgumentOutOfRangeException(nameof(position));
            }
            if (TextBuffer.IsSafeToAccessDocumentFromSnapshot(this))
            {
                return(TextBuffer.Document.GetLineByOffset(position).LineNumber - 1);
            }
            if (lineOffsets == null)
            {
                lineOffsets = CreateLineOffsets();
            }
            var array = lineOffsets;

            if (position == Length)
            {
                return(array.Length - 1);
            }

            int lo = 0, hi = array.Length - 1;

            while (lo <= hi)
            {
                int lineNo = (lo + hi) / 2;

                int start = (int)(array[lineNo] & OFFSET_MASK);
                int end   = lineNo + 1 < array.Length ? (int)(array[lineNo + 1] & OFFSET_MASK) : Length;

                if (position < start)
                {
                    hi = lineNo - 1;
                }
                else if (position >= end)
                {
                    lo = lineNo + 1;
                }
                else
                {
                    return(lineNo);
                }
            }

            throw new ArgumentOutOfRangeException(nameof(position));
        }
Esempio n. 5
0
        public ITextSnapshotLine GetLineFromLineNumber(int lineNumber)
        {
            if (TextBuffer.IsSafeToAccessDocumentFromSnapshot(this))
            {
                var docLine = TextBuffer.Document.GetLineByNumber(lineNumber + 1);
                return(new TextSnapshotLine(this, lineNumber, docLine.Offset, docLine.Length, docLine.DelimiterLength));
            }
            if (lineOffsets == null)
            {
                lineOffsets = CreateLineOffsets();
            }
            var array = lineOffsets;

            if ((uint)lineNumber >= (uint)array.Length)
            {
                throw new ArgumentOutOfRangeException(nameof(lineNumber));
            }
            int start           = (int)(array[lineNumber] & OFFSET_MASK);
            int lineBreakLength = (int)(array[lineNumber] >> LINEBREAK_SHIFT);
            int end             = (lineNumber + 1 < array.Length ? (int)(array[lineNumber + 1] & OFFSET_MASK) : Length) - lineBreakLength;

            return(new TextSnapshotLine(this, lineNumber, start, end - start, lineBreakLength));
        }