parser_handle_declaration_name_and_params.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 DeclarationNameAndParamsAs(Optional|Required).
  7. static auto ParserHandleDeclarationNameAndParams(ParserContext& context,
  8. bool params_required) -> void {
  9. auto state = context.PopState();
  10. if (!context.ConsumeAndAddLeafNodeIf(TokenKind::Identifier,
  11. ParseNodeKind::Name)) {
  12. CARBON_DIAGNOSTIC(ExpectedDeclarationName, Error,
  13. "`{0}` introducer should be followed by a name.",
  14. TokenKind);
  15. context.emitter().Emit(*context.position(), ExpectedDeclarationName,
  16. context.tokens().GetKind(state.token));
  17. context.ReturnErrorOnState();
  18. return;
  19. }
  20. if (context.PositionIs(TokenKind::OpenSquareBracket)) {
  21. context.PushState(ParserState::DeclarationNameAndParamsAfterDeduced);
  22. context.PushState(ParserState::ParameterListAsDeduced);
  23. } else if (context.PositionIs(TokenKind::OpenParen)) {
  24. context.PushState(ParserState::ParameterListAsRegular);
  25. } else if (params_required) {
  26. CARBON_DIAGNOSTIC(ParametersRequiredByIntroducer, Error,
  27. "`{0}` requires a `(` for parameters.", TokenKind);
  28. context.emitter().Emit(*context.position(), ParametersRequiredByIntroducer,
  29. context.tokens().GetKind(state.token));
  30. context.ReturnErrorOnState();
  31. }
  32. }
  33. auto ParserHandleDeclarationNameAndParamsAsOptional(ParserContext& context)
  34. -> void {
  35. ParserHandleDeclarationNameAndParams(context, /*params_required=*/false);
  36. }
  37. auto ParserHandleDeclarationNameAndParamsAsRequired(ParserContext& context)
  38. -> void {
  39. ParserHandleDeclarationNameAndParams(context, /*params_required=*/true);
  40. }
  41. auto ParserHandleDeclarationNameAndParamsAfterDeduced(ParserContext& context)
  42. -> void {
  43. context.PopAndDiscardState();
  44. if (context.PositionIs(TokenKind::OpenParen)) {
  45. context.PushState(ParserState::ParameterListAsRegular);
  46. } else {
  47. CARBON_DIAGNOSTIC(
  48. ParametersRequiredByDeduced, Error,
  49. "A `(` for parameters is required after deduced parameters.");
  50. context.emitter().Emit(*context.position(), ParametersRequiredByDeduced);
  51. context.ReturnErrorOnState();
  52. }
  53. }
  54. } // namespace Carbon