File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\CSharp\Formatting\CSharpFormattingOptions2.Parsers.cs
Web Access
Project: src\src\Workspaces\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.Workspaces.csproj (Microsoft.CodeAnalysis.CSharp.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 System;
using Microsoft.CodeAnalysis.PooledObjects;
 
namespace Microsoft.CodeAnalysis.CSharp.Formatting;
 
internal static partial class CSharpFormattingOptions2
{
    public static int ParseEditorConfigFlags(
        string list,
        Func<string, int> map,
        string? noneToken = null,
        string? allToken = null,
        int allValue = -1)
    {
        var flags = 0;
 
        var tokens = list.Split(',');
        var hasNoneToken = false;
 
        foreach (var token in tokens)
        {
            var trimmed = token.Trim();
            if (trimmed == allToken)
            {
                // "all" token has higher priority then "none"
                return allValue;
            }
 
            if (trimmed == noneToken)
            {
                hasNoneToken = true;
                continue;
            }
 
            flags |= map(trimmed);
        }
 
        // if "none" is present all other flags are ignored
        return hasNoneToken ? 0 : flags;
    }
 
    internal static string ToEditorConfigFlagList(int flags, Func<int, string> map)
    {
        using var _ = PooledStringBuilder.GetInstance(out var builder);
 
        var flag = 1;
        while (flag <= flags)
        {
            if ((flags & flag) == flag)
            {
                if (builder.Length > 0)
                {
                    builder.Append(',');
                }
 
                builder.Append(map(flag));
            }
 
            flag <<= 1;
        }
 
        return builder.ToString();
    }
 
    internal static SpacePlacementWithinParentheses ParseSpacingWithinParenthesesList(string list)
        => (SpacePlacementWithinParentheses)ParseEditorConfigFlags(list, static s => s_spacingWithinParenthesisOptionsEditorConfigMap.TryGetValue(s, out var v) ? (int)v : 0);
 
    internal static string ToEditorConfigValue(SpacePlacementWithinParentheses value)
        => (value == SpacePlacementWithinParentheses.None) ? "false" :
           ToEditorConfigFlagList((int)value, static v => s_spacingWithinParenthesisOptionsEditorConfigMap[(SpacePlacementWithinParentheses)v]);
 
    internal static NewLineBeforeOpenBracePlacement ParseNewLineBeforeOpenBracePlacementList(string list)
        => (NewLineBeforeOpenBracePlacement)ParseEditorConfigFlags(
           list,
           static s => s_newLineOptionsEditorConfigMap.TryGetValue(s, out var v) ? (int)v : s_legacyNewLineOptionsEditorConfigMap.TryGetValue(s, out v) ? (int)v : 0,
           noneToken: "none",
           allToken: "all",
           allValue: (int)NewLineBeforeOpenBracePlacement.All);
 
    internal static string ToEditorConfigValue(NewLineBeforeOpenBracePlacement value)
        => value switch
        {
            NewLineBeforeOpenBracePlacement.None => "none",
            NewLineBeforeOpenBracePlacement.All => "all",
            _ => ToEditorConfigFlagList((int)value, static v => s_newLineOptionsEditorConfigMap[(NewLineBeforeOpenBracePlacement)v])
        };
 
    internal static BinaryOperatorSpacingOptions ParseEditorConfigSpacingAroundBinaryOperator(string binaryOperatorSpacingValue)
        => s_binaryOperatorSpacingOptionsEditorConfigMap.TryGetValue(binaryOperatorSpacingValue.Trim(), out var value) ? value : BinaryOperatorSpacingOptions.Single;
 
    private static string GetSpacingAroundBinaryOperatorEditorConfigString(BinaryOperatorSpacingOptions value)
        => s_binaryOperatorSpacingOptionsEditorConfigMap.TryGetKey(value, out var key) ? key : "";
 
    internal static LabelPositionOptions ParseEditorConfigLabelPositioning(string labelIndentationValue)
        => s_labelPositionOptionsEditorConfigMap.TryGetValue(labelIndentationValue.Trim(), out var value) ? value : LabelPositionOptions.NoIndent;
 
    private static string GetLabelPositionOptionEditorConfigString(LabelPositionOptions value)
        => s_labelPositionOptionsEditorConfigMap.TryGetKey(value, out var key) ? key : "";
 
    internal static bool DetermineIfIgnoreSpacesAroundVariableDeclarationIsSet(string value)
        => value.Trim() == "ignore";
}