public void ToLineColumn(int position, out int line, out int column)
//^^ requires position >= 0 && position <= Length;
//^^ ensures line >= 1 && column >= 1;
{
if (!this.enumeratorIsValid || position < this.currentFragmentOffset || position < this.lastPosition) {
this.fragmentEnumerator = this.GetFragments().GetEnumerator();
this.currentFragmentOffset = 0;
this.enumeratorIsValid = this.fragmentEnumerator.MoveNext();
this.lastPosition = 0;
this.lineCounter = 1;
this.columnCounter = 1;
}
line = this.lineCounter;
column = this.columnCounter;
Contract.Assert(this.fragmentEnumerator != null);
while (this.enumeratorIsValid) {
Contract.Assume((this.lastPosition >= position - this.currentFragmentOffset || this.lastPosition >= this.fragmentEnumerator.Current.Source.Length) || 0 <= this.lastPosition);
this.ToLineColumn(position - this.currentFragmentOffset, ref line, ref column, this.fragmentEnumerator.Current.Source);
int fragmentLength = this.fragmentEnumerator.Current.Length;
if (this.currentFragmentOffset + fragmentLength > position) break;
this.currentFragmentOffset += fragmentLength;
this.enumeratorIsValid = this.fragmentEnumerator.MoveNext();
this.lastPosition = 0;
}
this.lineCounter = line;
this.columnCounter = column;
}