File: Lowering\Instrumentation\InstrumentationState.cs
Web Access
Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp)
// 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.

namespace Microsoft.CodeAnalysis.CSharp;

/// <summary>
/// Manages instrumentation state.
/// </summary>
internal sealed class InstrumentationState
{
    /// <summary>
    /// Used to temporarily suspend instrumentation, for example when lowering expression tree.
    /// </summary>
    public bool IsSuppressed { get; set; }

    /// <summary>
    /// Current instrumenter.
    /// </summary>
    public Instrumenter Instrumenter { get; set; } = Instrumenter.NoOp;

    public void RemoveCodeCoverageInstrumenter()
    {
        Instrumenter = recurse(Instrumenter);

        static Instrumenter recurse(Instrumenter instrumenter)
            => instrumenter switch
            {
                CodeCoverageInstrumenter { Previous: var previous } => recurse(previous),
                CompoundInstrumenter compound => compound.WithPrevious(recurse(compound.Previous)),
                _ => instrumenter,
            };
    }
}