Я хотел бы создать теги в редакторе Visual Studio для вставки всевозможных глифов, украшений, выделения текста и т. д. в зависимости от местоположения строки/столбца/длины в коде.
Я внимательно прочитал страницы с прохождением документации (https://docs.microsoft.com/en-us/visualstudio/extensibility/walkthrough-creating-a-margin-glyph?view=vs-2017 и связанные страницы). Хотя API немного сложен и труден для понимания, кажется, что API очень ориентирован на предоставление средств для анализа кода: он может разделить ваш код на интервалы, с классификациями и т. д.
Однако у меня есть «обратная» потребность: у меня уже есть анализ, выполненный моим внешним механизмом анализа. И у меня уже есть набор результатов для отображения в редакторе со строкой/столбцом/длиной для каждого из них. Нравиться:
функция "foo", расположенная в строке 345, столбце 1, длине 3 и других полях, содержащих отображаемую информацию,
переменная «my_var», расположенная в строке 349, столбце 13, длина 6 и другие поля, содержащие информацию для отображения,
Можно ли создавать теги в редакторе Visual Studio непосредственно на основе их местоположения строки/столбца/длины? Любой намек, любой указатель на более подробную документацию или учебник будет принят с благодарностью.
Ссылка Ланса была очень полезна для понимания другого способа создания тегов, отличного от примера документации MS.
Действительно, я не анализирую текст, содержащийся в спэнах, анализ уже сделан снаружи. Я получаю некоторый список мест "дефектов".
Я помещаю их в словарь дефектовLocation (defectsLocation[имя файла][строка] = данные о местоположении (...)
Вот что я сделал:
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()
);
}
}
}
}
}
Возможно, вам поможет эта ссылка.