@@ -226,16 +226,30 @@ class CCExprRemover: public ASTWalker, public ExprVisitor<CCExprRemover, Expr *>
226
226
} else if (auto tuple = dyn_cast<TupleExpr>(E->getArg ())) {
227
227
lParenLoc = tuple->getLParenLoc ();
228
228
rParenLoc = tuple->getRParenLoc ();
229
+
230
+ assert ((!E->getUnlabeledTrailingClosureIndex ().hasValue () ||
231
+ (tuple->getNumElements () == E->getArgumentLabels ().size () &&
232
+ tuple->getNumElements () == E->getArgumentLabelLocs ().size ())) &&
233
+ " CallExpr with trailing closure must have the same number of "
234
+ " argument labels" );
235
+ assert (tuple->getNumElements () == E->getArgumentLabels ().size ());
236
+ assert (tuple->getNumElements () == E->getArgumentLabelLocs ().size () ||
237
+ E->getArgumentLabelLocs ().size () == 0 );
238
+
239
+ bool hasArgumentLabelLocs = E->getArgumentLabelLocs ().size () > 0 ;
240
+
229
241
for (unsigned i = 0 , e = tuple->getNumElements (); i != e; ++i) {
230
242
if (isa<CodeCompletionExpr>(tuple->getElement (i))) {
231
243
removing = true ;
232
244
continue ;
233
245
}
234
246
235
- if (i < E->getUnlabeledTrailingClosureIndex ()) {
247
+ if (!E->getUnlabeledTrailingClosureIndex ().hasValue () ||
248
+ i < *E->getUnlabeledTrailingClosureIndex ()) {
236
249
// Normal arguments.
237
250
argLabels.push_back (E->getArgumentLabels ()[i]);
238
- argLabelLocs.push_back (E->getArgumentLabelLocs ()[i]);
251
+ if (hasArgumentLabelLocs)
252
+ argLabelLocs.push_back (E->getArgumentLabelLocs ()[i]);
239
253
args.push_back (tuple->getElement (i));
240
254
} else {
241
255
// Trailing closure arguments.
@@ -259,7 +273,20 @@ class CCExprRemover: public ASTWalker, public ExprVisitor<CCExprRemover, Expr *>
259
273
}
260
274
261
275
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
262
- return {true , visit (E)};
276
+ if (Removed)
277
+ return {false , nullptr };
278
+ E = visit (E);
279
+ return {!Removed, E};
280
+ }
281
+
282
+ std::pair<bool , Stmt *> walkToStmtPre (Stmt *S) override {
283
+ if (Removed)
284
+ return {false , nullptr };
285
+ return {true , S};
286
+ }
287
+
288
+ bool walkToDeclPre (Decl *D) override {
289
+ return !Removed;
263
290
}
264
291
};
265
292
}
0 commit comments