File: SynchronizedTextWriter.cs
Web Access
Project: src\src\Interactive\HostTest\InteractiveHost.UnitTests.csproj (InteractiveHost.UnitTests)
// 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.Diagnostics;
using System.IO;
 
namespace Microsoft.CodeAnalysis.UnitTests.Interactive
{
    internal sealed class SynchronizedStringWriter : StringWriter
    {
        public readonly object SyncRoot = new object();
 
        public override void Write(char value)
        {
            lock (SyncRoot)
            {
                base.Write(value);
            }
        }
 
        public override void Write(string? value)
        {
            lock (SyncRoot)
            {
                base.Write(value);
            }
        }
 
        public override void Write(char[] buffer, int index, int count)
        {
            lock (SyncRoot)
            {
                base.Write(buffer, index, count);
            }
        }
 
        public override string ToString()
        {
            lock (SyncRoot)
            {
                return base.ToString();
            }
        }
 
        public string? Prefix(string mark, ref int start)
        {
            Debug.Assert(!string.IsNullOrEmpty(mark));
 
            lock (SyncRoot)
            {
                var builder = GetStringBuilder();
 
                for (int i = start, n = builder.Length - mark.Length; i <= n; i++)
                {
                    int j = 0;
                    while (j < mark.Length && builder[i + j] == mark[j])
                    {
                        j++;
                    }
 
                    if (j == mark.Length)
                    {
                        var result = builder.ToString(start, i - start);
                        start = i + j;
                        return result;
                    }
                }
 
                return null;
            }
        }
 
        public void Clear()
        {
            lock (SyncRoot)
            {
                GetStringBuilder().Clear();
            }
        }
    }
}