feat(tvix/eval): Give names to builtin arguments

Refactor the arguments of a Builtin to be a vec of a new BuiltinArgument
struct, which contains the old strictness boolean and also a static
`name` str - this is automatically determined via the ident for the
corresponding function argument in the proc-macro case, and passed in in
the cases where we're still manually calling Builtin::new.

Currently this name is unused, but in the future this can be used as
part of a documentation system for builtins.

Change-Id: Ib9dadb15b69bf8c9ea1983a4f4f197294a2394a6
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7204
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Griffin Smith 2022-11-06 10:28:34 -05:00 committed by grfn
parent dad07a8bc0
commit a1015ba1d7
6 changed files with 109 additions and 55 deletions

View file

@ -5,6 +5,7 @@
use crate::compiler::{GlobalsMap, GlobalsMapFunc};
use crate::source::SourceCode;
use crate::value::BuiltinArgument;
use std::cmp::{self, Ordering};
use std::collections::{BTreeMap, HashMap, HashSet};
use std::path::PathBuf;
@ -907,7 +908,16 @@ fn placeholders() -> Vec<Builtin> {
vec![
Builtin::new(
"addErrorContext",
&[false, false],
&[
BuiltinArgument {
strict: false,
name: "context",
},
BuiltinArgument {
strict: false,
name: "value",
},
],
|mut args: Vec<Value>, vm: &mut VM| {
vm.emit_warning(WarningKind::NotImplemented("builtins.addErrorContext"));
Ok(args.pop().unwrap())
@ -915,7 +925,10 @@ fn placeholders() -> Vec<Builtin> {
),
Builtin::new(
"unsafeDiscardStringContext",
&[true],
&[BuiltinArgument {
strict: true,
name: "s",
}],
|mut args: Vec<Value>, vm: &mut VM| {
vm.emit_warning(WarningKind::NotImplemented(
"builtins.unsafeDiscardStringContext",
@ -923,28 +936,35 @@ fn placeholders() -> Vec<Builtin> {
Ok(args.pop().unwrap())
},
),
Builtin::new("derivation", &[true], |args: Vec<Value>, vm: &mut VM| {
vm.emit_warning(WarningKind::NotImplemented("builtins.derivation"));
Builtin::new(
"derivation",
&[BuiltinArgument {
strict: true,
name: "attrs",
}],
|args: Vec<Value>, vm: &mut VM| {
vm.emit_warning(WarningKind::NotImplemented("builtins.derivation"));
// We do not implement derivations yet, so this function sets mock
// values on the fields that a real derivation would contain.
//
// Crucially this means we do not yet *validate* the values either.
let attrs = unwrap_or_clone_rc(args[0].to_attrs()?);
let attrs = attrs.update(NixAttrs::from_map(BTreeMap::from([
(
"outPath".into(),
"/nix/store/00000000000000000000000000000000-mock".into(),
),
(
"drvPath".into(),
"/nix/store/00000000000000000000000000000000-mock.drv".into(),
),
("type".into(), "derivation".into()),
])));
// We do not implement derivations yet, so this function sets mock
// values on the fields that a real derivation would contain.
//
// Crucially this means we do not yet *validate* the values either.
let attrs = unwrap_or_clone_rc(args[0].to_attrs()?);
let attrs = attrs.update(NixAttrs::from_map(BTreeMap::from([
(
"outPath".into(),
"/nix/store/00000000000000000000000000000000-mock".into(),
),
(
"drvPath".into(),
"/nix/store/00000000000000000000000000000000-mock.drv".into(),
),
("type".into(), "derivation".into()),
])));
Ok(Value::Attrs(Rc::new(attrs)))
}),
Ok(Value::Attrs(Rc::new(attrs)))
},
),
]
}
// we set TVIX_CURRENT_SYSTEM in build.rs