File: EditorConfigNamingStyleParser_NamingRule.cs
Web Access
Project: ..\..\..\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 System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Microsoft.CodeAnalysis.NamingStyles;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles
{
    internal static partial class EditorConfigNamingStyleParser
    {
        private static bool TryGetSerializableNamingRule(
            string namingRuleTitle,
            SymbolSpecification symbolSpec,
            NamingStyle namingStyle,
            IReadOnlyDictionary<string, string> conventionsDictionary,
            [NotNullWhen(true)] out SerializableNamingRule? serializableNamingRule)
        {
            if (!TryGetRuleSeverity(namingRuleTitle, conventionsDictionary, out var severity))
            {
                serializableNamingRule = null;
                return false;
            }
 
            serializableNamingRule = new SerializableNamingRule()
            {
                EnforcementLevel = severity,
                NamingStyleID = namingStyle.ID,
                SymbolSpecificationID = symbolSpec.ID
            };
 
            return true;
        }
 
        internal static bool TryGetRuleSeverity(
            string namingRuleName,
            IReadOnlyDictionary<string, (string value, TextLine? line)> conventionsDictionary,
            out (ReportDiagnostic severity, TextLine? line) value)
            => TryGetRuleSeverity(namingRuleName, conventionsDictionary, x => x.value, x => x.line, out value);
 
        private static bool TryGetRuleSeverity(
            string namingRuleName,
            IReadOnlyDictionary<string, string> conventionsDictionary,
            out ReportDiagnostic severity)
        {
            var result = TryGetRuleSeverity<string, object?>(
                namingRuleName,
                conventionsDictionary,
                x => x,
                x => null, // we don't have a tuple
                out var tuple);
            severity = tuple.severity;
            return result;
        }
 
        private static bool TryGetRuleSeverity<T, V>(
            string namingRuleName,
            IReadOnlyDictionary<string, T> conventionsDictionary,
            Func<T, string> valueSelector,
            Func<T, V> partSelector,
            out (ReportDiagnostic severity, V value) value)
        {
            if (conventionsDictionary.TryGetValue($"dotnet_naming_rule.{namingRuleName}.severity", out var result))
            {
                var severity = ParseEnforcementLevel(valueSelector(result) ?? string.Empty);
                value = (severity, partSelector(result));
                return true;
            }
 
            value = default;
            return false;
        }
 
        private static ReportDiagnostic ParseEnforcementLevel(string ruleSeverity)
        {
            switch (ruleSeverity)
            {
                case EditorConfigSeverityStrings.None:
                    return ReportDiagnostic.Suppress;
 
                case EditorConfigSeverityStrings.Refactoring:
                case EditorConfigSeverityStrings.Silent:
                    return ReportDiagnostic.Hidden;
 
                case EditorConfigSeverityStrings.Suggestion: return ReportDiagnostic.Info;
                case EditorConfigSeverityStrings.Warning: return ReportDiagnostic.Warn;
                case EditorConfigSeverityStrings.Error: return ReportDiagnostic.Error;
                default: return ReportDiagnostic.Hidden;
            }
        }
    }
}