parse_subtree_consumer.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "toolchain/semantics/parse_subtree_consumer.h"
  5. #include "common/check.h"
  6. namespace Carbon {
  7. auto ParseSubtreeConsumer::ForParent(const ParseTree& parse_tree,
  8. ParseTree::Node parent_node)
  9. -> ParseSubtreeConsumer {
  10. auto range = llvm::reverse(parse_tree.postorder(parent_node));
  11. // The cursor should be one after the parent.
  12. return ParseSubtreeConsumer(parse_tree, ++range.begin(), range.end());
  13. }
  14. auto ParseSubtreeConsumer::ForTree(const ParseTree& parse_tree)
  15. -> ParseSubtreeConsumer {
  16. auto range = llvm::reverse(parse_tree.postorder());
  17. return ParseSubtreeConsumer(parse_tree, range.begin(), range.end());
  18. }
  19. ParseSubtreeConsumer::~ParseSubtreeConsumer() {
  20. CARBON_CHECK(is_done()) << "At index " << (*cursor_).index() << ", unhandled "
  21. << parse_tree_->node_kind(*cursor_);
  22. }
  23. auto ParseSubtreeConsumer::RequireConsume() -> ParseTree::Node {
  24. CARBON_CHECK(!is_done()) << "Done with subtree, expected more";
  25. return GetNodeAndAdvance();
  26. }
  27. auto ParseSubtreeConsumer::RequireConsume(ParseNodeKind node_kind)
  28. -> ParseTree::Node {
  29. CARBON_CHECK(!is_done()) << "Done with subtree, expected " << node_kind;
  30. auto node = GetNodeAndAdvance();
  31. CARBON_CHECK(node_kind == parse_tree_->node_kind(node))
  32. << "At index " << node.index() << ", expected " << node_kind << ", found "
  33. << parse_tree_->node_kind(node);
  34. return node;
  35. }
  36. auto ParseSubtreeConsumer::TryConsume() -> llvm::Optional<ParseTree::Node> {
  37. if (is_done()) {
  38. return llvm::None;
  39. }
  40. return GetNodeAndAdvance();
  41. }
  42. auto ParseSubtreeConsumer::TryConsume(ParseNodeKind node_kind)
  43. -> llvm::Optional<ParseTree::Node> {
  44. if (is_done() || node_kind != parse_tree_->node_kind(*cursor_)) {
  45. return llvm::None;
  46. }
  47. return GetNodeAndAdvance();
  48. }
  49. auto ParseSubtreeConsumer::GetNodeAndAdvance() -> ParseTree::Node {
  50. auto node = *cursor_;
  51. cursor_ += parse_tree_->node_subtree_size(node);
  52. return node;
  53. }
  54. } // namespace Carbon