Описание
Расширение 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
Описание
Расширение type narrowing для коллекций. Сейчас
compact()/filterNotNull()работают (удаляют none элементы и сужают типT?[] → T[]). Но guard-based narrowing черезall()/any()не реализован.Желаемое поведение
Текущее поведение
arr.all(rule it != none)возвращает Bool, но NarrowingAnalyzer не распознаёт этот паттерн как narrowing guard. Элементы массива остаютсяT?в then-branch.Что уже работает
arr.filterNotNull()/arr.compact()— runtime фильтрация + type narrowingT?[] → T[]if(x != none) x + 1— работаетif(x == none) ... if(x > 0) ...— работаетТехнические заметки
arr.all(rule it != none)паттернаany()НЕ должен narrowing (не все элементы гарантированно non-none)