@@ -753,20 +753,44 @@ void RewriteSystem::freeze() {
753753 ConflictingRules.clear ();
754754}
755755
756+ static Optional<Requirement>
757+ getRequirementForDiagnostics (Type subject, Symbol property) {
758+ switch (property.getKind ()) {
759+ case Symbol::Kind::ConcreteType:
760+ return Requirement (RequirementKind::SameType, subject,
761+ property.getConcreteType ());
762+
763+ case Symbol::Kind::Superclass:
764+ return Requirement (RequirementKind::Superclass, subject,
765+ property.getConcreteType ());
766+
767+ case Symbol::Kind::Protocol:
768+ return Requirement (RequirementKind::Conformance, subject,
769+ property.getProtocol ()->getDeclaredInterfaceType ());
770+
771+ case Symbol::Kind::Layout:
772+ return Requirement (RequirementKind::Layout, subject,
773+ property.getLayoutConstraint ());
774+
775+ default :
776+ return None;
777+ }
778+ }
779+
756780void RewriteSystem::computeConflictDiagnostics (
757781 SmallVectorImpl<RequirementError> &errors, SourceLoc signatureLoc,
758782 const PropertyMap &propertyMap,
759783 TypeArrayView<GenericTypeParamType> genericParams) {
760784 for (auto pair : ConflictingRules) {
761- auto * firstRule = & getRule (pair.first );
762- auto * secondRule = & getRule (pair.second );
785+ const auto & firstRule = getRule (pair.first );
786+ const auto & secondRule = getRule (pair.second );
763787
764- auto firstProperty = firstRule-> isPropertyRule ();
765- auto secondProperty = secondRule-> isPropertyRule ();
788+ auto firstProperty = firstRule. isPropertyRule ();
789+ auto secondProperty = secondRule. isPropertyRule ();
766790 assert (firstProperty && secondProperty);
767791
768- auto firstTerm = firstRule-> getRHS ();
769- auto secondTerm = secondRule-> getRHS ();
792+ auto firstTerm = firstRule. getRHS ();
793+ auto secondTerm = secondRule. getRHS ();
770794 auto subjectTerm =
771795 firstTerm.size () > secondTerm.size () ? firstTerm : secondTerm;
772796
@@ -777,8 +801,8 @@ void RewriteSystem::computeConflictDiagnostics(
777801
778802 Type subject = propertyMap.getTypeForTerm (subjectTerm, genericParams);
779803 errors.push_back (RequirementError::forConflictingRequirement (
780- *firstRule-> getPropertyRequirement (subject),
781- *secondRule-> getPropertyRequirement (subject),
804+ *getRequirementForDiagnostics (subject, *firstProperty ),
805+ *getRequirementForDiagnostics (subject, *secondProperty ),
782806 signatureLoc));
783807 }
784808}
0 commit comments