@@ -754,15 +754,23 @@ void RewriteSystem::freeze() {
754
754
}
755
755
756
756
static Optional<Requirement>
757
- getRequirementForDiagnostics (Type subject, Symbol property) {
757
+ getRequirementForDiagnostics (Type subject, Symbol property,
758
+ const PropertyMap &map,
759
+ TypeArrayView<GenericTypeParamType> genericParams) {
758
760
switch (property.getKind ()) {
759
- case Symbol::Kind::ConcreteType:
760
- return Requirement (RequirementKind::SameType, subject,
761
- property.getConcreteType ());
761
+ case Symbol::Kind::ConcreteType: {
762
+ auto concreteType = map.getTypeFromSubstitutionSchema (
763
+ property.getConcreteType (), property.getSubstitutions (),
764
+ genericParams, MutableTerm ());
765
+ return Requirement (RequirementKind::SameType, subject, concreteType);
766
+ }
762
767
763
- case Symbol::Kind::Superclass:
764
- return Requirement (RequirementKind::Superclass, subject,
765
- property.getConcreteType ());
768
+ case Symbol::Kind::Superclass: {
769
+ auto concreteType = map.getTypeFromSubstitutionSchema (
770
+ property.getConcreteType (), property.getSubstitutions (),
771
+ genericParams, MutableTerm ());
772
+ return Requirement (RequirementKind::Superclass, subject, concreteType);
773
+ }
766
774
767
775
case Symbol::Kind::Protocol:
768
776
return Requirement (RequirementKind::Conformance, subject,
@@ -785,14 +793,11 @@ void RewriteSystem::computeConflictDiagnostics(
785
793
const auto &firstRule = getRule (pair.first );
786
794
const auto &secondRule = getRule (pair.second );
787
795
788
- auto firstProperty = firstRule.isPropertyRule ();
789
- auto secondProperty = secondRule.isPropertyRule ();
790
- assert (firstProperty && secondProperty);
796
+ assert (firstRule.isPropertyRule () && secondRule.isPropertyRule ());
791
797
792
- auto firstTerm = firstRule.getRHS ();
793
- auto secondTerm = secondRule.getRHS ();
794
- auto subjectTerm =
795
- firstTerm.size () > secondTerm.size () ? firstTerm : secondTerm;
798
+ bool chooseFirstRule = firstRule.getRHS ().size () > secondRule.getRHS ().size ();
799
+ auto subjectRule = chooseFirstRule ? firstRule : secondRule;
800
+ auto subjectTerm = subjectRule.getRHS ();
796
801
797
802
// If the root protocol of the subject term isn't in this minimization
798
803
// domain, the conflict was already diagnosed.
@@ -801,8 +806,10 @@ void RewriteSystem::computeConflictDiagnostics(
801
806
802
807
Type subject = propertyMap.getTypeForTerm (subjectTerm, genericParams);
803
808
errors.push_back (RequirementError::forConflictingRequirement (
804
- *getRequirementForDiagnostics (subject, *firstProperty),
805
- *getRequirementForDiagnostics (subject, *secondProperty),
809
+ *getRequirementForDiagnostics (subject, *firstRule.isPropertyRule (),
810
+ propertyMap, genericParams),
811
+ *getRequirementForDiagnostics (subject, *secondRule.isPropertyRule (),
812
+ propertyMap, genericParams),
806
813
signatureLoc));
807
814
}
808
815
}
0 commit comments