Видите ли вы первый технический вопрос про Roslyn
Что проверяют
Формулировка звучит неловко, но по сути это вход в тему: знаете ли вы, что такое Roslyn, и работали ли с ним руками. Дальше спрашивают, чем анализатор отличается от генератора кода и чем синтаксическое дерево отличается от семантической модели.
Как отвечать
Roslyn это .NET Compiler Platform: компиляторы C# и Visual Basic с открытым кодом, которые отдают свои внутренности через API. На нём построены подсказки и рефакторинги в Visual Studio.
- синтаксис:
SyntaxTree,SyntaxNode,SyntaxToken,SyntaxTrivia. Дерево неизменяемое и хранит всё, включая пробелы и комментарии; - семантика:
CompilationиSemanticModelотвечают, какой тип у выражения и на какой символ (ISymbol) ссылается имя. По одному синтаксису не понять,Fooэто класс или метод из другой сборки; - анализаторы: наследник
DiagnosticAnalyzerс атрибутом[DiagnosticAnalyzer(LanguageNames.CSharp)], который вInitializeрегистрирует действия вродеRegisterSyntaxNodeAction. В пару к нему пишутCodeFixProviderс исправлением; - генераторы:
IIncrementalGeneratorс атрибутом[Generator]добавляет код во время компиляции. СтарыйISourceGeneratorустарел, потому что тормозил IDE. Примеры из самого .NET:[GeneratedRegex],[LoggerMessage], контекст System.Text.Json.
Анализаторы поставляются NuGet-пакетом, работают и в IDE, и в dotnet build, а строгость правил задаётся в .editorconfig строкой вида dotnet_diagnostic.CA1822.severity = warning.
Если руками не работали, так и скажите, но покажите, где Roslyn уже встречался: предупреждения CA и IDE, StyleCop, генераторы в вашем проекте.
Где спотыкаются
Говорят, что Roslyn компилирует C# в машинный код. Он выдаёт IL, а в машинный код его превращает JIT или AOT.
Пытаются генератором поменять уже написанный код. Генератор умеет только добавлять новые файлы, поэтому такие задачи решают через partial классы и методы.
Забывают про скорость анализатора: не вызывают context.EnableConcurrentExecution(), не отключают разбор сгенерированного кода через ConfigureGeneratedCodeAnalysis, дёргают SemanticModel на каждом узле. В большом решении IDE начинает тормозить.