File: Logging\FunctionIdOptions.cs
Web Access
Project: src\src\EditorFeatures\Core\Microsoft.CodeAnalysis.EditorFeatures.csproj (Microsoft.CodeAnalysis.EditorFeatures)
// 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.Linq;
using System.Collections.Concurrent;
using Microsoft.CodeAnalysis.Options;
using System.Collections.Generic;
 
namespace Microsoft.CodeAnalysis.Internal.Log;
 
internal static class FunctionIdOptions
{
    private static readonly ConcurrentDictionary<FunctionId, Option2<bool>> s_options = [];
 
    private static readonly Func<FunctionId, Option2<bool>> s_optionCreator = CreateOption;
 
    private static Option2<bool> CreateOption(FunctionId id)
    {
        var name = id.ToString();
 
        // This local storage location can be set via vsregedit. Which is available on any VS Command Prompt.
        //
        // To enable logging:
        //
        //     vsregedit set local [hive name] HKCU Roslyn\Internal\Performance\FunctionId [function name] dword 1
        //
        // To disable logging
        //
        //     vsregedit delete local [hive name] HKCU Roslyn\Internal\Performance\FunctionId [function name]
        //
        // If you want to set it for the default hive, use "" as the hive name (i.e. an empty argument)
        return new("FunctionIdOptions_" + name, defaultValue: false);
    }
 
    private static IEnumerable<FunctionId> GetFunctionIds()
        => Enum.GetValues(typeof(FunctionId)).Cast<FunctionId>();
 
    public static IEnumerable<IOption2> GetOptions()
        => GetFunctionIds().Select(GetOption);
 
    public static Option2<bool> GetOption(FunctionId id)
        => s_options.GetOrAdd(id, s_optionCreator);
 
    public static Func<FunctionId, bool> CreateFunctionIsEnabledPredicate(IGlobalOptionService globalOptions)
    {
        var functionIdOptions = GetFunctionIds().ToDictionary(id => id, id => globalOptions.GetOption(GetOption(id)));
        return functionId => functionIdOptions[functionId];
    }
}