| 338 | AstTraversal::~AstTraversal() = default; |
| 339 | |
| 340 | bool AstTraversal::Step(AstVisitor& visitor) { |
| 341 | if (IsDone()) { |
| 342 | return false; |
| 343 | } |
| 344 | auto& stack = state_->stack; |
| 345 | StackRecord& record = stack.top(); |
| 346 | if (!record.visited) { |
| 347 | PreVisit(record, &visitor); |
| 348 | PushDependencies(record, stack, options_); |
| 349 | record.visited = true; |
| 350 | } else { |
| 351 | PostVisit(record, &visitor); |
| 352 | stack.pop(); |
| 353 | } |
| 354 | |
| 355 | return !stack.empty(); |
| 356 | } |
| 357 | |
| 358 | bool AstTraversal::IsDone() { |
| 359 | return state_ == nullptr || state_->stack.empty(); |