Skip to content

Collection type narrowing: all()/any() guard-based narrowing #110

@tmteam

Description

@tmteam

Описание

Расширение type narrowing для коллекций. Сейчас compact() / filterNotNull() работают (удаляют none элементы и сужают тип T?[] → T[]). Но guard-based narrowing через all()/any() не реализован.

Желаемое поведение

arr:int?[] = [1, 2, 3]

// all() guard: если все элементы non-none, массив narrowed в then-branch
y = if(arr.all(rule it != none)) arr.map(rule it + 1) else []
// → y = [2, 3, 4]

// any() НЕ narrowing: any() не гарантирует что ВСЕ элементы non-none
y = if(arr.any(rule it != none)) arr.map(rule it + 1) else []
// → type error (arr всё ещё int?[])

Текущее поведение

arr.all(rule it != none) возвращает Bool, но NarrowingAnalyzer не распознаёт этот паттерн как narrowing guard. Элементы массива остаются T? в then-branch.

Что уже работает

  • arr.filterNotNull() / arr.compact() — runtime фильтрация + type narrowing T?[] → T[]
  • Scalar narrowing: if(x != none) x + 1 — работает
  • Multi-elif progressive narrowing: if(x == none) ... if(x > 0) ... — работает

Технические заметки

  • NarrowingAnalyzer нужно расширить для распознавания arr.all(rule it != none) паттерна
  • Narrowing должен применяться к ТИПУ ЭЛЕМЕНТОВ массива, не к самому массиву
  • any() НЕ должен narrowing (не все элементы гарантированно non-none)
  • Тесты были написаны и удалены (21 тест AllAny + доп. тесты) — см. git history для reference

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions