@@ -213,16 +213,30 @@ class CCExprRemover: public ASTWalker, public ExprVisitor<CCExprRemover, Expr *>
213
213
} else if (auto tuple = dyn_cast<TupleExpr>(E->getArg ())) {
214
214
lParenLoc = tuple->getLParenLoc ();
215
215
rParenLoc = tuple->getRParenLoc ();
216
+
217
+ assert ((!E->getUnlabeledTrailingClosureIndex ().hasValue () ||
218
+ (tuple->getNumElements () == E->getArgumentLabels ().size () &&
219
+ tuple->getNumElements () == E->getArgumentLabelLocs ().size ())) &&
220
+ " CallExpr with trailing closure must have the same number of "
221
+ " argument labels" );
222
+ assert (tuple->getNumElements () == E->getArgumentLabels ().size ());
223
+ assert (tuple->getNumElements () == E->getArgumentLabelLocs ().size () ||
224
+ E->getArgumentLabelLocs ().size () == 0 );
225
+
226
+ bool hasArgumentLabelLocs = E->getArgumentLabelLocs ().size () > 0 ;
227
+
216
228
for (unsigned i = 0 , e = tuple->getNumElements (); i != e; ++i) {
217
229
if (isa<CodeCompletionExpr>(tuple->getElement (i))) {
218
230
removing = true ;
219
231
continue ;
220
232
}
221
233
222
- if (i < E->getUnlabeledTrailingClosureIndex ()) {
234
+ if (!E->getUnlabeledTrailingClosureIndex ().hasValue () ||
235
+ i < *E->getUnlabeledTrailingClosureIndex ()) {
223
236
// Normal arguments.
224
237
argLabels.push_back (E->getArgumentLabels ()[i]);
225
- argLabelLocs.push_back (E->getArgumentLabelLocs ()[i]);
238
+ if (hasArgumentLabelLocs)
239
+ argLabelLocs.push_back (E->getArgumentLabelLocs ()[i]);
226
240
args.push_back (tuple->getElement (i));
227
241
} else {
228
242
// Trailing closure arguments.
@@ -246,7 +260,20 @@ class CCExprRemover: public ASTWalker, public ExprVisitor<CCExprRemover, Expr *>
246
260
}
247
261
248
262
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
249
- return {true , visit (E)};
263
+ if (Removed)
264
+ return {false , nullptr };
265
+ E = visit (E);
266
+ return {!Removed, E};
267
+ }
268
+
269
+ std::pair<bool , Stmt *> walkToStmtPre (Stmt *S) override {
270
+ if (Removed)
271
+ return {false , nullptr };
272
+ return {true , S};
273
+ }
274
+
275
+ bool walkToDeclPre (Decl *D) override {
276
+ return !Removed;
250
277
}
251
278
};
252
279
}
0 commit comments