Как создать тег для определенной строки / столбца / длины в редакторе Visual Studio? - PullRequest
2 голосов
/ 28 мая 2019

Я хотел бы создать теги в редакторе Visual Studio для вставки всех видов глифов, украшений, подсветки текста и т. Д. В зависимости от расположения строки / столбца / длины в коде.

Я внимательно читал справочные страницы с документацией (https://docs.microsoft.com/en-us/visualstudio/extensibility/walkthrough-creating-a-margin-glyph?view=vs-2017 и связанные страницы). Хотя это немного сложно и трудно понять, похоже, что API очень сильно ориентирован на предоставление средств для анализа кода: он может разбить ваш код на части, с классификациями и т. Д.

Однако у меня есть «противоположная» потребность: у меня уже есть анализ, выполненный моим внешним механизмом анализа. И у меня уже есть набор результатов для отображения в редакторе со строкой / столбцом / длиной для каждого. Как:

  • функция «foo», расположенная в строке 345, столбец 1, длина 3 и другие поля, содержащие информацию для отображения,

  • переменная "my_var", расположенная в строке 349, столбце 13, длина 6 и другие поля, содержащие информацию, которая должна отображаться,

Можно ли создавать теги в редакторе Visual Studio непосредственно на основе их расположения строки / столбца / длины? Любая подсказка, любой указатель на более подробную документацию или учебное пособие будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 июня 2019

Ссылка Ланса была весьма полезна для понимания другого способа создания тегов, отличного от примера документации MS.

Действительно, я не анализирую текст, содержащийся в промежутках, анализ уже сделан снаружи.Я получаю некоторый список "дефектов" мест.

Я получаю их в словарь дефектов и местоположений (расположение дефектов [имя файла] [строка] = данные о местоположении (...)

Вот как я поступил:

internal class MyDefectTagger : ITagger<MyDefectTag>
{
    private IClassifier m_classifier;
    private ITextBuffer m_buffer;

    internal MyDefectTagger(IClassifier classifier, ITextBuffer buffer)
    {
        m_classifier = classifier;
        m_buffer = buffer;
    }

    IEnumerable<ITagSpan<MyDefectTag>>
        ITagger<MyDefectTag>.GetTags(NormalizedSnapshotSpanCollection spans)
    {
        if (MyModel.Instance == null || MyModel.Instance.defectsLocation == null)
        {
            yield return null;
        }

        var filename = GetFileName(m_buffer);

        if (!MyModel.Instance.defectsLocation.ContainsKey(filename))
        {
            yield return null;
        }

        foreach (SnapshotSpan span in spans)
        {
            ITextSnapshot textSnapshot = span.Snapshot;

            foreach (ITextSnapshotLine textSnapshotLine in textSnapshot.Lines)
            {
                var line = textSnapshotLine.LineNumber + 1; // Lines start at 1 in VS Editor

                if (MyModel.Instance.defectsLocation[filename].ContainsKey(line) &&
                    !MyModel.Instance.defectsLocation[filename][line].rendered)
                {
                    var rendered = MyModel.Instance.defectsLocation[filename][line].rendered;
                    yield return new TagSpan<MyDefectTag>(
                        new SnapshotSpan(textSnapshotLine.Start, 0),
                        new MyDefectTag()
                    );
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...