@@ -105,33 +105,9 @@ Expr *FailureDiagnostic::getArgumentExprFor(Expr *anchor) const {
105
105
return nullptr ;
106
106
}
107
107
108
- // TODO: Replace duplications of this logic with calls to this.
109
- Optional<SelectedOverload> FailureDiagnostic::getChoiceFor (Expr *expr) {
108
+ Optional<SelectedOverload> FailureDiagnostic::getChoiceFor (Expr *expr) const {
110
109
auto &cs = getConstraintSystem ();
111
- ConstraintLocator *locator = nullptr ;
112
-
113
- if (auto *AE = dyn_cast<ApplyExpr>(expr)) {
114
- if (auto *TE = dyn_cast<TypeExpr>(AE->getFn ())) {
115
- locator = cs.getConstraintLocator (AE,
116
- {ConstraintLocator::ApplyFunction,
117
- ConstraintLocator::ConstructorMember},
118
- /* summaryFlags=*/ 0 );
119
- }
120
- return getChoiceFor (AE->getFn ());
121
- } else if (auto *UDE = dyn_cast<UnresolvedDotExpr>(expr)) {
122
- locator = cs.getConstraintLocator (UDE, ConstraintLocator::Member);
123
- } else if (auto *UME = dyn_cast<UnresolvedMemberExpr>(expr)) {
124
- locator = cs.getConstraintLocator (UME, ConstraintLocator::UnresolvedMember);
125
- } else if (auto *SE = dyn_cast<SubscriptExpr>(expr)) {
126
- locator = cs.getConstraintLocator (SE, ConstraintLocator::SubscriptMember);
127
- } else {
128
- locator = cs.getConstraintLocator (expr);
129
- }
130
-
131
- if (!locator)
132
- return None;
133
-
134
- return getOverloadChoiceIfAvailable (locator);
110
+ return getOverloadChoiceIfAvailable (cs.getCalleeLocator (expr));
135
111
}
136
112
137
113
Type RequirementFailure::getOwnerType () const {
@@ -191,10 +167,6 @@ ProtocolConformance *RequirementFailure::getConformanceForConditionalReq(
191
167
192
168
ValueDecl *RequirementFailure::getDeclRef () const {
193
169
auto &cs = getConstraintSystem ();
194
- auto &TC = getTypeChecker ();
195
-
196
- auto *anchor = getRawAnchor ();
197
- auto *locator = cs.getConstraintLocator (anchor);
198
170
199
171
// Get a declaration associated with given type (if any).
200
172
// This is used to retrieve affected declaration when
@@ -216,38 +188,7 @@ ValueDecl *RequirementFailure::getDeclRef() const {
216
188
if (isFromContextualType ())
217
189
return getAffectedDeclFromType (cs.getContextualType ());
218
190
219
- if (auto *AE = dyn_cast<CallExpr>(anchor)) {
220
- // NOTE: In valid code, the function can only be a TypeExpr
221
- assert (isa<TypeExpr>(AE->getFn ()) ||
222
- isa<OverloadedDeclRefExpr>(AE->getFn ()));
223
- ConstraintLocatorBuilder ctor (locator);
224
- locator = cs.getConstraintLocator (
225
- ctor.withPathElement (PathEltKind::ApplyFunction)
226
- .withPathElement (PathEltKind::ConstructorMember));
227
- } else if (auto *UDE = dyn_cast<UnresolvedDotExpr>(anchor)) {
228
- ConstraintLocatorBuilder member (locator);
229
-
230
- if (TC.getSelfForInitDelegationInConstructor (getDC (), UDE)) {
231
- member = member.withPathElement (PathEltKind::ConstructorMember);
232
- } else {
233
- member = member.withPathElement (PathEltKind::Member);
234
- }
235
-
236
- locator = cs.getConstraintLocator (member);
237
- } else if (auto *UME = dyn_cast<UnresolvedMemberExpr>(anchor)) {
238
- locator = cs.getConstraintLocator (locator, PathEltKind::UnresolvedMember);
239
- } else if (isa<SubscriptExpr>(anchor)) {
240
- ConstraintLocatorBuilder subscript (locator);
241
- locator = cs.getConstraintLocator (
242
- subscript.withPathElement (PathEltKind::SubscriptMember));
243
- } else if (isa<MemberRefExpr>(anchor)) {
244
- ConstraintLocatorBuilder memberRef (locator);
245
- locator =
246
- cs.getConstraintLocator (memberRef.withPathElement (PathEltKind::Member));
247
- }
248
-
249
- auto overload = getOverloadChoiceIfAvailable (locator);
250
- if (overload)
191
+ if (auto overload = getChoiceFor (getRawAnchor ()))
251
192
return overload->choice .getDecl ();
252
193
253
194
return getAffectedDeclFromType (getOwnerType ());
@@ -576,32 +517,7 @@ bool NoEscapeFuncToTypeConversionFailure::diagnoseParameterUse() const {
576
517
577
518
Type NoEscapeFuncToTypeConversionFailure::getParameterTypeFor (
578
519
Expr *expr, unsigned paramIdx) const {
579
- auto &cs = getConstraintSystem ();
580
- ConstraintLocator *locator = nullptr ;
581
-
582
- if (auto *call = dyn_cast<CallExpr>(expr)) {
583
- auto *fnExpr = call->getFn ();
584
- if (isa<UnresolvedDotExpr>(fnExpr)) {
585
- locator = cs.getConstraintLocator (fnExpr, ConstraintLocator::Member);
586
- } else if (isa<UnresolvedMemberExpr>(fnExpr)) {
587
- locator =
588
- cs.getConstraintLocator (fnExpr, ConstraintLocator::UnresolvedMember);
589
- } else if (auto *TE = dyn_cast<TypeExpr>(fnExpr)) {
590
- locator = cs.getConstraintLocator (call,
591
- {ConstraintLocator::ApplyFunction,
592
- ConstraintLocator::ConstructorMember},
593
- /* summaryFlags=*/ 0 );
594
- } else {
595
- locator = cs.getConstraintLocator (fnExpr);
596
- }
597
- } else if (auto *SE = dyn_cast<SubscriptExpr>(expr)) {
598
- locator = cs.getConstraintLocator (SE, ConstraintLocator::SubscriptMember);
599
- }
600
-
601
- if (!locator)
602
- return Type ();
603
-
604
- auto choice = getOverloadChoiceIfAvailable (locator);
520
+ auto choice = getChoiceFor (expr);
605
521
if (!choice)
606
522
return Type ();
607
523
0 commit comments