in vsintegration/src/FSharp.LanguageService.Base/Source.cs [1128:1179]
public void TrimSpan(ref TextSpan span)
{
// Scan forwards past whitepsace.
int length;
NativeMethods.ThrowOnFailure(this.textLines.GetLengthOfLine(span.iStartLine, out length));
while (span.iStartLine < span.iEndLine || (span.iStartLine == span.iEndLine && span.iStartIndex < span.iEndIndex))
{
string text = this.GetText(span.iStartLine, 0, span.iStartLine, length);
for (int i = span.iStartIndex; i < length; i++)
{
char ch = text[i];
if (ch != ' ' && ch != '\t')
break;
span.iStartIndex++;
}
if (span.iStartIndex >= length)
{
span.iStartIndex = 0;
span.iStartLine++;
NativeMethods.ThrowOnFailure(this.textLines.GetLengthOfLine(span.iStartLine, out length));
}
else
{
break;
}
}
// Scan backwards past whitepsace.
NativeMethods.ThrowOnFailure(this.textLines.GetLengthOfLine(span.iEndLine, out length));
while (span.iStartLine < span.iEndLine || (span.iStartLine == span.iEndLine && span.iStartIndex < span.iEndIndex))
{
string text = GetText(span.iEndLine, 0, span.iEndLine, length);
for (int i = span.iEndIndex - 1; i >= 0; i--)
{
char ch = text[i];
if (ch != ' ' && ch != '\t')
break;
span.iEndIndex--;
}
if (span.iEndIndex <= 0)
{
span.iEndLine--;
NativeMethods.ThrowOnFailure(this.textLines.GetLengthOfLine(span.iEndLine, out length));
span.iEndIndex = length;
}
else
{
break;
}
}
}