@@ -364,6 +364,9 @@ class ModelASTWalker : public ASTWalker {
364
364
// / A mapping of argument expressions to their full argument info.
365
365
llvm::DenseMap<Expr *, Argument> ArgumentInfo;
366
366
367
+ // / The number of ArgumentList parents in the walk.
368
+ unsigned ArgumentListDepth = 0 ;
369
+
367
370
public:
368
371
SyntaxModelWalker &Walker;
369
372
ArrayRef<SyntaxNode> TokenNodes;
@@ -383,6 +386,7 @@ class ModelASTWalker : public ASTWalker {
383
386
384
387
std::pair<bool , ArgumentList *>
385
388
walkToArgumentListPre (ArgumentList *ArgList) override ;
389
+ ArgumentList *walkToArgumentListPost (ArgumentList *ArgList) override ;
386
390
387
391
std::pair<bool , Expr *> walkToExprPre (Expr *E) override ;
388
392
Expr *walkToExprPost (Expr *E) override ;
@@ -529,9 +533,19 @@ ModelASTWalker::walkToArgumentListPre(ArgumentList *ArgList) {
529
533
assert (res.second && " Duplicate arguments?" );
530
534
(void )res;
531
535
}
536
+ ArgumentListDepth += 1 ;
532
537
return {true , ArgList};
533
538
}
534
539
540
+ ArgumentList *ModelASTWalker::walkToArgumentListPost (ArgumentList *ArgList) {
541
+ // If there are no more argument lists above us, we can clear out the argument
542
+ // mapping to save memory.
543
+ ArgumentListDepth -= 1 ;
544
+ if (ArgumentListDepth == 0 )
545
+ ArgumentInfo.clear ();
546
+ return ArgList;
547
+ }
548
+
535
549
std::pair<bool , Expr *> ModelASTWalker::walkToExprPre (Expr *E) {
536
550
if (isVisitedBefore (E))
537
551
return {false , E};
0 commit comments