File: EditAndContinue\RudeEditDiagnosticDescription.cs
Web Access
Project: ..\..\..\src\EditorFeatures\TestUtilities\Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities.csproj (Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities)
// 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.
 
#nullable disable
 
using System;
using System.Linq;
using Roslyn.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.EditAndContinue.UnitTests
{
    internal readonly struct RudeEditDiagnosticDescription : IEquatable<RudeEditDiagnosticDescription>
    {
        private readonly RudeEditKind _rudeEditKind;
        private readonly string _firstLine;
        private readonly string _squiggle;
        private readonly string[] _arguments;
 
        internal RudeEditDiagnosticDescription(RudeEditKind rudeEditKind, string squiggle, string[] arguments, string firstLine)
        {
            _rudeEditKind = rudeEditKind;
            _squiggle = squiggle;
            _firstLine = firstLine;
            _arguments = arguments ?? Array.Empty<string>();
        }
 
        public string FirstLine => _firstLine;
 
        public RudeEditDiagnosticDescription WithFirstLine(string value)
            => new RudeEditDiagnosticDescription(_rudeEditKind, _squiggle, _arguments, value.Trim());
 
        public bool Equals(RudeEditDiagnosticDescription other)
        {
            return _rudeEditKind == other._rudeEditKind
                && _squiggle == other._squiggle
                && (_firstLine == other._firstLine || _firstLine == null || other._firstLine == null)
                && _arguments.SequenceEqual(other._arguments, object.Equals);
        }
 
        public override bool Equals(object obj)
            => obj is RudeEditDiagnosticDescription && Equals((RudeEditDiagnosticDescription)obj);
 
        public override int GetHashCode()
        {
            return
                Hash.Combine(_squiggle,
                Hash.CombineValues(_arguments, (int)_rudeEditKind));
        }
 
        public override string ToString()
        {
            var arguments = string.Join(", ", new[] { (_squiggle != null) ? "\"" + _squiggle.Replace("\r\n", "\\r\\n") + "\"" : "null" }.Concat(_arguments.Select(a => "\"" + a + "\"")));
            var withLine = (_firstLine != null) ? $".WithFirstLine(\"{_firstLine}\")" : null;
 
            return $"Diagnostic(RudeEditKind.{_rudeEditKind}, {arguments}){withLine}";
        }
 
        internal void VerifyMessageFormat()
        {
            var descriptior = EditAndContinueDiagnosticDescriptors.GetDescriptor(_rudeEditKind);
            var format = descriptior.MessageFormat.ToString();
            try
            {
                string.Format(format, _arguments);
            }
            catch (FormatException)
            {
                Assert.True(false, $"Message format string was not supplied enough arguments.\nRudeEditKind: {_rudeEditKind}\nArguments supplied: {_arguments.Length}\nFormat string: {format}");
            }
        }
    }
}