File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Formatting\Engine\TokenStream.Changes.cs
Web Access
Project: src\src\CodeStyle\Core\Analyzers\Microsoft.CodeAnalysis.CodeStyle.csproj (Microsoft.CodeAnalysis.CodeStyle)
// 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.Concurrent;
using System.Diagnostics.CodeAnalysis;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.Formatting;
 
internal sealed partial class TokenStream
{
    /// <summary>
    /// Thread-safe collection that holds onto changes
    /// </summary>
    private struct Changes
    {
        public const int BeginningOfTreeKey = -1;
        public const int EndOfTreeKey = -2;
 
        // Created lazily
        private ConcurrentDictionary<int, TriviaData> _map;
 
        public readonly bool TryRemove(int pairIndex)
            => _map?.TryRemove(pairIndex, out _) ?? false;
 
        public void AddOrReplace(int key, TriviaData triviaInfo)
        {
            // PERF: Set the concurrency level to 1 because, while the dictionary has to be thread-safe,
            // there is very little contention in formatting. A lower concurrency level reduces object
            // allocations which are used internally by ConcurrentDictionary for locking.
            var map = InterlockedOperations.Initialize(ref _map, () => new ConcurrentDictionary<int, TriviaData>(concurrencyLevel: 1, capacity: 8));
            map[key] = triviaInfo;
        }
 
        public readonly bool TryGet(int key, [NotNullWhen(true)] out TriviaData? triviaInfo)
        {
            triviaInfo = null;
            return _map?.TryGetValue(key, out triviaInfo) ?? false;
        }
    }
}