@@ -55,10 +55,12 @@ class SemaAnnotator : public ASTWalker {
5555 return SEWalker.shouldWalkIntoGenericParams ();
5656 }
5757 bool walkToDeclPre (Decl *D) override ;
58+ bool walkToDeclPreProper (Decl *D);
5859 std::pair<bool , Expr *> walkToExprPre (Expr *E) override ;
5960 bool walkToTypeReprPre (TypeRepr *T) override ;
6061
6162 bool walkToDeclPost (Decl *D) override ;
63+ bool walkToDeclPostProper (Decl *D);
6264 Expr *walkToExprPost (Expr *E) override ;
6365 bool walkToTypeReprPost (TypeRepr *T) override ;
6466
@@ -118,6 +120,21 @@ bool SemaAnnotator::walkToDeclPre(Decl *D) {
118120 return isa<PatternBindingDecl>(D);
119121 }
120122
123+ SEWalker.beginBalancedASTOrderDeclVisit (D);
124+ bool Continue = walkToDeclPreProper (D);
125+
126+ if (!Continue) {
127+ // To satisfy the contract of balanced calls to
128+ // begin/endBalancedASTOrderDeclVisit, we must call
129+ // endBalancedASTOrderDeclVisit here if walkToDeclPost isn't going to be
130+ // called.
131+ SEWalker.endBalancedASTOrderDeclVisit (D);
132+ }
133+
134+ return Continue;
135+ }
136+
137+ bool SemaAnnotator::walkToDeclPreProper (Decl *D) {
121138 if (!handleCustomAttributes (D)) {
122139 Cancelled = true ;
123140 return false ;
@@ -203,6 +220,12 @@ bool SemaAnnotator::walkToDeclPre(Decl *D) {
203220}
204221
205222bool SemaAnnotator::walkToDeclPost (Decl *D) {
223+ bool Continue = walkToDeclPostProper (D);
224+ SEWalker.endBalancedASTOrderDeclVisit (D);
225+ return Continue;
226+ }
227+
228+ bool SemaAnnotator::walkToDeclPostProper (Decl *D) {
206229 if (isDone ())
207230 return false ;
208231
@@ -580,6 +603,12 @@ bool SemaAnnotator::walkToTypeReprPre(TypeRepr *T) {
580603 if (isDone ())
581604 return false ;
582605
606+ bool Continue = SEWalker.walkToTypeReprPre (T);
607+ if (!Continue) {
608+ Cancelled = true ;
609+ return false ;
610+ }
611+
583612 if (auto IdT = dyn_cast<ComponentIdentTypeRepr>(T)) {
584613 if (ValueDecl *VD = IdT->getBoundDecl ()) {
585614 if (auto *ModD = dyn_cast<ModuleDecl>(VD)) {
@@ -591,11 +620,19 @@ bool SemaAnnotator::walkToTypeReprPre(TypeRepr *T) {
591620 ReferenceMetaData (SemaReferenceKind::TypeRef, None));
592621 }
593622 }
623+
594624 return true ;
595625}
596626
597627bool SemaAnnotator::walkToTypeReprPost (TypeRepr *T) {
598- return !isDone ();
628+ if (isDone ()) {
629+ return false ;
630+ }
631+
632+ bool Continue = SEWalker.walkToTypeReprPost (T);
633+ if (!Continue)
634+ Cancelled = true ;
635+ return Continue;
599636}
600637
601638std::pair<bool , Pattern *> SemaAnnotator::walkToPatternPre (Pattern *P) {
0 commit comments