feat(tvix/eval): track pattern binding names

These need to be preserved at least for builtins.toXML.

Also, we incorrectly only wrote an <attrspat> 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 <flokli@flokli.de>
Reviewed-by: aspen <root@gws.fyi>
This commit is contained in:
Florian Klink 2024-01-23 15:34:38 +02:00 committed by clbot
parent e1d2589163
commit 023e372583
5 changed files with 24 additions and 5 deletions

View file

@ -90,15 +90,22 @@ fn value_variant_to_xml<W: Write>(w: &mut EventWriter<W>, value: &Value) -> Resu
match &c.lambda.formals { match &c.lambda.formals {
Some(formals) => { Some(formals) => {
let mut attrspat = XmlEvent::start_element("attrspat");
if formals.ellipsis { if formals.ellipsis {
w.write(XmlEvent::start_element("attrspat").attr("ellipsis", "1"))?; attrspat = attrspat.attr("ellipsis", "1");
w.write(XmlEvent::end_element())?;
} }
if let Some(ref name) = &formals.name {
attrspat = attrspat.attr("name", name.as_str());
}
w.write(attrspat)?;
for arg in formals.arguments.iter() { for arg in formals.arguments.iter() {
w.write(XmlEvent::start_element("attr").attr("name", arg.0.as_str()))?; w.write(XmlEvent::start_element("attr").attr("name", arg.0.as_str()))?;
w.write(XmlEvent::end_element())?; w.write(XmlEvent::end_element())?;
} }
w.write(XmlEvent::end_element())?;
} }
None => { None => {
// TODO(tazjin): tvix does not currently persist function // TODO(tazjin): tvix does not currently persist function

View file

@ -973,9 +973,16 @@ impl Compiler<'_> {
/// cases. /// cases.
fn compile_param_pattern(&mut self, pattern: &ast::Pattern) -> (Formals, CodeIdx) { fn compile_param_pattern(&mut self, pattern: &ast::Pattern) -> (Formals, CodeIdx) {
let span = self.span_for(pattern); let span = self.span_for(pattern);
let set_idx = match pattern.pat_bind() {
Some(name) => self.declare_local(&name, name.ident().unwrap().to_string()), let (set_idx, pat_bind_name) = match pattern.pat_bind() {
None => self.scope_mut().declare_phantom(span, true), 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. // At call time, the attribute set is already at the top of the stack.
@ -1126,6 +1133,7 @@ impl Compiler<'_> {
arguments, arguments,
ellipsis, ellipsis,
span, span,
name: pat_bind_name,
}), }),
throw_idx, throw_idx,
) )

View file

@ -18,6 +18,10 @@ pub(crate) struct Formals {
/// The span of the formals themselves, to use to emit errors /// The span of the formals themselves, to use to emit errors
pub(crate) span: Span, pub(crate) span: Span,
/// Optionally tracks a name for all function arguments (args@ style).
/// Used by toXML.
pub(crate) name: Option<String>,
} }
impl Formals { impl Formals {