using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Tagging;
namespace Microsoft.CodeAnalysis.Editor.InlineParamNameHints
{
///
/// The purpose of this tagger is to convert the InlineParamNameHintsDataTags to
/// the InlineParamNameHintsTag, which actually creates the UIElement. It reacts to
/// tags changing and updates the adornments accordingly.
///
class InlineParamNameHintsTagger : ITagger
{
private readonly ITagAggregator _tagAggregator;
private readonly ITextBuffer _buffer;
public InlineParamNameHintsTagger(ITextBuffer buffer, ITagAggregator tagAggregator)
{
_buffer = buffer;
_tagAggregator = tagAggregator;
_tagAggregator.TagsChanged += _tagAggregator_TagsChanged;
}
private void _tagAggregator_TagsChanged(object sender, TagsChangedEventArgs e)
{
var spans = e.Span.GetSpans(_buffer);
foreach (var span in spans)
{
TagsChanged?.Invoke(this, new SnapshotSpanEventArgs(new SnapshotSpan(span.Snapshot, 0, span.Snapshot.Length)));
}
}
public event EventHandler TagsChanged;
public IEnumerable> GetTags(NormalizedSnapshotSpanCollection spans)
{
var tagsList = new List>();
var dataTags = _tagAggregator.GetTags(spans);
foreach(var tag in dataTags)
{
var dataTagSpans = tag.Span.GetSpans(spans[0].Snapshot);
var textTag = tag.Tag;
if (dataTagSpans.Count > 0)
{
var dataTagSpan = dataTagSpans[0];
var adornmentSpan = new SnapshotSpan(dataTagSpan.Start, 0);
tagsList.Add(new TagSpan(adornmentSpan, new InlineParamNameHintsTag(textTag.TagName)));
}
}
return tagsList.AsEnumerable();
}
}
}