Forge
markdowndeeb25a2
1# ADR 0152: Virtual Spacing для глифов control-flow в редакторе
2
3**Статус:** Accepted · Implemented
4**Дата:** 2026-05-27
5
6## Связанные ADR
7
8| ADR | Роль |
9|-----|------|
10| [0053](0053-semantic-map-control-flow-pfd.md) | PFD / карта намерений, глифы CF |
11| [0151](0151-control-flow-subgraph-intent-vs-detailed-grain.md) | Subgraph под курсором |
12| [0085](0085-editor-inline-hud.md) | Inline HUD редактора |
13
14## Проблема
15
16Глифы control-flow в gutter редактора рисовались `IBackgroundRenderer` по `rect.Left` строки кода — **поверх** первых символов (`try`, `process`, цифры легенды). Это ломает читаемость и не совпадает с ожиданием «полосы намерения» слева от текста.
17
18## Решение
19
20**Virtual Spacing:** при активной карте CF для текущего `.cs` (тот же якорь, что subgraph) в начале **каждой** визуальной строки вставляется элемент с `DocumentLength = 0` и фиксированной визуальной шириной (`ControlFlowVirtualSpacingElementGenerator`, по аналогии с inlay). Текст и каретка сдвигаются вправо; узлы рисуются в центре полосы (`ControlFlowEditorNodePainter` — заливки/фигуры как на мини-карте Skia, палитра `CockpitPrimitivesPalette.CodeNavigationMap`).
21
22Условие включения совпадает с отображением gutter-глифов: `controlFlow` + непустая сцена subgraph + путь файла = якорь CF.
23
24Константы полосы: `Services/EditorControlFlowVirtualSpacing.cs`.
25
26## Последствия
27
28- При смене уровня карты / якоря / сцены — `TextView.Redraw()` (уже было для CF).
29- Ширина полосы фиксирована (не из TOML в v1); при необходимости — настройка позже.
30- Не затрагивает wire subgraph / MCP — только редактор.
31
32## Отклонённые альтернативы
33
34- **Только сдвинуть отрисовку в margin 50px:** номера строк и CF конкурируют; текст не сдвигается, каретка расходится с глифом на отступах.
35- **Пробелы в документе:** портят копирование и offset-based API.
36
View only · write via MCP/CIDE