Skip to content

Commit 71cd3a9

Browse files
committed
Auto merge of #13016 - dtolnay-contrib:messagetype, r=ehuss
Handle $message_type in JSON diagnostics ### What does this PR try to resolve? Unblocks rust-lang/rust#115691. Without this change, Cargo's testsuite fails in `doc::doc_message_format` and `metabuild::metabuild_failed_build_json`. ### How should we test and review this PR? Tested with and without rust-lang/rust#115691. In Cargo repo: `cargo test --test testsuite` In Rust repo: `x.py test src/tools/cargo` (separately on master and $message_type PR)
2 parents 8e00f03 + 65bb09d commit 71cd3a9

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

crates/cargo-test-support/src/compare.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -591,15 +591,36 @@ fn find_json_mismatch_r<'a>(
591591
.next()
592592
}
593593
(&Object(ref l), &Object(ref r)) => {
594-
let same_keys = l.len() == r.len() && l.keys().all(|k| r.contains_key(k));
595-
if !same_keys {
596-
return Some((expected, actual));
594+
let mut expected_entries = l.iter();
595+
let mut actual_entries = r.iter();
596+
597+
// Compilers older than 1.76 do not produce $message_type.
598+
// Treat it as optional for now.
599+
let mut expected_entries_without_message_type;
600+
let expected_entries: &mut dyn Iterator<Item = _> =
601+
if l.contains_key("$message_type") && !r.contains_key("$message_type") {
602+
expected_entries_without_message_type =
603+
expected_entries.filter(|entry| entry.0 != "$message_type");
604+
&mut expected_entries_without_message_type
605+
} else {
606+
&mut expected_entries
607+
};
608+
609+
loop {
610+
match (expected_entries.next(), actual_entries.next()) {
611+
(None, None) => return None,
612+
(Some((expected_key, expected_value)), Some((actual_key, actual_value)))
613+
if expected_key == actual_key =>
614+
{
615+
if let mismatch @ Some(_) =
616+
find_json_mismatch_r(expected_value, actual_value, cwd)
617+
{
618+
return mismatch;
619+
}
620+
}
621+
_ => return Some((expected, actual)),
622+
}
597623
}
598-
599-
l.values()
600-
.zip(r.values())
601-
.filter_map(|(l, r)| find_json_mismatch_r(l, r, cwd))
602-
.next()
603624
}
604625
(&Null, &Null) => None,
605626
// Magic string literal `"{...}"` acts as wildcard for any sub-JSON.

tests/testsuite/doc.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,6 +1698,7 @@ fn doc_message_format() {
16981698
r#"
16991699
{
17001700
"message": {
1701+
"$message_type": "diagnostic",
17011702
"children": "{...}",
17021703
"code": "{...}",
17031704
"level": "error",

tests/testsuite/metabuild.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,7 @@ fn metabuild_failed_build_json() {
740740
r#"
741741
{
742742
"message": {
743+
"$message_type": "diagnostic",
743744
"children": "{...}",
744745
"code": "{...}",
745746
"level": "error",

0 commit comments

Comments
 (0)