File: Extensibility\NavigationBar\NavigationBarItem.cs
Web Access
Project: src\src\EditorFeatures\Core\Microsoft.CodeAnalysis.EditorFeatures.csproj (Microsoft.CodeAnalysis.EditorFeatures)
// 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.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Text;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.Editor;
 
internal abstract class NavigationBarItem(
    ITextVersion? textVersion,
    string text,
    Glyph glyph,
    ImmutableArray<TextSpan> spans,
    ImmutableArray<NavigationBarItem> childItems = default,
    int indent = 0,
    bool bolded = false,
    bool grayed = false) : IEquatable<NavigationBarItem>
{
    public string Text { get; } = text;
    public Glyph Glyph { get; } = glyph;
    public bool Bolded { get; } = bolded;
    public bool Grayed { get; } = grayed;
    public int Indent { get; } = indent;
    public ImmutableArray<NavigationBarItem> ChildItems { get; } = childItems.NullToEmpty();
 
    /// <summary>
    /// The spans in the owning document corresponding to this nav bar item.  If the user's caret enters one of
    /// these spans, we'll select that item in the nav bar (except if they're in an item's span that is nested
    /// within this).
    /// </summary>
    /// <remarks>This can be empty for items whose location is in another document.</remarks>
    public ImmutableArray<TextSpan> Spans { get; } = spans;
 
    internal ITextVersion? TextVersion { get; } = textVersion;
 
    public abstract override bool Equals(object? obj);
    public abstract override int GetHashCode();
 
    public bool Equals(NavigationBarItem? other)
    {
        return other != null &&
               Text == other.Text &&
               Glyph == other.Glyph &&
               Bolded == other.Bolded &&
               Grayed == other.Grayed &&
               Indent == other.Indent &&
               ChildItems.SequenceEqual(other.ChildItems) &&
               Spans.SequenceEqual(other.Spans);
    }
}
 
internal static class NavigationBarItemExtensions
{
    public static TextSpan GetCurrentItemSpan(this NavigationBarItem item, ITextVersion toVersion, TextSpan span)
    {
        Contract.ThrowIfNull(item.TextVersion, "This should only be called for locations the caller knows to be in the open file");
        return item.TextVersion.CreateTrackingSpan(span.ToSpan(), SpanTrackingMode.EdgeExclusive)
                               .GetSpan(toVersion)
                               .ToTextSpan();
    }
}