handle_param.cpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. namespace Carbon::Parse {
  6. // Handles ParamAs(Implicit|Regular).
  7. static auto HandleParam(Context& context, State pattern_state,
  8. State finish_state) -> void {
  9. context.PopAndDiscardState();
  10. context.PushState(finish_state);
  11. context.PushState(pattern_state);
  12. }
  13. auto HandleParamAsImplicit(Context& context) -> void {
  14. HandleParam(context, State::BindingPattern, State::ParamFinishAsImplicit);
  15. }
  16. auto HandleParamAsRegular(Context& context) -> void {
  17. HandleParam(context, State::BindingPattern, State::ParamFinishAsRegular);
  18. }
  19. // Handles ParamFinishAs(Implicit|Regular).
  20. static auto HandleParamFinish(Context& context, Lex::TokenKind close_token,
  21. State param_state) -> void {
  22. auto state = context.PopState();
  23. if (state.has_error) {
  24. context.ReturnErrorOnState();
  25. }
  26. if (context.ConsumeListToken(NodeKind::ParamListComma, close_token,
  27. state.has_error) ==
  28. Context::ListTokenKind::Comma) {
  29. context.PushState(param_state);
  30. }
  31. }
  32. auto HandleParamFinishAsImplicit(Context& context) -> void {
  33. HandleParamFinish(context, Lex::TokenKind::CloseSquareBracket,
  34. State::ParamAsImplicit);
  35. }
  36. auto HandleParamFinishAsRegular(Context& context) -> void {
  37. HandleParamFinish(context, Lex::TokenKind::CloseParen, State::ParamAsRegular);
  38. }
  39. // Handles ParamListAs(Implicit|Regular).
  40. static auto HandleParamList(Context& context, NodeKind parse_node_kind,
  41. Lex::TokenKind open_token_kind,
  42. Lex::TokenKind close_token_kind, State param_state,
  43. State finish_state) -> void {
  44. context.PopAndDiscardState();
  45. context.PushState(finish_state);
  46. context.AddLeafNode(parse_node_kind, context.ConsumeChecked(open_token_kind));
  47. if (!context.PositionIs(close_token_kind)) {
  48. context.PushState(param_state);
  49. }
  50. }
  51. auto HandleParamListAsImplicit(Context& context) -> void {
  52. HandleParamList(context, NodeKind::ImplicitParamListStart,
  53. Lex::TokenKind::OpenSquareBracket,
  54. Lex::TokenKind::CloseSquareBracket, State::ParamAsImplicit,
  55. State::ParamListFinishAsImplicit);
  56. }
  57. auto HandleParamListAsRegular(Context& context) -> void {
  58. HandleParamList(context, NodeKind::ParamListStart, Lex::TokenKind::OpenParen,
  59. Lex::TokenKind::CloseParen, State::ParamAsRegular,
  60. State::ParamListFinishAsRegular);
  61. }
  62. // Handles ParamListFinishAs(Implicit|Regular).
  63. static auto HandleParamListFinish(Context& context, NodeKind parse_node_kind,
  64. Lex::TokenKind token_kind) -> void {
  65. auto state = context.PopState();
  66. context.AddNode(parse_node_kind, context.ConsumeChecked(token_kind),
  67. state.subtree_start, state.has_error);
  68. }
  69. auto HandleParamListFinishAsImplicit(Context& context) -> void {
  70. HandleParamListFinish(context, NodeKind::ImplicitParamList,
  71. Lex::TokenKind::CloseSquareBracket);
  72. }
  73. auto HandleParamListFinishAsRegular(Context& context) -> void {
  74. HandleParamListFinish(context, NodeKind::ParamList,
  75. Lex::TokenKind::CloseParen);
  76. }
  77. } // namespace Carbon::Parse