| 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 | |