handle_pattern_list.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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/parse/context.h"
  5. #include "toolchain/parse/handle.h"
  6. namespace Carbon::Parse {
  7. // Handles PatternListElementAs(Tuple|Explicit|Implicit).
  8. static auto HandlePatternListElement(Context& context, State pattern_state,
  9. State finish_state) -> void {
  10. auto state = context.PopState();
  11. context.PushStateForPattern(finish_state, state.in_var_pattern);
  12. context.PushStateForPattern(pattern_state, state.in_var_pattern);
  13. }
  14. auto HandlePatternListElementAsTuple(Context& context) -> void {
  15. HandlePatternListElement(context, State::Pattern,
  16. State::PatternListElementFinishAsTuple);
  17. }
  18. auto HandlePatternListElementAsExplicit(Context& context) -> void {
  19. HandlePatternListElement(context, State::Pattern,
  20. State::PatternListElementFinishAsExplicit);
  21. }
  22. auto HandlePatternListElementAsImplicit(Context& context) -> void {
  23. HandlePatternListElement(context, State::Pattern,
  24. State::PatternListElementFinishAsImplicit);
  25. }
  26. // Handles PatternListElementFinishAs(Tuple|Explicit|Implicit).
  27. static auto HandlePatternListElementFinish(Context& context,
  28. Lex::TokenKind close_token,
  29. State param_state) -> void {
  30. auto state = context.PopState();
  31. if (state.has_error) {
  32. context.ReturnErrorOnState();
  33. }
  34. if (context.ConsumeListToken(NodeKind::PatternListComma, close_token,
  35. state.has_error) ==
  36. Context::ListTokenKind::Comma) {
  37. context.PushStateForPattern(param_state, state.in_var_pattern);
  38. }
  39. }
  40. auto HandlePatternListElementFinishAsTuple(Context& context) -> void {
  41. HandlePatternListElementFinish(context, Lex::TokenKind::CloseParen,
  42. State::PatternListElementAsTuple);
  43. }
  44. auto HandlePatternListElementFinishAsExplicit(Context& context) -> void {
  45. HandlePatternListElementFinish(context, Lex::TokenKind::CloseParen,
  46. State::PatternListElementAsExplicit);
  47. }
  48. auto HandlePatternListElementFinishAsImplicit(Context& context) -> void {
  49. HandlePatternListElementFinish(context, Lex::TokenKind::CloseSquareBracket,
  50. State::PatternListElementAsImplicit);
  51. }
  52. // Handles PatternListAs(Tuple|Explicit|Implicit).
  53. static auto HandlePatternList(Context& context, NodeKind node_kind,
  54. Lex::TokenKind open_token_kind,
  55. Lex::TokenKind close_token_kind,
  56. State param_state, State finish_state) -> void {
  57. auto state = context.PopState();
  58. context.PushStateForPattern(finish_state, state.in_var_pattern);
  59. context.AddLeafNode(node_kind, context.ConsumeChecked(open_token_kind));
  60. if (!context.PositionIs(close_token_kind)) {
  61. context.PushStateForPattern(param_state, state.in_var_pattern);
  62. }
  63. }
  64. auto HandlePatternListAsTuple(Context& context) -> void {
  65. HandlePatternList(context, NodeKind::TuplePatternStart,
  66. Lex::TokenKind::OpenParen, Lex::TokenKind::CloseParen,
  67. State::PatternListElementAsTuple,
  68. State::PatternListFinishAsTuple);
  69. }
  70. auto HandlePatternListAsExplicit(Context& context) -> void {
  71. HandlePatternList(context, NodeKind::ExplicitParamListStart,
  72. Lex::TokenKind::OpenParen, Lex::TokenKind::CloseParen,
  73. State::PatternListElementAsExplicit,
  74. State::PatternListFinishAsExplicit);
  75. }
  76. auto HandlePatternListAsImplicit(Context& context) -> void {
  77. HandlePatternList(
  78. context, NodeKind::ImplicitParamListStart,
  79. Lex::TokenKind::OpenSquareBracket, Lex::TokenKind::CloseSquareBracket,
  80. State::PatternListElementAsImplicit, State::PatternListFinishAsImplicit);
  81. }
  82. // Handles PatternListFinishAs(Tuple|Explicit|Implicit).
  83. static auto HandlePatternListFinish(Context& context, NodeKind node_kind,
  84. Lex::TokenKind token_kind) -> void {
  85. auto state = context.PopState();
  86. context.AddNode(node_kind, context.ConsumeChecked(token_kind),
  87. state.has_error);
  88. }
  89. auto HandlePatternListFinishAsTuple(Context& context) -> void {
  90. HandlePatternListFinish(context, NodeKind::TuplePattern,
  91. Lex::TokenKind::CloseParen);
  92. }
  93. auto HandlePatternListFinishAsExplicit(Context& context) -> void {
  94. HandlePatternListFinish(context, NodeKind::ExplicitParamList,
  95. Lex::TokenKind::CloseParen);
  96. }
  97. auto HandlePatternListFinishAsImplicit(Context& context) -> void {
  98. HandlePatternListFinish(context, NodeKind::ImplicitParamList,
  99. Lex::TokenKind::CloseSquareBracket);
  100. }
  101. } // namespace Carbon::Parse