Skip to content

Latest commit

 

History

History
115 lines (81 loc) · 5.65 KB

File metadata and controls

115 lines (81 loc) · 5.65 KB

Пути и identity в MSRA

В MSRA путь внутри [...] нельзя сводить только к строке вида a.b.c. Парсер сравнивает не просто текст, а семантическую identity пути: какие сегменты являются системными маркерами слота, а какие - обычными пользовательскими именами.

Главная идея:

  • quoted сегмент - это буквальная, явная custom-запись имени.
  • unquoted сегмент может быть системным только в том слоте, где эта позиция зарезервирована.
  • если слот ожидает custom-идентификатор, то quoted и unquoted вариант с одним и тем же текстом обычно относятся к одному и тому же пути.
  • если слот ожидает system-branch, то quoted и unquoted формы могут означать разные пути или даже сделать запись невалидной.

Как устроены основные ветки

app
├─ warmup
├─ defaults
│  └─ func
│     └─ headers
├─ variables
├─ prefixes
├─ regexes
├─ groups
└─ func
   └─ <uid>
      ├─ input
      ├─ body
      ├─ headers
      ├─ url
      │  └─ params
      ├─ examples
      │  └─ <name>
      └─ extractor

app.defaults.func.headers хранит общие defaults для request policy всех функций. Локальные app.func.<id>.headers могут их переопределять.

Из этого дерева важно помнить одно: смысл сегмента определяется не только его текстом, но и слотом, в котором он стоит.

Когда это один и тот же путь

Если слот ожидает custom-идентификатор, то кавычки не создают новый путь. Они только делают запись явной.

[app.func.A3A417]
[app.func."A3A417"]

Это один и тот же путь. Если оба заголовка встретятся в одном документе, парсер сообщит о дубликате.

То же самое относится к имени url в слоте идентификатора функции:

[app.func.url]
[app.func."url"]

Здесь url не открывает URL-ветку. В этой позиции это просто uid функции.

Когда путь меняется

После body правила уже другие. До первого системного url все элементы body считаются обычными пользовательскими item-ами. Как только в этой позиции встречается unquoted url, начинается системная ветка url.

[app.func.A3A417.body.VLOJENNOST.url]
[app.func.A3A417.body.VLOJENNOST."url"]

Это разные пути:

  • в первом случае url занимает системный слот;
  • во втором случае "url" остаётся literal/custom body item.

Именно поэтому эти заголовки относятся к разным таблицам.

Если нужен именно literal body item с именем url, его нужно писать в кавычках:

[app.func.A3A417.body."url"]

Где кавычки не спасают

Кавычки не превращают любой текст в допустимый путь. Они только помечают сегмент как literal/custom. Если в этом слоте требуется системный маркер, quoted-вариант может стать невалидным.

Например:

  • корни таблиц: app и msra допустимы, quoted root - нет;
  • в ветке app такие дети, как warmup, variables, prefixes, regexes, groups, func, должны идти без кавычек;
  • в ветке url unquoted params открывает namespace параметров, а quoted "params" уже не считается системным маркером и в этом слоте не подходит.

Как это влияет на диагностику и lookup

Эта семантическая identity используется для:

  • обнаружения дублированных таблиц;
  • проверки наличия родительских таблиц;
  • резолва ссылок;
  • навигации в language server.

То есть parser и analysis смотрят не только на сырой текст path.join("."), а на смысл сегментов в контексте слота.

Короткая памятка

Если хочешь понять, один ли это путь, проверь три вещи:

  1. Какой слот открыт.
  2. Это system-позиция или custom-позиция.
  3. Может ли quoted форма в этом слоте быть literal-именем, или там нужен именно системный маркер.

Если слот custom, то quoted и unquoted вариант обычно один и тот же путь. Если слот system, то quoted и unquoted формы могут расходиться, а quoted вариант может даже быть запрещен.