diff --git a/src/macros.rs b/src/macros.rs index 9ab58b13f..5287998b4 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -224,6 +224,11 @@ macro_rules! json_internal { json_internal!(@object $object ($key) (: $($rest)*) (: $($rest)*)); }; + // Refuse to absorb colon token into key expression. + (@object $object:ident ($($key:tt)*) (: $($unexpected:tt)+) $copy:tt) => { + json_expect_expr_comma!($($unexpected)+); + }; + // Munch a token into the current key. (@object $object:ident ($($key:tt)*) ($tt:tt $($rest:tt)*) $copy:tt) => { json_internal!(@object $object ($($key)* $tt) ($($rest)*) ($($rest)*)); @@ -290,3 +295,9 @@ macro_rules! json_internal_vec { macro_rules! json_unexpected { () => {}; } + +#[macro_export] +#[doc(hidden)] +macro_rules! json_expect_expr_comma { + ($e:expr , $($tt:tt)*) => {}; +} diff --git a/tests/ui/missing_comma.rs b/tests/ui/missing_comma.rs new file mode 100644 index 000000000..8818c3e60 --- /dev/null +++ b/tests/ui/missing_comma.rs @@ -0,0 +1,5 @@ +use serde_json::json; + +fn main() { + json!({ "1": "" "2": "" }); +} diff --git a/tests/ui/missing_comma.stderr b/tests/ui/missing_comma.stderr new file mode 100644 index 000000000..ab25b740e --- /dev/null +++ b/tests/ui/missing_comma.stderr @@ -0,0 +1,7 @@ +error: no rules expected the token `"2"` + --> $DIR/missing_comma.rs:4:21 + | +4 | json!({ "1": "" "2": "" }); + | -^^^ no rules expected this token in macro call + | | + | help: missing comma here diff --git a/tests/ui/parse_expr.stderr b/tests/ui/parse_expr.stderr index 107ec59e6..d3240df35 100644 --- a/tests/ui/parse_expr.stderr +++ b/tests/ui/parse_expr.stderr @@ -1,7 +1,5 @@ -error: unexpected end of macro invocation - --> $DIR/parse_expr.rs:4:5 +error: no rules expected the token `~` + --> $DIR/parse_expr.rs:4:19 | 4 | json!({ "a" : ~ }); - | ^^^^^^^^^^^^^^^^^^^ missing tokens in macro arguments - | - = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + | ^ no rules expected this token in macro call