File: StringIndentation\StringIndentationTag.cs
Web Access
Project: src\src\EditorFeatures\Core.Wpf\Microsoft.CodeAnalysis.EditorFeatures.Wpf_tpal30ww_wpftmp.csproj (Microsoft.CodeAnalysis.EditorFeatures.Wpf)
// 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.Windows.Media;
using Microsoft.CodeAnalysis.Editor.Implementation.Adornments;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Classification;
using Microsoft.VisualStudio.Text.Editor;
 
namespace Microsoft.CodeAnalysis.Editor.Implementation.StringIndentation
{
    /// <summary>
    /// Tag that specifies how a string's content is indented.
    /// </summary>
    internal class StringIndentationTag : BrushTag, IEquatable<StringIndentationTag>
    {
        private readonly StringIndentationTaggerProvider _provider;
 
        public readonly ImmutableArray<SnapshotSpan> OrderedHoleSpans;
 
        public StringIndentationTag(
            StringIndentationTaggerProvider provider,
            IEditorFormatMap editorFormatMap,
            ImmutableArray<SnapshotSpan> orderedHoleSpans)
            : base(editorFormatMap)
        {
            _provider = provider;
            OrderedHoleSpans = orderedHoleSpans;
        }
 
        protected override Color? GetColor(IWpfTextView view, IEditorFormatMap editorFormatMap)
        {
            var brush = view.VisualElement.TryFindResource("outlining.verticalrule.foreground") as SolidColorBrush;
            return brush?.Color;
        }
 
        // 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 StringIndentationTag);
 
        public bool Equals(StringIndentationTag? other)
        {
            if (other is null)
                return false;
 
            if (this.OrderedHoleSpans.Length != other.OrderedHoleSpans.Length)
                return false;
 
            for (int i = 0, n = this.OrderedHoleSpans.Length; i < n; i++)
            {
                if (!_provider.SpanEquals(this.OrderedHoleSpans[i], other.OrderedHoleSpans[i]))
                    return false;
            }
 
            return true;
        }
    }
}