Skip to content

iyi 0.5.0

Choose a tag to compare

@sdogruyol sdogruyol released this 29 Aug 17:41
· 2883 commits to master since this release

The language got its editor, and a panic stopped being a process.
0.4.0 made iyi concurrent and machine-readable; this release makes it a
language you can live in.

iyi lsp grew from a first session into a server that stands
feature-for-feature beside gopls, and every capability is asserted, not
narrated:

diagnostics pushed on every keystroke from a real compile — 36 ms p50 / 55 ms p95 across the sample corpus — and pulled on request, one file or the whole workspace: an agent asks a question instead of sitting on a subscription
completion fuzzy-ranked, and it writes the import/using pair it knows you forgot — in a buffer that has never compiled, because pub is a parse-time fact
references / rename workspace-wide off the typed graph: a caller in a file nobody opened is found, edited, and named — and a rename reaches the using line that selects the old name
moving a file is renaming the module (IV.6): one WorkspaceEdit rewrites the header and every consumer before the rename lands
the call graph call hierarchy both ways, trait implementations, type hierarchy, and a code lens that runs the module over the wire and returns what it printed
highlighting semantic tokens from the lexer — no editor needs a grammar for .iyi — with deltas, and an 8,000-token word-boundary sweep in CI so a colored word is a whole word
the transport forgives garbage frames, non-JSON and non-UTF-8 bodies; a rebuilt binary under a running session no longer lobotomises it; a cancel overtakes queued work and a typing burst coalesces into one compile

editors/ makes it installable: a three-file VS Code client (a
deliberately minimal grammar paints the first frame; the server's tokens
are the truth and override it), with one-stanza configs for Neovim,
Helix and Sublime beside it. Five gates hold the server on every push:
a 49-step scripted session, per-verb latency budgets, the word-boundary
sweep, a transport soak, and the doc-numbers sweep that keeps every
stated figure honest.

And panics landed the way III.1.4 always wanted them: a panic kills
the task, not the process — and the unwind owns no unwinder.
defer
registers its cleanup on a per-task list the panic path walks, so the
promise holds with no landing pads, no personality function, no libgcc:
the dependency floor never moved, and a defer is priced at ~16 ns,
budgeted in CI. A panicking task drains its defers innermost-first, its
group cancels the siblings and re-raises once in the owner; main exits 1
after its own drain; an arithmetic overflow dies at the same boundary;
.or_panic became a real panic by its lowering not changing at all.

The AI_FIRST menu this cycle opened with closed 8-for-8, iyi vet
closed III.8's table the way the row was written ("a verb, not new
analysis"), and the rebuild benchmark ran and corrected its own
prediction — the honest finding is recorded in SPEC.md rather than
tuned away.

.iyimod format is unchanged at 41. Released artifacts carry the
version alone, so a 0.4.0 artifact is rejected by a 0.5.0 build and
rebuilt, never migrated.

The tarball is relocatable: extract, put bin on PATH, and
iyi run, iyi lsp, iyi vet work with nothing to configure.