| 160 | } |
| 161 | |
| 162 | void PostVisitExpr(const Expr& expr) override { |
| 163 | size_t idx = parent_stack_.back(); |
| 164 | parent_stack_.pop_back(); |
| 165 | metadata_->postorder.push_back(metadata_->nodes[idx].get()); |
| 166 | NavigableAstNodeData& node = NodeDataAt(idx); |
| 167 | if (!parent_stack_.empty()) { |
| 168 | auto& parent_node_data = NodeDataAt(parent_stack_.back()); |
| 169 | parent_node_data.tree_size += node.tree_size; |
| 170 | parent_node_data.height = |
| 171 | std::max(parent_node_data.height, node.height + 1); |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | std::unique_ptr<NavigableAstMetadata> Consume() && { |
| 176 | return std::move(metadata_); |