Changelog
February 16, 2026 ยท View on GitHub
All notable changes between releases will be documented in this file.
The format is based on Keep a Changelog.
Unreleased
v0.14.0 - 2026-02-16
Fixed
- Fix absolute path interpolation starting with
/${failing to parse (#182, from @imxyy1soope1).
Breaking Changes
__curPosis now a distinct node type.__curPosis a Nix keyword that evaluates to an attribute set containing the file, line, and column where it appears. Lix documents this as a keyword. It was previously represented asNODE_IDENT, but is now parsed asNODE_CUR_POSwith a correspondingTOKEN_CUR_POStoken kind (from @3timeslazy).
v0.13.0 - 2026-01-29
Breaking Changes
-
Path types are now distinguished at the type level.
TOKEN_PATHandNODE_PATHhave been replaced with specific variants for each path type:TOKEN_PATH_ABS/NODE_PATH_ABS- absolute paths (/foo/bar)TOKEN_PATH_REL/NODE_PATH_REL- relative paths (./foo,../bar,foo/bar)TOKEN_PATH_HOME/NODE_PATH_HOME- home-relative paths (~/foo)TOKEN_PATH_SEARCH/NODE_PATH_SEARCH- search paths (<nixpkgs>)
The
ast::Exprenum now hasPathAbs,PathRel,PathHome, andPathSearchvariants instead of a singlePathvariant. SeeMIGRATING.mdfor upgrade guidance. -
Double slashes in paths are now syntax errors. Paths like
foo//barnow produceTOKEN_ERRORinstead of being parsed. -
The
parserandtokenizermodules are now private. Usernix::Root::parse()andrnix::tokenize()instead.
Added
-
Implement
FromStrforSyntaxKind(from @abhillman). -
Add
MIGRATING.mdwith upgrade guidance for breaking changes. -
Add
nix develop .#fuzzdevShell for running cargo-fuzz with nightly Rust.
Fixed
- Fix leading zero number parsing to match Nix behavior (from @hsjobeki).
Changed
- Update
rowanto 0.16. - Update
criterionto 0.8. - Update
expect-testto 1.5.1. - Add Clippy to CI and resolve all warnings.
v0.12.0 - 2025-01-09
- Add support for pipe operators
v0.11.0 - 2022-11-11
-
removes the
typesmodule and replaces it withast -
the
astmodules has better types and sum types -
removes
ParsedTypein favor ofExpr -
removes the
valuemodule. methods onValuego on the individual types. For example, string related methods go onast::Str -
parsechanged toRoot::parse -
NODE_OR_DEFAULTis removed -
NODE_KEY->NODE_ATTRPATH,NODE_KEY_VALUE->NODE_ATTRPATH_VALUE -
BinOp::IsSetis removed since it's actually not a normal binary operator. -
NODE_SELECTis flattened in favor ofNODE_ATTRPATHwhich consists of multiple Attrs, includinga.b.canda.b.c or expr -
a or bis Apply, not "OrDefault", which matches the result of Nix. Fixes #23 -
${is considered invalid at Expr places now, which matches the result of Nix. -
remove
TOKEN_DYNAMIC_STARTandTOKEN_DYNAMIC_END -
rowan 15.0
-
various other parsing fixes
v0.10.2 - 2022-06-14
v0.10.1 - 2021-12-06
Fixed
-
Trivia tokens (i.e.
,\r,\netc.) are no longer misplaced around path-expressions. This is a regression fromv0.10.0which would've brokennixpkgs-fmt.(from @Ma27).
v0.10.0 - 2021-11-30
Added
-
Support for the new path-interpolation syntax from Nix 2.4 was added. The parser now correctly detects
./foo/${bar}as valid code and parses it down to
NODE_ROOT 0..13 { NODE_PATH_WITH_INTERPOL 0..12 { TOKEN_PATH("./foo/") 0..6 NODE_STRING_INTERPOL 6..12 { TOKEN_INTERPOL_START("${") 6..8 NODE_IDENT 8..11 { TOKEN_IDENT("bar") 8..11 } TOKEN_INTERPOL_END("}") 11..12 } } TOKEN_WHITESPACE("\n") 12..13 }Paths without interpolation are still within
NODE_LITERALfor backwards-compatibility.(from @Ma27).
-
rnix::types::ParsedTypeErrornow implements theDebug,Copy,Clone,fmt::Displaytraits (from @NerdyPepper). -
During development, the parser can be tested like this:
$ cargo run --example from-stdin <<< 'builtins.map (x: x * x) [ 1 2 3 ]'(from @efx).
Changed
-
A few more examples of invalid
inherit-expressions are correctly marked as such (from @oberblastmeister). -
rnix::types::BinOp::operator()now returnsOption<BinOpKind>rather than unwrapping the value (from @NerdyPepper).If your code worked fine before, it will be sufficient to add a
.unwrap()since this was what happened before within::operator(). -
Duplicated arguments in the argument-pattern syntax are now marked as parser error. E.g.
{ a, a }: anow produces an error (from @Ma27).
-
Floats without trailing zeroes (e.g.
.5) are no longer marked as syntax error (from @Ma27).
v0.9.1 - 2021-09-23
Changed
- Fixed a memory leak while parsing
inherit-expressions with invalid syntax (from @Ma27).