Расширение Visual Studio: как перехватывать / изменять / удалять сообщения об ошибках сборки в списке ошибок?

#visual-studio #hook #visual-studio-extensions #visual-studio-addins #vsix

#visual-studio #hook #visual-studio-extensions #visual-studio-addins #vsix

Вопрос:

Я работаю над расширением Visual Studio, которое будет «очищать» сообщения об ошибках компиляции, чтобы их было легче читать.

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

До сих пор мне не удалось найти способ сделать это. Вот мои выводы:

  • Все IVsTaskItems в SVsErrorList доступны только для чтения, поэтому я не могу редактировать их напрямую.
  • Я также не могу удалить IVsTaskItems по той же причине (и, следовательно, не могу заменить их своими).
  • Я могу добавить свой собственный текст в панель окна вывода сборки, но я не могу изменить существующий текст, чтобы отредактировать сообщения об ошибках, прежде чем Visual Studio их проанализирует.

Есть ли какой-либо другой способ достичь этой цели? Есть ли в расширении способ:

  • как перехватить вызов, который VS выполняет внутренне, чтобы добавить сообщение об ошибке в список ошибок и изменить его до его обработки?
  • чтобы перехватить выходные данные процесса сборки и изменить их до того, как они будут обработаны VS?
  • для достижения этого с помощью каких-либо других средств?

Комментарии:

1. Вы определенно можете что-то сделать, потому что я уже использую расширение, которое подключается к процессу сборки и изменяет цвет окна вывода в зависимости от того, выполняется сборка проекта или сбой. Однако понятия не имею, как это делается. VSColorOutput: visualstudiogallery.msdn.microsoft.com /…

2. @demoncodemonkey Окно вывода представляет собой обычный текстовый вид с отключенным редактированием. Расширение, на которое вы ссылаетесь, является просто подсветкой синтаксиса, но не имеет никакого контроля над фактическим содержимым окна.

Ответ №1:

Правильным способом сделать это было бы либо изменить выходные данные вашего процесса компиляции, либо изменить способ, которым ваш проект system и / или .targets file передает информацию от компилятора в IDE. Если у вас нет контроля ни над компилятором, ни над системой проекта, то это было бы сложной или невыполнимой задачей.

  1. Отображаемые задачи реализуются IVsTaskItem , и этот интерфейс фактически реализуется клиентским кодом, поэтому нет никаких гарантий, что элемент задачи предоставит возможность изменять какие-либо из его значений.
  2. IVsTaskList2 Интерфейс добавляет метод RemoveTasks , но для этого требуется, чтобы у вас был файл cookie поставщика, который был возвращен при регистрации поставщика (и нет способа получить это).

Комментарии:

1. К сожалению, я хотел бы, чтобы это расширение не зависело от того, как информация передается в IDE (например, для поддержки произвольных компиляторов, а также внешних инструментов сборки). Вот почему я предполагаю, что единственный способ сделать это — использовать какой-то обман перехвата на основе перехвата. (PS: спасибо за вашу работу над ANTLR4; я использовал его с большим успехом).

2. Да, это просто не поддерживается. И нет ничего, что вы могли бы «зацепить» в любом смысле этого слова…

3. Спасибо за подтверждение, Джейсон.