Skip to content

Commit fa38b01

Browse files
authored
Merge pull request #26396 from xedin/cleanup-label-retrieval-in-csgen
[ConstraintSystem] NFC: Collect argument labels while generating constraints
2 parents c072c18 + b7cafd0 commit fa38b01

File tree

1 file changed

+30
-60
lines changed

1 file changed

+30
-60
lines changed

lib/Sema/CSGen.cpp

Lines changed: 30 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,9 @@ namespace {
12231223
}
12241224

12251225
Type visitObjectLiteralExpr(ObjectLiteralExpr *expr) {
1226+
associateArgumentLabels(
1227+
expr, {expr->getArgumentLabels(), expr->hasTrailingClosure()});
1228+
12261229
// If the expression has already been assigned a type; just use that type.
12271230
if (expr->getType())
12281231
return expr->getType();
@@ -1500,7 +1503,9 @@ namespace {
15001503
FunctionType::get(params, outputTy),
15011504
memberTy,
15021505
CS.getConstraintLocator(expr, ConstraintLocator::ApplyFunction));
1503-
1506+
1507+
associateArgumentLabels(
1508+
expr, {expr->getArgumentLabels(), expr->hasTrailingClosure()});
15041509
return baseTy;
15051510
}
15061511

@@ -1734,6 +1739,10 @@ namespace {
17341739
if (decl->isInvalid())
17351740
return Type();
17361741
}
1742+
1743+
associateArgumentLabels(
1744+
expr, {expr->getArgumentLabels(), expr->hasTrailingClosure()});
1745+
17371746
return addSubscriptConstraints(expr, CS.getType(expr->getBase()),
17381747
expr->getIndex(),
17391748
decl);
@@ -1988,9 +1997,10 @@ namespace {
19881997
}
19891998

19901999
Type visitDynamicSubscriptExpr(DynamicSubscriptExpr *expr) {
2000+
associateArgumentLabels(
2001+
expr, {expr->getArgumentLabels(), expr->hasTrailingClosure()});
19912002
return addSubscriptConstraints(expr, CS.getType(expr->getBase()),
1992-
expr->getIndex(),
1993-
nullptr);
2003+
expr->getIndex(), nullptr);
19942004
}
19952005

19962006
Type visitTupleElementExpr(TupleElementExpr *expr) {
@@ -2478,6 +2488,12 @@ namespace {
24782488
Type visitApplyExpr(ApplyExpr *expr) {
24792489
auto fnExpr = expr->getFn();
24802490

2491+
SmallVector<Identifier, 4> scratch;
2492+
associateArgumentLabels(
2493+
fnExpr,
2494+
{expr->getArgumentLabels(scratch), expr->hasTrailingClosure()},
2495+
/*labelsArePermanent=*/isa<CallExpr>(expr));
2496+
24812497
if (auto *UDE = dyn_cast<UnresolvedDotExpr>(fnExpr)) {
24822498
auto typeOperation = getTypeOperation(UDE, CS.getASTContext());
24832499
if (typeOperation != TypeOperation::None)
@@ -3208,6 +3224,17 @@ namespace {
32083224
}
32093225
llvm_unreachable("unhandled operation");
32103226
}
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+
}
32113238
};
32123239

32133240
/// AST walker that "sanitizes" an expression for the
@@ -3641,69 +3668,12 @@ namespace {
36413668
/// Ignore declarations.
36423669
bool walkToDeclPre(Decl *decl) override { return false; }
36433670
};
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-
36983671
} // end anonymous namespace
36993672

37003673
Expr *ConstraintSystem::generateConstraints(Expr *expr, DeclContext *dc) {
37013674
// Remove implicit conversions from the expression.
37023675
expr = expr->walk(SanitizeExpr(*this));
37033676

3704-
// Walk the expression to associate labeled arguments.
3705-
expr->walk(ArgumentLabelWalker(*this, expr));
3706-
37073677
// Walk the expression, generating constraints.
37083678
ConstraintGenerator cg(*this, dc);
37093679
ConstraintWalker cw(cg);

0 commit comments

Comments
 (0)