@@ -101,33 +101,9 @@ Expr *FailureDiagnostic::getArgumentExprFor(Expr *anchor) const {
101
101
return nullptr ;
102
102
}
103
103
104
- // TODO: Replace duplications of this logic with calls to this.
105
- Optional<SelectedOverload> FailureDiagnostic::getChoiceFor (Expr *expr) {
104
+ Optional<SelectedOverload> FailureDiagnostic::getChoiceFor (Expr *expr) const {
106
105
auto &cs = getConstraintSystem ();
107
- ConstraintLocator *locator = nullptr ;
108
-
109
- if (auto *AE = dyn_cast<ApplyExpr>(expr)) {
110
- if (auto *TE = dyn_cast<TypeExpr>(AE->getFn ())) {
111
- locator = cs.getConstraintLocator (AE,
112
- {ConstraintLocator::ApplyFunction,
113
- ConstraintLocator::ConstructorMember},
114
- /* summaryFlags=*/ 0 );
115
- }
116
- return getChoiceFor (AE->getFn ());
117
- } else if (auto *UDE = dyn_cast<UnresolvedDotExpr>(expr)) {
118
- locator = cs.getConstraintLocator (UDE, ConstraintLocator::Member);
119
- } else if (auto *UME = dyn_cast<UnresolvedMemberExpr>(expr)) {
120
- locator = cs.getConstraintLocator (UME, ConstraintLocator::UnresolvedMember);
121
- } else if (auto *SE = dyn_cast<SubscriptExpr>(expr)) {
122
- locator = cs.getConstraintLocator (SE, ConstraintLocator::SubscriptMember);
123
- } else {
124
- locator = cs.getConstraintLocator (expr);
125
- }
126
-
127
- if (!locator)
128
- return None;
129
-
130
- return getOverloadChoiceIfAvailable (locator);
106
+ return getOverloadChoiceIfAvailable (cs.getCalleeLocator (expr));
131
107
}
132
108
133
109
Type RequirementFailure::getOwnerType () const {
@@ -179,10 +155,6 @@ ProtocolConformance *RequirementFailure::getConformanceForConditionalReq(
179
155
180
156
ValueDecl *RequirementFailure::getDeclRef () const {
181
157
auto &cs = getConstraintSystem ();
182
- auto &TC = getTypeChecker ();
183
-
184
- auto *anchor = getRawAnchor ();
185
- auto *locator = cs.getConstraintLocator (anchor);
186
158
187
159
// Get a declaration associated with given type (if any).
188
160
// This is used to retrieve affected declaration when
@@ -204,38 +176,7 @@ ValueDecl *RequirementFailure::getDeclRef() const {
204
176
if (isFromContextualType ())
205
177
return getAffectedDeclFromType (cs.getContextualType ());
206
178
207
- if (auto *AE = dyn_cast<CallExpr>(anchor)) {
208
- // NOTE: In valid code, the function can only be a TypeExpr
209
- assert (isa<TypeExpr>(AE->getFn ()) ||
210
- isa<OverloadedDeclRefExpr>(AE->getFn ()));
211
- ConstraintLocatorBuilder ctor (locator);
212
- locator = cs.getConstraintLocator (
213
- ctor.withPathElement (PathEltKind::ApplyFunction)
214
- .withPathElement (PathEltKind::ConstructorMember));
215
- } else if (auto *UDE = dyn_cast<UnresolvedDotExpr>(anchor)) {
216
- ConstraintLocatorBuilder member (locator);
217
-
218
- if (TC.getSelfForInitDelegationInConstructor (getDC (), UDE)) {
219
- member = member.withPathElement (PathEltKind::ConstructorMember);
220
- } else {
221
- member = member.withPathElement (PathEltKind::Member);
222
- }
223
-
224
- locator = cs.getConstraintLocator (member);
225
- } else if (auto *UME = dyn_cast<UnresolvedMemberExpr>(anchor)) {
226
- locator = cs.getConstraintLocator (locator, PathEltKind::UnresolvedMember);
227
- } else if (isa<SubscriptExpr>(anchor)) {
228
- ConstraintLocatorBuilder subscript (locator);
229
- locator = cs.getConstraintLocator (
230
- subscript.withPathElement (PathEltKind::SubscriptMember));
231
- } else if (isa<MemberRefExpr>(anchor)) {
232
- ConstraintLocatorBuilder memberRef (locator);
233
- locator =
234
- cs.getConstraintLocator (memberRef.withPathElement (PathEltKind::Member));
235
- }
236
-
237
- auto overload = getOverloadChoiceIfAvailable (locator);
238
- if (overload)
179
+ if (auto overload = getChoiceFor (getRawAnchor ()))
239
180
return overload->choice .getDecl ();
240
181
241
182
return getAffectedDeclFromType (getOwnerType ());
@@ -568,32 +509,7 @@ bool NoEscapeFuncToTypeConversionFailure::diagnoseParameterUse() const {
568
509
569
510
Type NoEscapeFuncToTypeConversionFailure::getParameterTypeFor (
570
511
Expr *expr, unsigned paramIdx) const {
571
- auto &cs = getConstraintSystem ();
572
- ConstraintLocator *locator = nullptr ;
573
-
574
- if (auto *call = dyn_cast<CallExpr>(expr)) {
575
- auto *fnExpr = call->getFn ();
576
- if (isa<UnresolvedDotExpr>(fnExpr)) {
577
- locator = cs.getConstraintLocator (fnExpr, ConstraintLocator::Member);
578
- } else if (isa<UnresolvedMemberExpr>(fnExpr)) {
579
- locator =
580
- cs.getConstraintLocator (fnExpr, ConstraintLocator::UnresolvedMember);
581
- } else if (auto *TE = dyn_cast<TypeExpr>(fnExpr)) {
582
- locator = cs.getConstraintLocator (call,
583
- {ConstraintLocator::ApplyFunction,
584
- ConstraintLocator::ConstructorMember},
585
- /* summaryFlags=*/ 0 );
586
- } else {
587
- locator = cs.getConstraintLocator (fnExpr);
588
- }
589
- } else if (auto *SE = dyn_cast<SubscriptExpr>(expr)) {
590
- locator = cs.getConstraintLocator (SE, ConstraintLocator::SubscriptMember);
591
- }
592
-
593
- if (!locator)
594
- return Type ();
595
-
596
- auto choice = getOverloadChoiceIfAvailable (locator);
512
+ auto choice = getChoiceFor (expr);
597
513
if (!choice)
598
514
return Type ();
599
515
0 commit comments