0

I'm working on a Visual Studio 2015 extension to add support for a new language and I have an error tagger. I know that it is working somewhat because I'm getting the red marks next to the scrollbar on the lines where the errors are. Additionally, I'm using the same parser in other classes (such as my Classifier) and I know that it works correctly. Here's my code for the Tagger. Any ideas?

    public IEnumerable<ITagSpan<ErrorTag>> GetTags(NormalizedSnapshotSpanCollection spans)
    {
        var parser = new NodeParser(true);
        var tags = new List<ITagSpan<ErrorTag>>();
        foreach (var span in spans)
        {
            //Reparse the whole thing.  It's just must simpler
            var spanToParse = new SnapshotSpan(span.Snapshot, new Span(0, span.Snapshot.Length));
            IList<LexicalElement> lexicalElements;
            parser.Parse(spanToParse.GetText(), "Editor", out lexicalElements);
            try
            {
                tags.AddRange(GetTagsFromElements(lexicalElements, span));
            }
            catch (FormatException)
            {
            }
        }
        return tags;
    }

    private IEnumerable<ITagSpan<ErrorTag>> GetTagsFromElements(IEnumerable<LexicalElement> elements, SnapshotSpan span)
    {
        foreach (var element in elements.Where(element => element.Name.Contains("_")))
        {
            var startIndex = span.Start.Position + element.StartCursor.Location;
            var endIndex = span.Start.Position + element.EndCursor.Location;
            if (endIndex > span.End.Position)
                continue;
            var errorSpan = new Span(startIndex, endIndex - startIndex);
            if(errorSpan.IntersectsWith(span))
                yield return new TagSpan<ErrorTag>(new SnapshotSpan(span.Snapshot,
                                new Span(span.Start.Position + element.StartCursor.Location,
                                            element.EndCursor.Location - element.StartCursor.Location)), new ErrorTag(PredefinedErrorTypeNames.SyntaxError));

        }
    }

Here's my tag provider:

[Export(typeof(ITaggerProvider))]
[ContentType("ConfigNode")]
[TagType(typeof(ErrorTag))]
class SyntaxErrorTaggerProvider : ITaggerProvider
{
    public ITagger<T> CreateTagger<T>(ITextBuffer buffer) where T : ITag
    {
        //create a single tagger for each buffer.
        Func<ITagger<T>> sc = delegate () { return new SyntaxErrorTagger(buffer) as ITagger<T>; };
        return buffer.Properties.GetOrCreateSingletonProperty(sc);
    }
}
JKor
  • 3,822
  • 3
  • 28
  • 36

0 Answers0