diff options
Diffstat (limited to 'src/eval/mod.rs')
| -rw-r--r-- | src/eval/mod.rs | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 0021b93c..db50ee82 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -1000,8 +1000,9 @@ impl Access for Expr { scp: &'a mut Scopes, ) -> TypResult<Location<'a>> { match self { - Expr::Ident(ident) => ident.access(ctx, scp), - Expr::FuncCall(call) => call.access(ctx, scp), + Expr::Ident(v) => v.access(ctx, scp), + Expr::FieldAccess(v) => v.access(ctx, scp), + Expr::FuncCall(v) => v.access(ctx, scp), _ => bail!(self.span(), "cannot mutate a temporary value"), } } @@ -1023,6 +1024,26 @@ impl Access for Ident { } } +impl Access for FieldAccess { + fn access<'a>( + &self, + ctx: &mut Context, + scp: &'a mut Scopes, + ) -> TypResult<Location<'a>> { + let guard = self.object().access(ctx, scp)?; + try_map(guard, |value| { + Ok(match value { + Value::Dict(dict) => dict.get_mut(self.field().take()), + v => bail!( + self.object().span(), + "expected dictionary, found {}", + v.type_name(), + ), + }) + }) + } +} + impl Access for FuncCall { fn access<'a>( &self, |
