File: Options\OptionLogger.cs
Web Access
Project: src\src\VisualStudio\Core\Impl\Microsoft.VisualStudio.LanguageServices.Implementation.csproj (Microsoft.VisualStudio.LanguageServices.Implementation)
// 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.Collections.Immutable;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.Options;
 
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Options;
 
internal static class OptionLogger
{
    private const string ConfigName = nameof(ConfigName);
    private const string Language = nameof(Language);
    private const string Change = nameof(Change);
    private const string All = nameof(All);
 
    public static void Log(ImmutableArray<(OptionKey2 key, object? oldValue, object? newValue)> changedOptions)
    {
        foreach (var (optionKey, oldValue, newValue) in changedOptions)
        {
            Logger.Log(FunctionId.Run_Environment_Options, Create(optionKey, oldValue, newValue));
        }
    }
 
    private static KeyValueLogMessage Create(OptionKey2 optionKey, object? oldValue, object? currentValue)
    {
        return KeyValueLogMessage.Create(static (m, args) =>
        {
            var (optionKey, oldValue, currentValue) = args;
            m[ConfigName] = optionKey.Option.Definition.ConfigName;
            m[Language] = optionKey.Language ?? All;
            m[Change] = CreateOptionValue(oldValue, currentValue);
        }, (optionKey, oldValue, currentValue));
    }
 
    private static string CreateOptionValue(object? oldValue, object? currentValue)
    {
        var oldString = GetOptionValue(oldValue);
        var newString = GetOptionValue(currentValue);
 
        return oldString + "->" + newString;
    }
 
    private static string GetOptionValue(object? oldValue)
        => oldValue == null ? "[null]" : oldValue.ToString();
}