handle_pattern_list.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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(Implicit|Tuple).
  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 HandlePatternListElementAsImplicit(Context& context) -> void {
  15. HandlePatternListElement(context, State::BindingPattern,
  16. State::PatternListElementFinishAsImplicit);
  17. }
  18. auto HandlePatternListElementAsTuple(Context& context) -> void {
  19. HandlePatternListElement(context, State::BindingPattern,
  20. State::PatternListElementFinishAsTuple);
  21. }
  22. // Handles PatternListElementFinishAs(Implicit|Tuple).
  23. static auto HandlePatternListElementFinish(Context& context,
  24. Lex::TokenKind close_token,
  25. State param_state) -> void {
  26. auto state = context.PopState();
  27. if (state.has_error) {
  28. context.ReturnErrorOnState();
  29. }
  30. if (context.ConsumeListToken(NodeKind::PatternListComma, close_token,
  31. state.has_error) ==
  32. Context::ListTokenKind::Comma) {
  33. context.PushStateForPattern(param_state, state.in_var_pattern);
  34. }
  35. }
  36. auto HandlePatternListElementFinishAsImplicit(Context& context) -> void {
  37. HandlePatternListElementFinish(context, Lex::TokenKind::CloseSquareBracket,
  38. State::PatternListElementAsImplicit);
  39. }
  40. auto HandlePatternListElementFinishAsTuple(Context& context) -> void {
  41. HandlePatternListElementFinish(context, Lex::TokenKind::CloseParen,
  42. State::PatternListElementAsTuple);
  43. }
  44. // Handles PatternListAs(Implicit|Tuple).
  45. static auto HandlePatternList(Context& context, NodeKind node_kind,
  46. Lex::TokenKind open_token_kind,
  47. Lex::TokenKind close_token_kind,
  48. State param_state, State finish_state) -> void {
  49. auto state = context.PopState();
  50. context.PushStateForPattern(finish_state, state.in_var_pattern);
  51. context.AddLeafNode(node_kind, context.ConsumeChecked(open_token_kind));
  52. if (!context.PositionIs(close_token_kind)) {
  53. context.PushStateForPattern(param_state, state.in_var_pattern);
  54. }
  55. }
  56. auto HandlePatternListAsImplicit(Context& context) -> void {
  57. HandlePatternList(
  58. context, NodeKind::ImplicitParamListStart,
  59. Lex::TokenKind::OpenSquareBracket, Lex::TokenKind::CloseSquareBracket,
  60. State::PatternListElementAsImplicit, State::PatternListFinishAsImplicit);
  61. }
  62. auto HandlePatternListAsTuple(Context& context) -> void {
  63. HandlePatternList(context, NodeKind::TuplePatternStart,
  64. Lex::TokenKind::OpenParen, Lex::TokenKind::CloseParen,
  65. State::PatternListElementAsTuple,
  66. State::PatternListFinishAsTuple);
  67. }
  68. // Handles PatternListFinishAs(Implicit|Tuple).
  69. static auto HandlePatternListFinish(Context& context, NodeKind node_kind,
  70. Lex::TokenKind token_kind) -> void {
  71. auto state = context.PopState();
  72. context.AddNode(node_kind, context.ConsumeChecked(token_kind),
  73. state.has_error);
  74. }
  75. auto HandlePatternListFinishAsImplicit(Context& context) -> void {
  76. HandlePatternListFinish(context, NodeKind::ImplicitParamList,
  77. Lex::TokenKind::CloseSquareBracket);
  78. }
  79. auto HandlePatternListFinishAsTuple(Context& context) -> void {
  80. HandlePatternListFinish(context, NodeKind::TuplePattern,
  81. Lex::TokenKind::CloseParen);
  82. }
  83. } // namespace Carbon::Parse