-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBraceBlockTaggerProvider.cs
61 lines (54 loc) · 1.79 KB
/
BraceBlockTaggerProvider.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Tagging;
using Microsoft.VisualStudio.Utilities;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
namespace BraceProvider
{
[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TagType(typeof(IBlockTag))]
internal class BraceBlockTaggerProvider : ITaggerProvider
{
public ITagger<T> CreateTagger<T>(ITextBuffer buffer) where T : ITag
{
if (typeof(T) == typeof(IBlockTag))
{
GenericBlockTagger tagger = buffer.Properties.GetOrCreateSingletonProperty(typeof(BraceBlockTaggerProvider), delegate { return new GenericBlockTagger(buffer, new BraceParser()); });
return new DisposableTagger(tagger) as ITagger<T>;
}
else
return null;
}
}
internal class DisposableTagger : ITagger<IBlockTag>, IDisposable
{
private GenericBlockTagger _tagger;
public DisposableTagger(GenericBlockTagger tagger)
{
_tagger = tagger;
_tagger.AddRef();
_tagger.TagsChanged += OnTagsChanged;
}
private void OnTagsChanged(object sender, SnapshotSpanEventArgs e)
{
this.TagsChanged?.Invoke(sender, e);
}
public IEnumerable<ITagSpan<IBlockTag>> GetTags(NormalizedSnapshotSpanCollection spans)
{
return _tagger.GetTags(spans);
}
public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
public void Dispose()
{
if (_tagger != null)
{
_tagger.TagsChanged -= OnTagsChanged;
_tagger.Release();
_tagger = null;
}
}
}
}