@@ -982,7 +982,7 @@ InvertibleAnnotationRequest::evaluate(Evaluator &evaluator,
982
982
result.positive .setIfUnset (Kind::Explicit, loc);
983
983
984
984
if (isInverseTarget (type))
985
- result.inverse .setIfUnset (Kind::Explicit, loc);
985
+ result.inverse .setIfUnset (Kind::Explicit, loc);
986
986
}
987
987
988
988
return result;
@@ -1008,38 +1008,47 @@ InvertibleAnnotationRequest::evaluate(Evaluator &evaluator,
1008
1008
1009
1009
Mark result;
1010
1010
// Next, scan the where clause and return the result.
1011
- WhereClauseOwner (genCtx).visitRequirements (TypeResolutionStage::Structural,
1012
- [&](Requirement req, RequirementRepr *repr) -> bool /* = stop search */ {
1013
- if (req.getKind () != RequirementKind::Conformance)
1014
- return false ;
1011
+ auto whereClause = genCtx->getTrailingWhereClause ();
1012
+ if (!whereClause)
1013
+ return result;
1014
+
1015
+ auto requirements = whereClause->getRequirements ();
1016
+ for (unsigned i : indices (requirements)) {
1017
+ auto requirementRepr = requirements[i];
1018
+ if (requirementRepr.getKind () != RequirementReprKind::TypeConstraint)
1019
+ continue ;
1020
+
1021
+ auto *constraintRepr =
1022
+ dyn_cast<InverseTypeRepr>(requirementRepr.getConstraintRepr ());
1023
+ if (!constraintRepr || constraintRepr->isInvalid ())
1024
+ continue ;
1025
+
1026
+ auto req = evaluator (
1027
+ RequirementRequest{genCtx, i, TypeResolutionStage::Structural},
1028
+ [&]() {
1029
+ return Requirement (RequirementKind::SameType,
1030
+ ErrorType::get (ctx),
1031
+ ErrorType::get (ctx));
1032
+ });
1033
+
1034
+ if (req.hasError () || req.getKind () != RequirementKind::Conformance)
1035
+ continue ;
1015
1036
1016
1037
auto subject = req.getFirstType ();
1017
1038
if (!subject->isTypeParameter ())
1018
- return false ;
1039
+ continue ;
1019
1040
1020
1041
// Skip outer params and implicit ones.
1021
1042
auto *param = subject->getRootGenericParam ()->getDecl ();
1022
1043
if (!param || !params.contains (param))
1023
- return false ;
1024
-
1025
- // Check constraint type
1026
- auto constraint = req.getSecondType ();
1027
-
1028
- // Found it?
1029
- if (isInverseTarget (constraint)) {
1030
- // Try to find a good location.
1031
- SourceLoc loc;
1032
- if (repr && !repr->isInvalid ())
1033
- if (auto *constraintRepr = repr->getConstraintRepr ())
1034
- if (!repr->isInvalid ())
1035
- loc = constraintRepr->getLoc ();
1044
+ continue ;
1036
1045
1037
- result.set (Kind::Inferred, loc);
1038
- return true ;
1046
+ if (isInverseTarget (req.getSecondType ())) {
1047
+ result.set (Kind::Inferred, constraintRepr->getLoc ());
1048
+ break ;
1039
1049
}
1050
+ }
1040
1051
1041
- return false ;
1042
- });
1043
1052
return result;
1044
1053
};
1045
1054
0 commit comments