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))); }
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)); }
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)); }
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)); }
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)); }