@@ -780,38 +780,43 @@ class ModuleWriter {
780
780
std::mismatch (lhsProtos.begin (), lhsProtos.end (), rhsProtos.begin (),
781
781
[] (const ProtocolDecl *nextLHSProto,
782
782
const ProtocolDecl *nextRHSProto) {
783
- return nextLHSProto->getName () ! = nextRHSProto->getName ();
783
+ return nextLHSProto->getName () = = nextRHSProto->getName ();
784
784
});
785
785
if (mismatch.first != lhsProtos.end ()) {
786
786
StringRef lhsProtoName = (*mismatch.first )->getName ().str ();
787
787
return lhsProtoName.compare ((*mismatch.second )->getName ().str ());
788
788
}
789
789
}
790
790
791
- // Still nothing? Fine, we'll pick the one with the alphabetically first
792
- // member instead.
791
+ // Still nothing? Fine, we'll look for a difference between the members.
793
792
{
794
- auto mismatch = std::mismatch (
795
- cast<ExtensionDecl>(*lhs)->getAllMembers ().begin (),
796
- cast<ExtensionDecl>(*lhs)->getAllMembers ().end (),
797
- cast<ExtensionDecl>(*rhs)->getAllMembers ().begin (),
798
- [](const Decl *nextLHSDecl, const Decl *nextRHSDecl) {
799
- if (isa<ValueDecl>(nextLHSDecl) && isa<ValueDecl>(nextRHSDecl)) {
800
- return cast<ValueDecl>(nextLHSDecl)->getName () !=
801
- cast<ValueDecl>(nextRHSDecl)->getName ();
802
- }
803
- return isa<ValueDecl>(nextLHSDecl) != isa<ValueDecl>(nextRHSDecl);
804
- });
805
- if (mismatch.first !=
806
- cast<ExtensionDecl>(*lhs)->getAllMembers ().end ()) {
807
- auto *lhsMember = dyn_cast<ValueDecl>(*mismatch.first ),
808
- *rhsMember = dyn_cast<ValueDecl>(*mismatch.second );
793
+ for (auto pair : llvm::zip_equal (lhsMembers, rhsMembers)) {
794
+ auto *lhsMember = dyn_cast<ValueDecl>(std::get<0 >(pair)),
795
+ *rhsMember = dyn_cast<ValueDecl>(std::get<1 >(pair));
809
796
if (!rhsMember && lhsMember)
810
797
return Descending;
811
- if (lhsMember && ! rhsMember)
798
+ if (! lhsMember && rhsMember)
812
799
return Ascending;
813
- if (lhsMember && rhsMember)
814
- return rhsMember->getName ().compare (lhsMember->getName ());
800
+ if (!lhsMember && !rhsMember)
801
+ continue ;
802
+
803
+ result = rhsMember->getName ().compare (lhsMember->getName ());
804
+ if (result != 0 )
805
+ return result;
806
+
807
+ result = rhsMember->getInterfaceType ().getString ().compare (
808
+ lhsMember->getInterfaceType ().getString ());
809
+ if (result != 0 )
810
+ return result;
811
+
812
+ auto lhsGeneric = lhsMember->getAsGenericContext (),
813
+ rhsGeneric = rhsMember->getAsGenericContext ();
814
+ if (lhsGeneric && rhsGeneric) {
815
+ result = rhsGeneric->getGenericSignature ().getAsString ().compare (
816
+ lhsGeneric->getGenericSignature ().getAsString ());
817
+ if (result != 0 )
818
+ return result;
819
+ }
815
820
}
816
821
}
817
822
0 commit comments