Forge
markdown551a3611
1# Source generators и `roslyn_get_diagnostics` (Community Toolkit MVVM и др.)
2
3## Статус
4
5В текущей версии RoslynMcp конвейёр в **`ServiceLayer/GetDiagnostics.cs`** учитывает source generators (см. раздел «Реализация» ниже). Ниже — **почему** это было нужно и что делать, если рассогласование всё же проявится.
6
7## Симптом (исторический / краевой случай)
8
9Раньше по файлам, которые ссылаются на **члены, сгенерированные** Roslyn source generators (например `[ObservableProperty]` / `[RelayCommand]` в **CommunityToolkit.Mvvm**), `roslyn_get_diagnostics` мог выдавать **ложные** ошибки вроде:
10
11`CS1061: 'MainWindowViewModel' does not contain a definition for 'UiMode'…`
12
13при том что `dotnet build` того же проекта проходил.
14
15## Почему так бывает (модель Roslyn)
16
17- Сгенерированные деревья не входят в `Project.Documents`; их нужно получать через `Project.GetSourceGeneratedDocumentsAsync` (см. [документацию API](https://learn.microsoft.com/dotnet/api/microsoft.codeanalysis.project.getsourcegenerateddocumentsasync)).
18- После вызова генераторов обновляется **`Workspace.CurrentSolution`**. Старый снимок `Project` остаётся **без** сгенерированных синтаксических деревьев; компиляция и семантическая модель должны браться из **актуального** решения (`workspace.CurrentSolution.GetProject(projectId)` и далее `GetCompilationAsync` / `GetSemanticModelAsync`).
19- Загрузка solution через `MSBuildWorkspace` должна быть согласована с установленным SDK: пакеты **`Microsoft.CodeAnalysis.*` / `Microsoft.CodeAnalysis.Workspaces.MSBuild`** (в RoslynMcp — **5.3.0**) выровнены под **.NET 10 / SDK 10**; устаревший Workspaces.MSBuild мог давать компиляцию без корректного конвейёра source generators для целевых проектов.
20- Для MSBuild: те же глобальные свойства, что передаёт любой вызов `MSBuildWorkspace` в RoslynMcp — см. **`ServiceLayer/RoslynMcpWorkspaceProperties.cs`** (`DesignTimeBuild=false`, `SkipCompilerExecution=false`, `RoslynMcpWorkspace=true`). Регистрация **`Microsoft.Build.Locator`** до открытия workspace — в `Program.cs`.
21
22## Реализация в RoslynMcp
23
24`ServiceLayer/GetDiagnostics.cs`: после `GetSourceGeneratedDocumentsAsync` проект перезапрашивается из `workspace.CurrentSolution`, затем строится `Compilation` и диагностики.
25
26## Если вывод всё же противоречит `dotnet build`
27
28Ориентироваться на результат сборки (редкий краевой случай после правок конвейёра).
29
30## Опционально в целевом приложении (отладка генераторов)
31
32В `.csproj` можно включить запись сгенерированных файлов на диск (удобно людям, не заменяет корректную интеграцию в workspace):
33
34```xml
35<PropertyGroup>
36 <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
37 <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)Generated</CompilerGeneratedFilesOutputPath>
38</PropertyGroup>
39```
40
View only · write via MCP/CIDE