File: InheritanceMargin\InheritanceMarginTag.cs
Web Access
Project: src\src\VisualStudio\Core\Def\Microsoft.VisualStudio.LanguageServices_4r0c5m1y_wpftmp.csproj (Microsoft.VisualStudio.LanguageServices)
// 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.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.InheritanceMargin;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.VisualStudio.Imaging.Interop;
using Microsoft.VisualStudio.Text.Editor;
using Roslyn.Utilities;
 
namespace Microsoft.VisualStudio.LanguageServices.Implementation.InheritanceMargin;
 
internal class InheritanceMarginTag : IGlyphTag, IEquatable<InheritanceMarginTag>
{
    /// <summary>
    /// Margin moniker.
    /// </summary>
    public ImageMoniker Moniker { get; }
 
    /// <summary>
    /// Members needs to be shown on this line. There might be multiple members.
    /// For example:
    /// interface IBar { void Foo1(); void Foo2(); }
    /// class Bar : IBar { void Foo1() { } void Foo2() { } }
    /// </summary>
    public readonly ImmutableArray<InheritanceMarginItem> MembersOnLine;
 
    /// <summary>
    /// Used for accessibility purpose.
    /// </summary>
    public readonly int LineNumber;
 
    public InheritanceMarginTag(int lineNumber, ImmutableArray<InheritanceMarginItem> membersOnLine)
    {
        Contract.ThrowIfTrue(membersOnLine.IsEmpty);
 
        LineNumber = lineNumber;
        MembersOnLine = membersOnLine;
 
        // The common case is that one line has one member.
        using var _ = ArrayBuilder<InheritanceTargetItem>.GetInstance(out var allItems);
        foreach (var marginItem in membersOnLine)
            allItems.AddRange(marginItem.TargetItems);
 
        var relationship = allItems[0].RelationToMember;
        for (var i = 1; i < allItems.Count; i++)
            relationship |= allItems[i].RelationToMember;
 
        Moniker = InheritanceMarginHelpers.GetMoniker(relationship);
    }
 
    // Intentionally throwing, we have never supported this facility, and there is no contract around placing
    // these tags in sets or maps.
    public override int GetHashCode()
        => throw new NotImplementedException();
 
    public override bool Equals(object? obj)
        => Equals(obj as InheritanceMarginTag);
 
    public bool Equals(InheritanceMarginTag? other)
    {
        return other != null &&
            this.LineNumber == other.LineNumber &&
            this.Moniker.Guid == other.Moniker.Guid &&
            this.Moniker.Id == other.Moniker.Id &&
            this.MembersOnLine.SequenceEqual(other.MembersOnLine);
    }
}