Roslyn Analyzers запускаются недостаточно часто

Я пишу свои первые анализаторы Roslyn. Я в основном следовал руководству https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/special-issue/csharp-and-visual-basic-use-roslyn-to-write-a-live-code-analyzer- для вашего API, а затем добавил второй класс анализатора, который должен быть анализом, не зависящим от языка, подобно тому, что представлено в https://www.meziantou.net/writing-a-language-agnostic-roslyn-analyzer-using-ioperation.htm.

Итак, у меня есть один класс анализатора, который инициализирует себя с помощью

context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);

и второй, который использует

context.RegisterOperationAction(AnalyzeConversionOperation, OperationKind.Conversion);
context.RegisterOperationAction(AnalyzeInvocationOperation, OperationKind.Invocation);

Чтобы протестировать мои анализаторы, я установил сгенерированный проект .Vsix в качестве запускаемого проекта, и, нажав F5, я перехожу к отдельному экземпляру Visual Studio, где я пишу код и хочу посмотреть, работают ли мои анализаторы должным образом. И я устанавливаю точки останова в начале действий моего анализатора — AnalyzeSymbol, AnalyzeConversionOperation и AnalyzeInvocationOperation в исходном экземпляре VS.

Действия анализатора вызываются не так, как я ожидал. На самом деле они вообще не вызываются, так как я пишу код для анализа. Только если я ставлю курсор на какое-то имя типа (которое связано с действием SymbolKind.NamedType), и нажимаю на появившуюся лампочку, получаю вызовы - и не только на действие AnalyzeSymbol, но и AnalyzeConversionOperation и AnalyzeInvocationOperation вызываются по мере необходимости для различных операций в коде.

Итак, все действия, которые вызываются, в порядке, но они не вызываются, когда я этого хочу. Я ожидаю, что они будут вызываться по мере необходимости - в основном почти постоянно, когда я редактирую код. Или, по крайней мере, при сборке или какой-либо явной команде «Анализировать сейчас». Но я не знаю ничего подобного. Единственный способ, который я нашел, чтобы вызвать их, - это способ, который я описал. Это не кажется мне правильным.

Я пытался погуглить, но не смог найти решение; или возможно у меня какое-то неправильное представление, и он должен работать по-другому?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Анализаторы закончились. Поэтому я думаю, что ожидается, что вы не столкнетесь с точками останова, но на самом деле сработают эти строки.

У вас есть три варианта:

  • Отключить запущенные вне процесса анализаторы.

    image

  • Прикрепите процесс ServiceHub.RoslynCodeAnalysisService к отладчику.

  • Отладка с помощью модульного теста. Это мой предпочтительный подход.

Спасибо, но я думаю, что вы неправильно поняли. Моя проблема не в отладке. Я могу отлаживать просто отлично. Моя проблема в том, что анализатор не запускается, пока я не выполню действие, описанное в моем вопросе. Они ведут себя так с отладчиком или без него. Та часть, где я описал поведение в отладчике, просто предоставляет больше информации о том, что происходит внутри.

ZbynekZ 25.03.2022 15:15

Без отладчика, как вы узнали, что обратные вызовы не вызываются. Вы сообщаете о диагностике, которую не видите при вводе? Было бы полезнее, если бы вы предоставили репродукционный проект.

Youssef13 25.03.2022 19:55

Проблемы возникают уже с проектом, с которого я начал, то есть docs.microsoft.com/en-us/archive/msdn-magazine/2014/…. Мои дальнейшие модификации проекта только делают более очевидным то, что происходит. Без отладчика я вижу, что анализатор не выдает никаких предупреждений, пока я не сделаю описанные «специальные» шаги пользовательского интерфейса. С отладчиком эффекты в VS такие же, и я вижу, что "действие" анализатора тоже только вызывается в этот момент.

ZbynekZ 27.03.2022 09:00

Я нашел проблему. В конце концов, я принимаю этот ответ, потому что он правильный, за исключением того, что в нем не упоминались некоторые важные «глюки», которые меня так сильно сбивали с толку: 1) По крайней мере, в VS2022 поведение по умолчанию отличается от того, что указано в статье Microsoft. Я сослался на описание: запуск анализаторов вне процесса — это поведение по умолчанию, поэтому без его отключения отладка, описанная в статье, работает плохо. Но, что более важно, 2) если анализаторы настроены на запуск в отдельном процессе, они ВСЕ ЕЩЕ иногда запускаются в процессе Visual Studio. Они работают в контексте

ZbynekZ 03.04.2022 11:40

... по крайней мере, с помощью этой "лампочки". И именно это вызвало путаницу, потому что в анализаторах можно ставить точки останова и отладка на этом останавливается — но так как это отладка в процессе VS, то он вызывается не так, как положено, т.е. в основном после каждого изменения кода, влияющего на анализатор.

ZbynekZ 03.04.2022 11:43

Другие вопросы по теме