File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\EmbeddedLanguages\Common\EmbeddedDiagnostic.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;
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.EmbeddedLanguages.Common;
 
/// <summary>
/// Represents an error in a embedded language snippet.  The error contains the message to show 
/// a user as well as the span of the error.  This span is in actual user character coordinates.
/// For example, if the user has the string "...\\p{0}..." then the span of the error would be 
/// for the range of characters for '\\p{0}' (even though the regex engine would only see the \\ 
/// translated as a virtual char to the single \ character.
/// </summary>
internal readonly struct EmbeddedDiagnostic : IEquatable<EmbeddedDiagnostic>
{
    public readonly string Message;
    public readonly TextSpan Span;
 
    public EmbeddedDiagnostic(string message, TextSpan span)
    {
        RoslynDebug.AssertNotNull(message);
        Message = message;
        Span = span;
    }
 
    public override bool Equals(object? obj)
        => obj is EmbeddedDiagnostic diagnostic && Equals(diagnostic);
 
    public bool Equals(EmbeddedDiagnostic other)
        => Message == other.Message &&
           Span.Equals(other.Span);
 
    public override string ToString()
        => Message;
 
    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = -954867195;
            hashCode = hashCode * -1521134295 + base.GetHashCode();
            hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Message);
            hashCode = hashCode * -1521134295 + EqualityComparer<TextSpan>.Default.GetHashCode(Span);
            return hashCode;
        }
    }
 
    public static bool operator ==(EmbeddedDiagnostic diagnostic1, EmbeddedDiagnostic diagnostic2)
        => diagnostic1.Equals(diagnostic2);
 
    public static bool operator !=(EmbeddedDiagnostic diagnostic1, EmbeddedDiagnostic diagnostic2)
        => !(diagnostic1 == diagnostic2);
}