May 17, 2026
Kestrel Internal 0.15
Kestrel 0.15 (Internal)
Kestrel 0.15 is the biggest update to Kestrel so far. A major goal for this version was to write a Language Server, so that kestrel errors and suggestions would pop up in your IDE. Upon inspection of the code, this would have been a huge refactor. So I ended up rewriting the entire thing with a better architecture. There were very few features added in this version, but a lot of bugfixes, stdlib work, and infrastructure, including web servers was enabled by it. 0.15 was supposed to be the first preview releasae, but issues with the memory model deferred that to 0.16.
Features
Compiler Rewrite
The compiler was rewritten from a single-pass architecture to a query-driven system based on hECS (hierarchical Entity Component System). This enables incremental compilation, lazy evaluation of derived facts, and the IDE support that the old architecture couldn't provide.
Key changes:
- Parser rewrite with error recovery for incomplete code
- Deferred type inference — method calls, member access, and overload resolution are now handled by the constraint solver instead of during name binding
- Incremental compilation via dependency-tracked queries
HirTy::SelfType—Selfin protocol contexts is now a first-class HIR type, fixing a class of codegen bugs with associated types
Language Server
A language server ships with the compiler, providing hover, go-to-definition, completion, references, rename, document symbols, and entity-aware semantic tokens. It shares the incremental query system, so it responds to edits without reparsing the project.
Standard Library
The standard library was rewritten with a consistent naming convention and expanded collections (Deque, Heap), a rebuilt Array with views and eager transforms, a string rewrite with multiline literals and interpolation, and /// doc comments across public APIs.
Diagnostics
New analyzers for conformance completeness (E454/E455), extension conflicts (E411/E412), extension validation (E452/E453), closure parameter inference (E606), default parameter ordering, and type annotation resolution. Diagnostic codes were renamed from KSxxx to Exxx.
- Doc Comments
Tooling
- Flock — Kestrel's package manager, with a registry on the website
- Jessup — version manager for Kestrel compiler installations
- VS Code extension — syntax highlighting and full LSP integration
Bugfixes
- Fixed overload resolution not considering labels, only arity and types
- Fixed literal type defaults not narrowing to the expected type (e.g.
let x: UInt8 = 42defaulting toInt64) - Fixed
Boolvalues not being loaded from aggregate pointers before branch comparison - Fixed enum switch discriminants generated with the wrong width, causing all arms to fall through
- Fixed extern C functions receiving struct pointers instead of scalar values
- Fixed extension where clause constraints not being enforced during member resolution
- Fixed
Self.Itemresolution in extensions not falling back through the extension target - Fixed protocol extension method dispatch not discovering methods from generic extensions
- Fixed dead-code analyzer false positives after
whileloops - Fixed over 110 stdlib correctness issues after the naming convention migration