Skip to content

Commit

Permalink
Update field mutation error message (typst#1742)
Browse files Browse the repository at this point in the history
  • Loading branch information
PgBiel committed Jul 26, 2023
1 parent 8c6adde commit 5bd97e2
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 13 deletions.
25 changes: 19 additions & 6 deletions crates/typst/src/eval/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ use unicode_segmentation::UnicodeSegmentation;

use self::func::{CapturesVisitor, Closure};
use crate::diag::{
bail, error, warning, At, FileError, SourceDiagnostic, SourceResult, StrResult,
bail, error, warning, At, FileError, Hint, SourceDiagnostic, SourceResult, StrResult,
Trace, Tracepoint,
};
use crate::model::{
Expand Down Expand Up @@ -1962,11 +1962,24 @@ fn access_dict<'a>(
) -> SourceResult<&'a mut Dict> {
match access.target().access(vm)? {
Value::Dict(dict) => Ok(dict),
value => bail!(
access.target().span(),
"expected dictionary, found {}",
value.type_name(),
),
value => {
let type_name = value.type_name();
let span = access.target().span();
if matches!(
value, // those types have their own field getters
Value::Symbol(_) | Value::Content(_) | Value::Module(_) | Value::Func(_)
) {
bail!(span, "cannot mutate fields on {type_name}");
} else if fields::fields_on(type_name).is_empty() {
bail!(span, "{type_name} does not have accessible fields");
} else {
// type supports static fields, which don't yet have
// setters
Err(eco_format!("fields on {type_name} are not yet mutable"))
.hint(eco_format!("try creating a new {type_name} with the updated field value instead"))
.at(span)
}
}
}
}

Expand Down
7 changes: 0 additions & 7 deletions tests/typ/compiler/dict.typ
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,3 @@
---
// Error: 3-15 cannot mutate a temporary value
#((key: "val").other = "some")

---
#{
let object = none
// Error: 3-9 expected dictionary, found none
object.property = "value"
}
50 changes: 50 additions & 0 deletions tests/typ/compiler/field.typ
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,53 @@
#test((top + start).y, top)
#test((bottom + end).y, bottom)
#test((horizon + center).y, horizon)

---
#{
let object = sym.eq.not
// Error: 3-9 cannot mutate fields on symbol
object.property = "value"
}

---
#{
let object = [hi]
// Error: 3-9 cannot mutate fields on content
object.property = "value"
}

---
#{
let object = calc
// Error: 3-9 cannot mutate fields on module
object.property = "value"
}

---
#{
let object = calc.sin
// Error: 3-9 cannot mutate fields on function
object.property = "value"
}

---
#{
let object = none
// Error: 3-9 none does not have accessible fields
object.property = "value"
}

---
#{
let object = 10
// Error: 3-9 integer does not have accessible fields
object.property = "value"
}

---
#{
let s = 1pt + red
// Error: 3-4 fields on stroke are not yet mutable
// Hint: 3-4 try creating a new stroke with the updated field value instead
s.thickness = 5pt
}

0 comments on commit 5bd97e2

Please sign in to comment.