@@ -265,12 +265,8 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
265
265
}
266
266
267
267
bool visitNominalTypeDecl (NominalTypeDecl *NTD) {
268
- bool WalkGenerics = NTD->getGenericParams () &&
269
- Walker.shouldWalkIntoGenericParams ();
270
268
271
- if (WalkGenerics) {
272
- visitGenericParamList (NTD->getGenericParams ());
273
- }
269
+ bool WalkGenerics = visitGenericParamListIfNeeded (NTD);
274
270
275
271
for (auto &Inherit : NTD->getInherited ()) {
276
272
if (doIt (Inherit))
@@ -329,11 +325,8 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
329
325
}
330
326
331
327
bool visitSubscriptDecl (SubscriptDecl *SD) {
332
- bool WalkGenerics = SD->getGenericParams () &&
333
- Walker.shouldWalkIntoGenericParams ();
334
- if (WalkGenerics) {
335
- visitGenericParamList (SD->getGenericParams ());
336
- }
328
+ bool WalkGenerics = visitGenericParamListIfNeeded (SD);
329
+
337
330
visit (SD->getIndices ());
338
331
if (doIt (SD->getElementTypeLoc ()))
339
332
return true ;
@@ -364,14 +357,9 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
364
357
PrettyStackTraceDecl debugStack (" walking into body of" , AFD);
365
358
#endif
366
359
367
- bool WalkGenerics = AFD->getGenericParams () &&
368
- Walker.shouldWalkIntoGenericParams () &&
360
+ bool WalkGenerics =
369
361
// accessor generics are visited from the storage decl
370
- !isa<AccessorDecl>(AFD);
371
-
372
- if (WalkGenerics) {
373
- visitGenericParamList (AFD->getGenericParams ());
374
- }
362
+ !isa<AccessorDecl>(AFD) && visitGenericParamListIfNeeded (AFD);
375
363
376
364
if (auto *PD = AFD->getImplicitSelfDecl (/* createIfNeeded=*/ false ))
377
365
visit (PD);
@@ -1353,6 +1341,18 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1353
1341
}
1354
1342
return false ;
1355
1343
}
1344
+
1345
+ private:
1346
+ bool visitGenericParamListIfNeeded (GenericContext *gc) {
1347
+ // Must check this first in case extensions have not been bound yet
1348
+ if (Walker.shouldWalkIntoGenericParams ()) {
1349
+ if (auto *params = gc->getGenericParams ()) {
1350
+ visitGenericParamList (params);
1351
+ return true ;
1352
+ }
1353
+ }
1354
+ return false ;
1355
+ }
1356
1356
};
1357
1357
1358
1358
} // end anonymous namespace
0 commit comments