@@ -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.
0 commit comments