feat(tvix/eval): Implement inherit from outer scope in attrs

Change-Id: I97fa45059b7f2cbe96eb60bd1821e3e25832df66
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6212
Reviewed-by: grfn <grfn@gws.fyi>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2022-08-14 17:33:16 +03:00 committed by tazjin
parent 3a67f91228
commit e07556493f
3 changed files with 31 additions and 0 deletions

View file

@ -358,6 +358,32 @@ impl Compiler {
let mut count = 0;
// Inherits have to be evaluated before entering the scope of
// a potentially recursive attribute sets (i.e. we always
// inherit "from the outside").
for inherit in node.inherits() {
match inherit.from() {
Some(_from) => todo!("inherit from attrs not implemented"),
None => {
for ident in inherit.idents() {
count += 1;
// Leave the identifier on the stack (never
// nested in case of inherits!)
let idx = self
.chunk
.push_constant(Value::String(ident.as_str().into()));
self.chunk.push_op(OpCode::OpConstant(idx));
match self.resolve_local(ident.as_str()) {
Some(idx) => self.chunk.push_op(OpCode::OpGetLocal(idx)),
None => return Err(Error::UnknownStaticVariable(ident)),
};
}
}
}
}
for kv in node.entries() {
count += 1;

View file

@ -0,0 +1 @@
{ a = 1; }

View file

@ -0,0 +1,4 @@
let
a = 1;
in
{ inherit a; }