From 023e372583b7bcc71b5c301c49501cc72204068f Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Tue, 23 Jan 2024 15:34:38 +0200 Subject: [PATCH] feat(tvix/eval): track pattern binding names These need to be preserved at least for builtins.toXML. Also, we incorrectly only wrote an in case ellipsis was true, but that's not the case. Change-Id: I6bff9c47c2922f878d5c43e48280cda9c9ddb692 Reviewed-on: https://cl.tvl.fyi/c/depot/+/10686 Tested-by: BuildkiteCI Autosubmit: flokli Reviewed-by: aspen --- tvix/eval/src/builtins/to_xml.rs | 11 +++++++++-- tvix/eval/src/compiler/mod.rs | 14 +++++++++++--- .../{notyetpassing => }/eval-okay-xml.exp.xml | 0 .../{notyetpassing => }/eval-okay-xml.nix | 0 tvix/eval/src/value/function.rs | 4 ++++ 5 files changed, 24 insertions(+), 5 deletions(-) rename tvix/eval/src/tests/nix_tests/{notyetpassing => }/eval-okay-xml.exp.xml (100%) rename tvix/eval/src/tests/nix_tests/{notyetpassing => }/eval-okay-xml.nix (100%) diff --git a/tvix/eval/src/builtins/to_xml.rs b/tvix/eval/src/builtins/to_xml.rs index 250891b60..f23cb22db 100644 --- a/tvix/eval/src/builtins/to_xml.rs +++ b/tvix/eval/src/builtins/to_xml.rs @@ -90,15 +90,22 @@ fn value_variant_to_xml(w: &mut EventWriter, value: &Value) -> Resu match &c.lambda.formals { Some(formals) => { + let mut attrspat = XmlEvent::start_element("attrspat"); if formals.ellipsis { - w.write(XmlEvent::start_element("attrspat").attr("ellipsis", "1"))?; - w.write(XmlEvent::end_element())?; + attrspat = attrspat.attr("ellipsis", "1"); } + if let Some(ref name) = &formals.name { + attrspat = attrspat.attr("name", name.as_str()); + } + + w.write(attrspat)?; for arg in formals.arguments.iter() { w.write(XmlEvent::start_element("attr").attr("name", arg.0.as_str()))?; w.write(XmlEvent::end_element())?; } + + w.write(XmlEvent::end_element())?; } None => { // TODO(tazjin): tvix does not currently persist function diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 4bb734290..53a99a453 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -973,9 +973,16 @@ impl Compiler<'_> { /// cases. fn compile_param_pattern(&mut self, pattern: &ast::Pattern) -> (Formals, CodeIdx) { let span = self.span_for(pattern); - let set_idx = match pattern.pat_bind() { - Some(name) => self.declare_local(&name, name.ident().unwrap().to_string()), - None => self.scope_mut().declare_phantom(span, true), + + let (set_idx, pat_bind_name) = match pattern.pat_bind() { + Some(name) => { + let pat_bind_name = name.ident().unwrap().to_string(); + ( + self.declare_local(&name, pat_bind_name.clone()), + Some(pat_bind_name), + ) + } + None => (self.scope_mut().declare_phantom(span, true), None), }; // At call time, the attribute set is already at the top of the stack. @@ -1126,6 +1133,7 @@ impl Compiler<'_> { arguments, ellipsis, span, + name: pat_bind_name, }), throw_idx, ) diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-xml.exp.xml b/tvix/eval/src/tests/nix_tests/eval-okay-xml.exp.xml similarity index 100% rename from tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-xml.exp.xml rename to tvix/eval/src/tests/nix_tests/eval-okay-xml.exp.xml diff --git a/tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-xml.nix b/tvix/eval/src/tests/nix_tests/eval-okay-xml.nix similarity index 100% rename from tvix/eval/src/tests/nix_tests/notyetpassing/eval-okay-xml.nix rename to tvix/eval/src/tests/nix_tests/eval-okay-xml.nix diff --git a/tvix/eval/src/value/function.rs b/tvix/eval/src/value/function.rs index 8131cffa0..7592e3d64 100644 --- a/tvix/eval/src/value/function.rs +++ b/tvix/eval/src/value/function.rs @@ -18,6 +18,10 @@ pub(crate) struct Formals { /// The span of the formals themselves, to use to emit errors pub(crate) span: Span, + + /// Optionally tracks a name for all function arguments (args@ style). + /// Used by toXML. + pub(crate) name: Option, } impl Formals {