mirror of
https://github.com/typst/typst
synced 2025-05-13 12:36:23 +08:00
Mutable field access
This commit is contained in:
parent
1927cc86da
commit
778aa4e7df
@ -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,
|
||||
|
@ -17,10 +17,14 @@
|
||||
---
|
||||
// Test lvalue and rvalue access.
|
||||
{
|
||||
let dict = (a: 1, b: 1)
|
||||
dict("b") += 1
|
||||
dict("c") = 3
|
||||
test(dict, (a: 1, b: 2, c: 3))
|
||||
let dict = (a: 1, "b b": 1)
|
||||
dict("b b") += 1
|
||||
dict.state = (ok: true, err: false)
|
||||
test(dict, (a: 1, "b b": 2, state: (ok: true, err: false)))
|
||||
test(dict.state.ok, true)
|
||||
dict("state").ok = false
|
||||
test(dict.state.ok, false)
|
||||
test(dict.state.err, false)
|
||||
}
|
||||
|
||||
---
|
||||
@ -58,3 +62,14 @@
|
||||
// Error: 12-16 expected identifier or string, found boolean
|
||||
// Error: 17-18 expected expression, found colon
|
||||
{(:1 b:"", true::)}
|
||||
|
||||
---
|
||||
// Error: 3-15 cannot mutate a temporary value
|
||||
{ (key: value).other = "some" }
|
||||
|
||||
---
|
||||
{
|
||||
let object = none
|
||||
// Error: 3-9 expected dictionary, found none
|
||||
object.property = "value"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user