changelog: 2026-04-30 digest (initial)
This commit is contained in:
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"source_repo": "phoenixframework/phoenix",
|
"source_repo": "elixir-lang/elixir",
|
||||||
"last_digest_sha": "7dc2de3049eb6c3582942040ceb5d53389207ae9",
|
"last_digest_sha": "55a3899e75efd579723da1927500b82f206329e4",
|
||||||
"last_digest_at": "2026-04-30T14:01:00Z",
|
"last_digest_at": "2026-04-30T14:01:00Z",
|
||||||
"last_refresh_sha": null,
|
"last_refresh_sha": null,
|
||||||
"last_refresh_at": null
|
"last_refresh_at": null
|
||||||
|
|||||||
+35
-18
@@ -1,27 +1,44 @@
|
|||||||
# Phoenix Digest — 2026-04-30
|
# Elixir Digest — 2026-04-30
|
||||||
|
|
||||||
## Bug Fixes
|
## Type System / Gradual Typing
|
||||||
|
|
||||||
### #6667 — Fix live_title having line breaks (lubien)
|
### #15324 — Fix invalid type inference on size compare in guards
|
||||||
|
- **Author:** lukaszsamson
|
||||||
|
- **Merged:** 2026-04-29
|
||||||
|
- Mirror expressions like `tuple_size(x) >= 2` and `2 <= tuple_size(x)` were producing different type inferences.
|
||||||
|
- Fix introduces `mirror_order/1` helper that correctly flips comparison operators when operands are swapped.
|
||||||
|
- Impact: Guards with size on the right now correctly infer the same type as left-sided equivalents.
|
||||||
|
|
||||||
**Merged:** 2026-04-29T17:20:23Z
|
### #15322 — Fix map union optimization for open maps
|
||||||
|
- **Author:** gldubc (Guillaume Duboc)
|
||||||
|
- **Merged:** 2026-04-29
|
||||||
|
- Optimizer subtype shortcut incorrectly concluded open map contained by closed map when field types matched.
|
||||||
|
- Open maps can have extra keys — fix rejects shortcut on tag (open/closed) mismatch.
|
||||||
|
- Impact: Fixes false type narrowing with unions of open and closed map types.
|
||||||
|
|
||||||
The `phx.new` generator template had `<.live_title>` content on separate lines.
|
### #15319 — Fix map difference union optimization
|
||||||
The HEEx formatter injected literal newlines into the rendered `<title>` tag,
|
- **Author:** gldubc (Guillaume Duboc)
|
||||||
which appeared in link previews on Discord, WhatsApp, and Telegram.
|
- **Merged:** 2026-04-28
|
||||||
|
- Disabled `:union` case of single-key open-map difference optimization.
|
||||||
|
- Could build invalid union literals causing double negation to leave phantom empty maps.
|
||||||
|
|
||||||
**Fix:** Collapse the template to a single line with `phx-no-format`, preventing
|
## Core / Runtime
|
||||||
the formatter from re-introducing whitespace.
|
|
||||||
|
|
||||||
**Impact:** Every new Phoenix 1.8 project shipped this cosmetic bug. Users had
|
### #15306 — Fix reentrancy of Code.eval_*
|
||||||
to manually add `phx-no-format` as a workaround.
|
- **Author:** lukaszsamson
|
||||||
|
- **Merged:** 2026-04-28
|
||||||
|
- Nested `Code.eval_string` clobbered outer eval's `dbg_callback` and `?elixir_eval_env` in process dict.
|
||||||
|
- Fix: save/restore pattern (save before, restore in `after` block).
|
||||||
|
- Discussion: Jonatan Kłosko caught test wasn't testing nested eval; José simplified implementation.
|
||||||
|
- Lesson: Process dictionary as implicit state = reentrancy bugs. Deliberate trade-off for version decoupling.
|
||||||
|
|
||||||
**Discussion:** Issue reported and PR landed same day. SteffenDE (core team)
|
### #15316 — Consistently return path as binary in relative_to_cwd
|
||||||
requested the PR, lubien delivered within the hour.
|
- **Author:** lukaszsamson
|
||||||
|
- **Merged:** 2026-04-28
|
||||||
|
- `Path.relative_to_cwd/1` could return chardata on `:file.get_cwd` failure.
|
||||||
|
- All code paths now normalize to binary.
|
||||||
|
|
||||||
- [PR #6667](https://github.com/phoenixframework/phoenix/pull/6667)
|
## Patterns to Extract
|
||||||
- [Issue #6666](https://github.com/phoenixframework/phoenix/issues/6666)
|
|
||||||
|
|
||||||
---
|
- **Process dict save/restore for reentrancy** (#15306): When using process dict as implicit state, always save/restore in try/after to handle reentrancy. The Elixir team chose this over closures to avoid coupling eval to specific Elixir versions.
|
||||||
|
- **Set-theoretic type system edge cases** (#15322, #15319): Open vs closed map distinction is subtle in BDD-based type representations. Subtype checks must respect structural tags, not just field types.
|
||||||
*Light day. One quick community fix.*
|
|
||||||
|
|||||||
Reference in New Issue
Block a user