@@ -702,15 +702,13 @@ defmodule ExUnit.Diff do
702702 # Structs
703703
704704 defp diff_quoted_struct ( kw , right , env ) do
705- struct1 = kw [ :__struct__ ]
706- left = load_struct ( kw [ :__struct__ ] )
707-
708- if left && Enum . all? ( kw , fn { k , _ } -> Map . has_key? ( left , k ) end ) do
705+ if struct = struct_module ( kw ) do
709706 with true <- Macro . quoted_literal? ( kw ) ,
710- { eval_kw , [ ] } <- safe_eval ( kw ) do
711- diff_quoted_struct ( struct! ( left , eval_kw ) , kw , right , struct1 , env )
707+ { eval_kw , [ ] } <- safe_eval ( kw ) ,
708+ { :ok , data } <- load_struct ( struct , eval_kw ) do
709+ diff_quoted_struct ( data , kw , right , struct , env )
712710 else
713- _ -> diff_map ( kw , right , struct1 , maybe_struct ( right ) , env )
711+ _ -> diff_map ( kw , right , struct , maybe_struct ( right ) , env )
714712 end
715713 else
716714 diff_map ( kw , right , nil , maybe_struct ( right ) , env )
@@ -746,13 +744,25 @@ defmodule ExUnit.Diff do
746744 end
747745 end
748746
749- defp load_struct ( struct ) do
750- if is_atom ( struct ) and struct != nil and
751- Code . ensure_loaded? ( struct ) and function_exported? ( struct , :__struct__ , 0 ) do
752- struct . __struct__ ( )
747+ defp struct_module ( kw ) do
748+ { struct , struct_kw } = Keyword . pop ( kw , :__struct__ )
749+
750+ info =
751+ is_atom ( struct ) and struct != nil and
752+ Code . ensure_loaded? ( struct ) and function_exported? ( struct , :__info__ , 1 ) and
753+ struct . __info__ ( :struct )
754+
755+ if info && Enum . all? ( struct_kw , fn { k , _ } -> Enum . any? ( info , & ( & 1 . field == k ) ) end ) do
756+ struct
753757 end
754758 end
755759
760+ defp load_struct ( struct , kw ) do
761+ { :ok , struct! ( struct , kw ) }
762+ rescue
763+ _ -> :error
764+ end
765+
756766 defp maybe_struct ( % name { } ) , do: name
757767 defp maybe_struct ( _ ) , do: nil
758768
0 commit comments