Pull to refresh

Comments 5

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

Да, дебажили тестами. Генератор является вообще говоря обычной библиотекой с таргетом на .NET Standard 2.0, если на него сослаться классическим способом, а не как на анализатор (ProjectReference без OutputItemType="Analyzer").


Поэтому весь интересный код можно вынести в internal-объекты, расставить InternalsVisibleTo для проектов с тестами, и обложить эти объекты с интересным кодом тестами, чтоб в нетестируемом коде было нечему ломаться. Потом уже в JetBrains Rider гулять по коду с дебаггером, разбираясь, что и где пошло не так. Тесты, кстати, сейчас лежат тут: https://github.com/AvaloniaUI/Avalonia.NameGenerator/tree/main/src/Avalonia.NameGenerator.Tests (вообще стараюсь избегать ссылок на этот репозиторий в материале, потому что он скоро уедет в главный репозиторий Avalonia)


А, ещё можно делать context.ReportDiagnostic.

А еще можно добавить MSBuild свойство GenerateTypedNameReferences(для самых ленивых) и автоматически генерировать код для всех нужных классов.

P.S. Добавьте MSBuild свойство
<DevelopmentDependency>true</DevelopmentDependency>
для вашего NuGet проекта, таким образом автоматически выставляются приватные ассеты при установке.
Ну и по вкусу
<NoWarn>$(NoWarn);NU5128</NoWarn>
чтобы избежать предупреждения об отсутствии библиотек в папке lib при генерации пакета.
Спасибо за статью, один непонятный для меня момент:
почему мы добавляем исходных код атрибута в генераторе?
т.е непонятно как программист будет помечать этим атрибутом, если класс такого атрибута появится только на момент анализа кода.

Для добавления атрибута с помощью генератора есть две причины. С одной стороны, мы должны ссылаться на генератор по-особенному, как на анализатор — если бы мы решили атрибут не генерировать, нам бы пришлось собирать два пакета — один был бы собственно генератором, а другой — содержал бы атрибут. Такой паттерн использовался, например, в библиотеке Pharmacist ещё до появления .NET 5 source generators. С другой стороны, сами генераторы исходного кода довольно тесно заинтегрированы в .NET CLI, Visual Studio, JetBrains Rider, в результате генерация происходит при любом изменении исходного файла. Выглядит это следующим образом:



Добавлю эту гифку в статью для контекста, спасибо за вопрос!

Sign up to leave a comment.

Articles