File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\TextLineExtensions.cs
Web Access
Project: src\src\Workspaces\Core\Portable\Microsoft.CodeAnalysis.Workspaces.csproj (Microsoft.CodeAnalysis.Workspaces)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.Shared.Extensions;
 
internal static class TextLineExtensions
{
    public static int? GetLastNonWhitespacePosition(this TextLine line)
    {
        var text = line.Text!;
        var startPosition = line.Start;
 
        for (var i = line.End - 1; i >= startPosition; i--)
        {
            if (!char.IsWhiteSpace(text[i]))
                return i;
        }
 
        return null;
    }
 
    /// <summary>
    /// Returns the first non-whitespace position on the given line, or null if 
    /// the line is empty or contains only whitespace.
    /// </summary>
    public static int? GetFirstNonWhitespacePosition(this TextLine line)
    {
        var firstNonWhitespaceOffset = line.GetFirstNonWhitespaceOffset();
 
        return firstNonWhitespaceOffset.HasValue
            ? firstNonWhitespaceOffset + line.Start
            : null;
    }
 
    /// <summary>
    /// Returns the first non-whitespace position on the given line as an offset
    /// from the start of the line, or null if the line is empty or contains only
    /// whitespace.
    /// </summary>
    public static int? GetFirstNonWhitespaceOffset(this TextLine line)
    {
        var text = line.Text;
        if (text != null)
        {
            for (var i = line.Start; i < line.End; i++)
            {
                if (!char.IsWhiteSpace(text[i]))
                    return i - line.Start;
            }
        }
 
        return null;
    }
 
    public static string GetLeadingWhitespace(this TextLine line)
        => line.ToString().GetLeadingWhitespace();
 
    /// <summary>
    /// Determines whether the specified line is empty or contains whitespace only.
    /// </summary>
    public static bool IsEmptyOrWhitespace(this TextLine line)
    {
        var text = line.Text;
        RoslynDebug.Assert(text is object);
        for (var i = line.Span.Start; i < line.Span.End; i++)
        {
            if (!char.IsWhiteSpace(text[i]))
            {
                return false;
            }
        }
 
        return true;
    }
 
    public static int GetColumnOfFirstNonWhitespaceCharacterOrEndOfLine(this TextLine line, int tabSize)
        => line.ToString().GetColumnOfFirstNonWhitespaceCharacterOrEndOfLine(tabSize);
 
    public static int GetColumnFromLineOffset(this TextLine line, int lineOffset, int tabSize)
        => line.ToString().GetColumnFromLineOffset(lineOffset, tabSize);
 
    public static int GetLineOffsetFromColumn(this TextLine line, int column, int tabSize)
        => line.ToString().GetLineOffsetFromColumn(column, tabSize);
}