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:
parent
e1d2589163
commit
023e372583
5 changed files with 24 additions and 5 deletions
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue