Roslyn: как отслеживать изменения?
От: dmitry_npi Россия  
Дата: 28.10.21 05:58
Оценка:
Всем привет. Допустим, я хочу написать расширение для Visual Studio, которое работает аналогично встроенному Class View — отображает список классов из .cs файлов в проектах солюшена.
Понятно, что при инициализации я могу пробежать по всем проектам, далее по файлам, найти в них все классы и построить список. Но как следить за изменениями?
Тот же Class View реагирует мгновенно, стоит только написать в исходнике слово class (даже без имени). Или удалить класс, или несколько. Стоит, например, в любом файле в любом классе добавить строчку "X y", как тут же отображается новое поле y типа X, даже если X не определен.

Как это делается? Есть ли какой-то высокоуровневый API для отслеживания именно классов? В SDK почему-то не нашёл никаких похожих API типа событий.

Вроде бы можно следить за файлами, затем изменившиеся файлы парсить, сравнивать с тем что есть, вычислять, что произошло (учитывать partial class) — добавление или удаление. Но это же очень громоздко и неэффективно. Есть ли путь короче?
Атмосферная музыка — www.aventuel.net
Re: Roslyn: как отслеживать изменения?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 28.10.21 10:54
Оценка: 88 (3)
Здравствуйте, dmitry_npi, Вы писали:

_>Как это делается? Есть ли какой-то высокоуровневый API для отслеживания именно классов? В SDK почему-то не нашёл никаких похожих API типа событий.

Прямо вот сам я такую задачу не решал, поэтому не могу быть на 100% уверенным что мои варианты рабочие (а проверить прямо сейчас просто нет времени).
Но вроде как оба должны работать:

Через CodeModel.
Это можно сказать legacy API в VisualStudio для работы с кодом (оно нейтрально к языку — примерно как CodeDOM).
Там есть такая штука CodeModelEvents. По идее эти события генерируются на любое изменение в модели кода и вам нужно будет просто получив событие сразу фильтровать по свойству Kind — поменялся класс или что-то иное.
Я правда не знаю, как будут генерироваться события, если поменяется, например, метод — сгенерируется только событие для метода или вся цепочка вверх (метод, класс, немспейс, ...)

Вот тут есть небольшой пример, как подписаться на эти события через DTE2.

Через Roslyn Workspace
В Workspace (это приблизительно аналог Solution) рослина есть события на изменения в этом Workspace.
Подписаться из VS на них можно, получив VisualStudioWorkspace
Опять-таки небольшая статья по работе с Roslyn Workspace, но там нет про события — тут уж вам самому копать.
Re[2]: Roslyn: как отслеживать изменения?
От: dmitry_npi Россия  
Дата: 28.10.21 12:33
Оценка:
Здравствуйте, Михаил Романов,

Спасибо огромное, Михаил!
Атмосферная музыка — www.aventuel.net
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.