@@ -753,20 +753,44 @@ void RewriteSystem::freeze() {
753
753
ConflictingRules.clear ();
754
754
}
755
755
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
+
756
780
void RewriteSystem::computeConflictDiagnostics (
757
781
SmallVectorImpl<RequirementError> &errors, SourceLoc signatureLoc,
758
782
const PropertyMap &propertyMap,
759
783
TypeArrayView<GenericTypeParamType> genericParams) {
760
784
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 );
763
787
764
- auto firstProperty = firstRule-> isPropertyRule ();
765
- auto secondProperty = secondRule-> isPropertyRule ();
788
+ auto firstProperty = firstRule. isPropertyRule ();
789
+ auto secondProperty = secondRule. isPropertyRule ();
766
790
assert (firstProperty && secondProperty);
767
791
768
- auto firstTerm = firstRule-> getRHS ();
769
- auto secondTerm = secondRule-> getRHS ();
792
+ auto firstTerm = firstRule. getRHS ();
793
+ auto secondTerm = secondRule. getRHS ();
770
794
auto subjectTerm =
771
795
firstTerm.size () > secondTerm.size () ? firstTerm : secondTerm;
772
796
@@ -777,8 +801,8 @@ void RewriteSystem::computeConflictDiagnostics(
777
801
778
802
Type subject = propertyMap.getTypeForTerm (subjectTerm, genericParams);
779
803
errors.push_back (RequirementError::forConflictingRequirement (
780
- *firstRule-> getPropertyRequirement (subject),
781
- *secondRule-> getPropertyRequirement (subject),
804
+ *getRequirementForDiagnostics (subject, *firstProperty ),
805
+ *getRequirementForDiagnostics (subject, *secondProperty ),
782
806
signatureLoc));
783
807
}
784
808
}
0 commit comments