File: Contracts\EditAndContinue\ManagedMethodId.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// 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.Runtime.Serialization;
using System;
using System.Diagnostics;
 
namespace Microsoft.CodeAnalysis.Contracts.EditAndContinue;
 
/// <summary>
/// ManagedMethodId is a module/method pair which is used to uniquely identify the
/// symbol store's understanding of a particular CLR method.
/// </summary>
/// <remarks>
/// Creates a ManagedMethodId.
/// </remarks>
/// <param name="module">Module version ID in which the method exists.</param>
/// <param name="method">Method ID.</param>
[DataContract]
[DebuggerDisplay("{GetDebuggerDisplay(),nq}")]
internal readonly struct ManagedMethodId(
    Guid module,
    ManagedModuleMethodId method) : IEquatable<ManagedMethodId>
{
    public ManagedMethodId(Guid module, int token, int version)
        : this(module, new(token, version))
    {
    }
 
    /// <summary>
    /// The module version ID in which the method exists.
    /// </summary>
    [DataMember(Name = "module")]
    public Guid Module { get; } = module;
 
    /// <summary>
    /// The unique identifier for the method within <see cref="Module"/>.
    /// </summary>
    [DataMember(Name = "method")]
    public ManagedModuleMethodId Method { get; } = method;
 
    public int Token => Method.Token;
 
    public int Version => Method.Version;
 
    public bool Equals(ManagedMethodId other)
    {
        return Module == other.Module && Method.Equals(other.Method);
    }
 
    public override bool Equals(object? obj) => obj is ManagedMethodId method && Equals(method);
 
    public override int GetHashCode()
    {
        return Module.GetHashCode() ^ Method.GetHashCode();
    }
 
    public static bool operator ==(ManagedMethodId left, ManagedMethodId right) => left.Equals(right);
 
    public static bool operator !=(ManagedMethodId left, ManagedMethodId right) => !(left == right);
 
    internal string GetDebuggerDisplay() => $"mvid={Module} {Method.GetDebuggerDisplay()}";
}