fix(tvix/eval): update identifier quoting to match cppnix 2.17
In cppnix 2.17, commit b72bc4a972fe568744d98b89d63adcd504cb586c, the libexpr pretty-printing routine was fixed so that it would no longer pretty-print attrsets with keywords in their attrnames incorrectly. This commit implements the corresponding fix for tvix, fixes our tests to work with cppnix>=2.17 oracles, and expands our test cases to cover all the keywords. Change-Id: I4b51389cd3a9c44babc8ab2a84b383b7b0b116ca Reviewed-on: https://cl.tvl.fyi/c/depot/+/9283 Autosubmit: Adam Joseph <adam@westernsemico.com> Reviewed-by: sterni <sternenseemann@systemli.org> Tested-by: BuildkiteCI
This commit is contained in:
parent
95ee688f03
commit
9256621009
13 changed files with 38 additions and 6 deletions
|
@ -1 +1 @@
|
||||||
{ "'quoted'" = false; "-20°" = false; "2normal" = false; "45 44 43-'3 2 1" = false; "9front" = false; Very2Normal = true; VeryNormal = true; _'12 = true; "_'12.5" = false; __internal = true; _internal = true; abort = true; assert = true; "attr.path" = false; false = true; foldl' = true; normal = true; normal2 = true; null = true; or = true; throw = true; true = true; x = true; x' = true; x'' = true; "😀" = false; }
|
{ "'quoted'" = false; "-20°" = false; "2normal" = false; "45 44 43-'3 2 1" = false; "9front" = false; Very2Normal = true; VeryNormal = true; _'12 = true; "_'12.5" = false; __internal = true; _internal = true; abort = true; "assert" = false; "attr.path" = false; "else" = false; false = true; foldl' = true; "if" = false; "in" = false; "inherit" = false; "let" = false; normal = true; normal2 = true; null = true; or = true; "rec" = false; "then" = false; throw = true; true = true; "with" = false; x = true; x' = true; x'' = true; "😀" = false; }
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
# Note: the attribute values in this set aren't just dummies! They
|
||||||
|
# are booleans which indicate whether or not the corresponding
|
||||||
|
# attrname is valid without quotification.
|
||||||
{
|
{
|
||||||
__internal = true;
|
__internal = true;
|
||||||
_internal = true;
|
_internal = true;
|
||||||
|
@ -15,7 +18,7 @@
|
||||||
false = true;
|
false = true;
|
||||||
null = true;
|
null = true;
|
||||||
or = true;
|
or = true;
|
||||||
"assert" = true; # -ish
|
"assert" = false;
|
||||||
throw = true;
|
throw = true;
|
||||||
abort = true;
|
abort = true;
|
||||||
|
|
||||||
|
@ -27,4 +30,13 @@
|
||||||
"'quoted'" = false;
|
"'quoted'" = false;
|
||||||
"_'12.5" = false;
|
"_'12.5" = false;
|
||||||
"😀" = false;
|
"😀" = false;
|
||||||
|
|
||||||
|
"if" = false;
|
||||||
|
"then" = false;
|
||||||
|
"else" = false;
|
||||||
|
"with" = false;
|
||||||
|
"let" = false;
|
||||||
|
"in" = false;
|
||||||
|
"rec" = false;
|
||||||
|
"inherit" = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
{ "assert" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "else" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "if" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "in" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "inherit" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "let" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "rec" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "then" = true; }
|
|
@ -0,0 +1 @@
|
||||||
|
{ "with" = true; }
|
|
@ -135,7 +135,7 @@ impl NixString {
|
||||||
// A borrowed string is unchanged and can be returned as
|
// A borrowed string is unchanged and can be returned as
|
||||||
// is.
|
// is.
|
||||||
Cow::Borrowed(_) => {
|
Cow::Borrowed(_) => {
|
||||||
if is_valid_nix_identifier(&escaped) {
|
if is_valid_nix_identifier(&escaped) && !is_keyword(&escaped) {
|
||||||
escaped
|
escaped
|
||||||
} else {
|
} else {
|
||||||
Cow::Owned(format!("\"{}\"", escaped))
|
Cow::Owned(format!("\"{}\"", escaped))
|
||||||
|
@ -171,6 +171,17 @@ fn nix_escape_char(ch: char, next: Option<&char>) -> Option<&'static str> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return true if this string is a keyword -- character strings
|
||||||
|
/// which lexically match the "identifier" production but are not
|
||||||
|
/// parsed as identifiers. See also cppnix commit
|
||||||
|
/// b72bc4a972fe568744d98b89d63adcd504cb586c.
|
||||||
|
fn is_keyword(s: &str) -> bool {
|
||||||
|
match s {
|
||||||
|
"if" | "then" | "else" | "assert" | "with" | "let" | "in" | "rec" | "inherit" => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Return true if this string can be used as an identifier in Nix.
|
/// Return true if this string can be used as an identifier in Nix.
|
||||||
fn is_valid_nix_identifier(s: &str) -> bool {
|
fn is_valid_nix_identifier(s: &str) -> bool {
|
||||||
// adapted from rnix-parser's tokenizer.rs
|
// adapted from rnix-parser's tokenizer.rs
|
||||||
|
|
|
@ -70,9 +70,9 @@ let
|
||||||
"eval-okay-readFileType.nix" = [ nix ];
|
"eval-okay-readFileType.nix" = [ nix ];
|
||||||
# builtins.fromTOML gains support for timestamps in Nix 2.16
|
# builtins.fromTOML gains support for timestamps in Nix 2.16
|
||||||
"eval-okay-fromTOML-timestamps.nix" = [ nix ];
|
"eval-okay-fromTOML-timestamps.nix" = [ nix ];
|
||||||
# identifier formatting seems to have changed in Nix 2.17
|
# identifier formatting changed in Nix 2.17 due to cppnix commit
|
||||||
# TODO: figure out why, this is just to get the bump in cl/9125 working.
|
# b72bc4a972fe568744d98b89d63adcd504cb586c
|
||||||
"eval-okay-identifier-formatting.nix" = [ nix_latest ];
|
"eval-okay-identifier-formatting.nix" = [ nix ];
|
||||||
|
|
||||||
# TODO(sterni): support diffing working directory and home relative paths
|
# TODO(sterni): support diffing working directory and home relative paths
|
||||||
# like C++ Nix test suite (using string replacement).
|
# like C++ Nix test suite (using string replacement).
|
||||||
|
|
Loading…
Reference in a new issue