parser_handle_declaration_name_and_params.cpp 2.3 KB

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