@@ -55,10 +55,12 @@ class SemaAnnotator : public ASTWalker {
55
55
return SEWalker.shouldWalkIntoGenericParams ();
56
56
}
57
57
bool walkToDeclPre (Decl *D) override ;
58
+ bool walkToDeclPreProper (Decl *D);
58
59
std::pair<bool , Expr *> walkToExprPre (Expr *E) override ;
59
60
bool walkToTypeReprPre (TypeRepr *T) override ;
60
61
61
62
bool walkToDeclPost (Decl *D) override ;
63
+ bool walkToDeclPostProper (Decl *D);
62
64
Expr *walkToExprPost (Expr *E) override ;
63
65
bool walkToTypeReprPost (TypeRepr *T) override ;
64
66
@@ -118,6 +120,21 @@ bool SemaAnnotator::walkToDeclPre(Decl *D) {
118
120
return isa<PatternBindingDecl>(D);
119
121
}
120
122
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) {
121
138
if (!handleCustomAttributes (D)) {
122
139
Cancelled = true ;
123
140
return false ;
@@ -203,6 +220,12 @@ bool SemaAnnotator::walkToDeclPre(Decl *D) {
203
220
}
204
221
205
222
bool SemaAnnotator::walkToDeclPost (Decl *D) {
223
+ bool Continue = walkToDeclPostProper (D);
224
+ SEWalker.endBalancedASTOrderDeclVisit (D);
225
+ return Continue;
226
+ }
227
+
228
+ bool SemaAnnotator::walkToDeclPostProper (Decl *D) {
206
229
if (isDone ())
207
230
return false ;
208
231
@@ -580,6 +603,12 @@ bool SemaAnnotator::walkToTypeReprPre(TypeRepr *T) {
580
603
if (isDone ())
581
604
return false ;
582
605
606
+ bool Continue = SEWalker.walkToTypeReprPre (T);
607
+ if (!Continue) {
608
+ Cancelled = true ;
609
+ return false ;
610
+ }
611
+
583
612
if (auto IdT = dyn_cast<ComponentIdentTypeRepr>(T)) {
584
613
if (ValueDecl *VD = IdT->getBoundDecl ()) {
585
614
if (auto *ModD = dyn_cast<ModuleDecl>(VD)) {
@@ -591,11 +620,19 @@ bool SemaAnnotator::walkToTypeReprPre(TypeRepr *T) {
591
620
ReferenceMetaData (SemaReferenceKind::TypeRef, None));
592
621
}
593
622
}
623
+
594
624
return true ;
595
625
}
596
626
597
627
bool 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;
599
636
}
600
637
601
638
std::pair<bool , Pattern *> SemaAnnotator::walkToPatternPre (Pattern *P) {
0 commit comments