Комментарии 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
.
P.S. Добавьте MSBuild свойство
<DevelopmentDependency>true</DevelopmentDependency>
для вашего NuGet проекта, таким образом автоматически выставляются приватные ассеты при установке.Ну и по вкусу
<NoWarn>$(NoWarn);NU5128</NoWarn>
чтобы избежать предупреждения об отсутствии библиотек в папке lib при генерации пакета.почему мы добавляем исходных код атрибута в генераторе?
т.е непонятно как программист будет помечать этим атрибутом, если класс такого атрибута появится только на момент анализа кода.
Для добавления атрибута с помощью генератора есть две причины. С одной стороны, мы должны ссылаться на генератор по-особенному, как на анализатор — если бы мы решили атрибут не генерировать, нам бы пришлось собирать два пакета — один был бы собственно генератором, а другой — содержал бы атрибут. Такой паттерн использовался, например, в библиотеке Pharmacist ещё до появления .NET 5 source generators. С другой стороны, сами генераторы исходного кода довольно тесно заинтегрированы в .NET CLI, Visual Studio, JetBrains Rider, в результате генерация происходит при любом изменении исходного файла. Выглядит это следующим образом:
Добавлю эту гифку в статью для контекста, спасибо за вопрос!
Генерация типизированных ссылок на элементы управления Avalonia с атрибутом x:Name в XAML с помощью C# Source Generators