handle_pattern_list.cpp 5.0 KB

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