@@ -1223,6 +1223,9 @@ namespace {
1223
1223
}
1224
1224
1225
1225
Type visitObjectLiteralExpr (ObjectLiteralExpr *expr) {
1226
+ associateArgumentLabels (
1227
+ expr, {expr->getArgumentLabels (), expr->hasTrailingClosure ()});
1228
+
1226
1229
// If the expression has already been assigned a type; just use that type.
1227
1230
if (expr->getType ())
1228
1231
return expr->getType ();
@@ -1500,7 +1503,9 @@ namespace {
1500
1503
FunctionType::get (params, outputTy),
1501
1504
memberTy,
1502
1505
CS.getConstraintLocator (expr, ConstraintLocator::ApplyFunction));
1503
-
1506
+
1507
+ associateArgumentLabels (
1508
+ expr, {expr->getArgumentLabels (), expr->hasTrailingClosure ()});
1504
1509
return baseTy;
1505
1510
}
1506
1511
@@ -1734,6 +1739,10 @@ namespace {
1734
1739
if (decl->isInvalid ())
1735
1740
return Type ();
1736
1741
}
1742
+
1743
+ associateArgumentLabels (
1744
+ expr, {expr->getArgumentLabels (), expr->hasTrailingClosure ()});
1745
+
1737
1746
return addSubscriptConstraints (expr, CS.getType (expr->getBase ()),
1738
1747
expr->getIndex (),
1739
1748
decl);
@@ -1988,9 +1997,10 @@ namespace {
1988
1997
}
1989
1998
1990
1999
Type visitDynamicSubscriptExpr (DynamicSubscriptExpr *expr) {
2000
+ associateArgumentLabels (
2001
+ expr, {expr->getArgumentLabels (), expr->hasTrailingClosure ()});
1991
2002
return addSubscriptConstraints (expr, CS.getType (expr->getBase ()),
1992
- expr->getIndex (),
1993
- nullptr );
2003
+ expr->getIndex (), nullptr );
1994
2004
}
1995
2005
1996
2006
Type visitTupleElementExpr (TupleElementExpr *expr) {
@@ -2478,6 +2488,12 @@ namespace {
2478
2488
Type visitApplyExpr (ApplyExpr *expr) {
2479
2489
auto fnExpr = expr->getFn ();
2480
2490
2491
+ SmallVector<Identifier, 4 > scratch;
2492
+ associateArgumentLabels (
2493
+ fnExpr,
2494
+ {expr->getArgumentLabels (scratch), expr->hasTrailingClosure ()},
2495
+ /* labelsArePermanent=*/ isa<CallExpr>(expr));
2496
+
2481
2497
if (auto *UDE = dyn_cast<UnresolvedDotExpr>(fnExpr)) {
2482
2498
auto typeOperation = getTypeOperation (UDE, CS.getASTContext ());
2483
2499
if (typeOperation != TypeOperation::None)
@@ -3208,6 +3224,17 @@ namespace {
3208
3224
}
3209
3225
llvm_unreachable (" unhandled operation" );
3210
3226
}
3227
+
3228
+ void associateArgumentLabels (Expr *fn,
3229
+ ConstraintSystem::ArgumentLabelState labels,
3230
+ bool labelsArePermanent = true ) {
3231
+ fn = getArgumentLabelTargetExpr (fn);
3232
+
3233
+ // Record the labels.
3234
+ if (!labelsArePermanent)
3235
+ labels.Labels = CS.allocateCopy (labels.Labels );
3236
+ CS.ArgumentLabels [CS.getConstraintLocator (fn)] = labels;
3237
+ }
3211
3238
};
3212
3239
3213
3240
// / AST walker that "sanitizes" an expression for the
@@ -3641,69 +3668,12 @@ namespace {
3641
3668
// / Ignore declarations.
3642
3669
bool walkToDeclPre (Decl *decl) override { return false ; }
3643
3670
};
3644
-
3645
- // / AST walker that records the keyword arguments provided at each
3646
- // / call site.
3647
- class ArgumentLabelWalker : public ASTWalker {
3648
- ConstraintSystem &CS;
3649
- llvm::DenseMap<Expr *, Expr *> ParentMap;
3650
-
3651
- public:
3652
- ArgumentLabelWalker (ConstraintSystem &cs, Expr *expr)
3653
- : CS(cs), ParentMap(expr->getParentMap ()) { }
3654
-
3655
- using State = ConstraintSystem::ArgumentLabelState;
3656
-
3657
- void associateArgumentLabels (Expr *fn, State labels,
3658
- bool labelsArePermanent) {
3659
- fn = getArgumentLabelTargetExpr (fn);
3660
-
3661
- // Record the labels.
3662
- if (!labelsArePermanent)
3663
- labels.Labels = CS.allocateCopy (labels.Labels );
3664
- CS.ArgumentLabels [CS.getConstraintLocator (fn)] = labels;
3665
- }
3666
-
3667
- std::pair<bool , Expr *> walkToExprPre (Expr *expr) override {
3668
- if (auto call = dyn_cast<CallExpr>(expr)) {
3669
- associateArgumentLabels (call->getFn (),
3670
- { call->getArgumentLabels (),
3671
- call->hasTrailingClosure () },
3672
- /* labelsArePermanent=*/ true );
3673
- return { true , expr };
3674
- }
3675
-
3676
- if (auto subscript = dyn_cast<SubscriptExpr>(expr)) {
3677
- associateArgumentLabels (subscript,
3678
- { subscript->getArgumentLabels (),
3679
- subscript->hasTrailingClosure () },
3680
- /* labelsArePermanent=*/ true );
3681
- return { true , expr };
3682
- }
3683
-
3684
- if (auto unresolvedMember = dyn_cast<UnresolvedMemberExpr>(expr)) {
3685
- associateArgumentLabels (unresolvedMember,
3686
- { unresolvedMember->getArgumentLabels (),
3687
- unresolvedMember->hasTrailingClosure () },
3688
- /* labelsArePermanent=*/ true );
3689
- return { true , expr };
3690
- }
3691
-
3692
- // FIXME: other expressions have argument labels, but this is an
3693
- // optimization, so stage it in later.
3694
- return { true , expr };
3695
- }
3696
- };
3697
-
3698
3671
} // end anonymous namespace
3699
3672
3700
3673
Expr *ConstraintSystem::generateConstraints (Expr *expr, DeclContext *dc) {
3701
3674
// Remove implicit conversions from the expression.
3702
3675
expr = expr->walk (SanitizeExpr (*this ));
3703
3676
3704
- // Walk the expression to associate labeled arguments.
3705
- expr->walk (ArgumentLabelWalker (*this , expr));
3706
-
3707
3677
// Walk the expression, generating constraints.
3708
3678
ConstraintGenerator cg (*this , dc);
3709
3679
ConstraintWalker cw (cg);
0 commit comments