handle_param.cpp 3.4 KB

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