parse_subtree_consumer.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. #include "llvm/ADT/None.h"
  7. #include "llvm/ADT/Optional.h"
  8. #include "toolchain/parser/parse_node_kind.h"
  9. #include "toolchain/parser/parse_tree.h"
  10. namespace Carbon {
  11. auto ParseSubtreeConsumer::ForParent(const ParseTree& parse_tree,
  12. ParseTree::Node parent_node)
  13. -> ParseSubtreeConsumer {
  14. auto range = llvm::reverse(parse_tree.postorder(parent_node));
  15. // The cursor should be one after the parent.
  16. return ParseSubtreeConsumer(parse_tree, ++range.begin(), range.end());
  17. }
  18. auto ParseSubtreeConsumer::ForTree(const ParseTree& parse_tree)
  19. -> ParseSubtreeConsumer {
  20. auto range = llvm::reverse(parse_tree.postorder());
  21. return ParseSubtreeConsumer(parse_tree, range.begin(), range.end());
  22. }
  23. ParseSubtreeConsumer::~ParseSubtreeConsumer() {
  24. CARBON_CHECK(is_done()) << "At index " << (*cursor_).index() << ", unhandled "
  25. << parse_tree_->node_kind(*cursor_);
  26. }
  27. auto ParseSubtreeConsumer::RequireConsume() -> ParseTree::Node {
  28. CARBON_CHECK(!is_done()) << "Done with subtree, expected more";
  29. return GetNodeAndAdvance();
  30. }
  31. auto ParseSubtreeConsumer::RequireConsume(ParseNodeKind node_kind)
  32. -> ParseTree::Node {
  33. CARBON_CHECK(!is_done()) << "Done with subtree, expected " << node_kind;
  34. auto node = GetNodeAndAdvance();
  35. CARBON_CHECK(node_kind == parse_tree_->node_kind(node))
  36. << "At index " << node.index() << ", expected " << node_kind << ", found "
  37. << parse_tree_->node_kind(node);
  38. return node;
  39. }
  40. auto ParseSubtreeConsumer::TryConsume() -> llvm::Optional<ParseTree::Node> {
  41. if (is_done()) {
  42. return llvm::None;
  43. }
  44. return GetNodeAndAdvance();
  45. }
  46. auto ParseSubtreeConsumer::TryConsume(ParseNodeKind node_kind)
  47. -> llvm::Optional<ParseTree::Node> {
  48. if (is_done() || node_kind != parse_tree_->node_kind(*cursor_)) {
  49. return llvm::None;
  50. }
  51. return GetNodeAndAdvance();
  52. }
  53. auto ParseSubtreeConsumer::GetNodeAndAdvance() -> ParseTree::Node {
  54. auto node = *cursor_;
  55. cursor_ += parse_tree_->node_subtree_size(node);
  56. return node;
  57. }
  58. } // namespace Carbon