Как я перенёс сборку лексера в compile-time
#dotnet #roslyn #sourcegenerators
✅
Один source generator может передать результат другому через post-initialization output — эта фаза добавляет исходники в компиляцию до запуска обычных генераторов, поэтому [GeneratedRegex] видит сгенерированную константу.
📈
Описываешь токен один раз, регулярка собирается сама — без ручного копирования строки между файлами и теста на «забыл скопировать».
⚙️ Порядок альтернатив в регулярке — это правило языка: FloatLiteral с приоритетом 2 должен идти раньше IntegerLiteral с приоритетом 3, иначе `12.5` распадётся на `12` и точку. Отдельного maximal munch нет.
🐛 Генератор падал с CS8032 при `dotnet build /p:UseSharedCompilation=false` (так собирает BenchmarkDotNet). Лечится заменой ProjectReference с OutputItemType="Analyzer" на подключение исходников через Compile — но тогда определения токенов обязаны собираться и под netstandard2.0.
Читаем:
В статье — разбор, как через static abstract member интерфейса отдать регулярку из Infrastructure в Domain без разворота зависимостей слоёв, плюс бенчмарки Compiled vs Generated и трассировка лексера через флаг --dump.
https://habr.com/ru/articles/1087280/
@aStateOfNet
#dotnet #roslyn #sourcegenerators
✅
Один source generator может передать результат другому через post-initialization output — эта фаза добавляет исходники в компиляцию до запуска обычных генераторов, поэтому [GeneratedRegex] видит сгенерированную константу.
📈
Описываешь токен один раз, регулярка собирается сама — без ручного копирования строки между файлами и теста на «забыл скопировать».
⚙️ Порядок альтернатив в регулярке — это правило языка: FloatLiteral с приоритетом 2 должен идти раньше IntegerLiteral с приоритетом 3, иначе `12.5` распадётся на `12` и точку. Отдельного maximal munch нет.
🐛 Генератор падал с CS8032 при `dotnet build /p:UseSharedCompilation=false` (так собирает BenchmarkDotNet). Лечится заменой ProjectReference с OutputItemType="Analyzer" на подключение исходников через Compile — но тогда определения токенов обязаны собираться и под netstandard2.0.
Читаем:
В статье — разбор, как через static abstract member интерфейса отдать регулярку из Infrastructure в Domain без разворота зависимостей слоёв, плюс бенчмарки Compiled vs Generated и трассировка лексера через флаг --dump.
https://habr.com/ru/articles/1087280/
@aStateOfNet