parser_handle_parameter.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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/parser/parser_context.h"
  5. namespace Carbon {
  6. // Handles ParameterAs(Deduced|Regular).
  7. static auto ParserHandleParameter(ParserContext& context,
  8. ParserState pattern_state,
  9. ParserState finish_state) -> void {
  10. context.PopAndDiscardState();
  11. context.PushState(finish_state);
  12. context.PushState(pattern_state);
  13. }
  14. auto ParserHandleParameterAsDeduced(ParserContext& context) -> void {
  15. ParserHandleParameter(context, ParserState::PatternAsDeducedParameter,
  16. ParserState::ParameterFinishAsDeduced);
  17. }
  18. auto ParserHandleParameterAsRegular(ParserContext& context) -> void {
  19. ParserHandleParameter(context, ParserState::PatternAsParameter,
  20. ParserState::ParameterFinishAsRegular);
  21. }
  22. // Handles ParameterFinishAs(Deduced|Regular).
  23. static auto ParserHandleParameterFinish(ParserContext& context,
  24. TokenKind close_token,
  25. ParserState param_state) -> void {
  26. auto state = context.PopState();
  27. if (state.has_error) {
  28. context.ReturnErrorOnState();
  29. }
  30. if (context.ConsumeListToken(ParseNodeKind::ParameterListComma, close_token,
  31. state.has_error) ==
  32. ParserContext::ListTokenKind::Comma) {
  33. context.PushState(param_state);
  34. }
  35. }
  36. auto ParserHandleParameterFinishAsDeduced(ParserContext& context) -> void {
  37. ParserHandleParameterFinish(context, TokenKind::CloseSquareBracket,
  38. ParserState::ParameterAsDeduced);
  39. }
  40. auto ParserHandleParameterFinishAsRegular(ParserContext& context) -> void {
  41. ParserHandleParameterFinish(context, TokenKind::CloseParen,
  42. ParserState::ParameterAsRegular);
  43. }
  44. // Handles ParameterListAs(Deduced|Regular).
  45. static auto ParserHandleParameterList(ParserContext& context,
  46. ParseNodeKind parse_node_kind,
  47. TokenKind open_token_kind,
  48. TokenKind close_token_kind,
  49. ParserState param_state,
  50. ParserState finish_state) -> void {
  51. context.PopAndDiscardState();
  52. context.PushState(finish_state);
  53. context.AddLeafNode(parse_node_kind, context.ConsumeChecked(open_token_kind));
  54. if (!context.PositionIs(close_token_kind)) {
  55. context.PushState(param_state);
  56. }
  57. }
  58. auto ParserHandleParameterListAsDeduced(ParserContext& context) -> void {
  59. ParserHandleParameterList(context, ParseNodeKind::DeducedParameterListStart,
  60. TokenKind::OpenSquareBracket,
  61. TokenKind::CloseSquareBracket,
  62. ParserState::ParameterAsDeduced,
  63. ParserState::ParameterListFinishAsDeduced);
  64. }
  65. auto ParserHandleParameterListAsRegular(ParserContext& context) -> void {
  66. ParserHandleParameterList(context, ParseNodeKind::ParameterListStart,
  67. TokenKind::OpenParen, TokenKind::CloseParen,
  68. ParserState::ParameterAsRegular,
  69. ParserState::ParameterListFinishAsRegular);
  70. }
  71. // Handles ParameterListFinishAs(Deduced|Regular).
  72. static auto ParserHandleParameterListFinish(ParserContext& context,
  73. ParseNodeKind parse_node_kind,
  74. TokenKind token_kind) -> void {
  75. auto state = context.PopState();
  76. context.AddNode(parse_node_kind, context.ConsumeChecked(token_kind),
  77. state.subtree_start, state.has_error);
  78. }
  79. auto ParserHandleParameterListFinishAsDeduced(ParserContext& context) -> void {
  80. ParserHandleParameterListFinish(context, ParseNodeKind::DeducedParameterList,
  81. TokenKind::CloseSquareBracket);
  82. }
  83. auto ParserHandleParameterListFinishAsRegular(ParserContext& context) -> void {
  84. ParserHandleParameterListFinish(context, ParseNodeKind::ParameterList,
  85. TokenKind::CloseParen);
  86. }
  87. } // namespace Carbon