handle_decl_definition.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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 processing after params, deciding whether it's a declaration or
  7. // definition.
  8. static auto HandleDeclOrDefinition(Context& context, NodeKind decl_kind,
  9. NodeKind definition_start_kind,
  10. State definition_finish_state) -> void {
  11. auto state = context.PopState();
  12. if (state.has_error) {
  13. context.RecoverFromDeclError(state, decl_kind,
  14. /*skip_past_likely_end=*/true);
  15. return;
  16. }
  17. if (auto semi = context.ConsumeIf(Lex::TokenKind::Semi)) {
  18. context.AddNode(decl_kind, *semi, state.subtree_start, state.has_error);
  19. return;
  20. }
  21. if (!context.PositionIs(Lex::TokenKind::OpenCurlyBrace)) {
  22. context.EmitExpectedDeclSemiOrDefinition(
  23. context.tokens().GetKind(state.token));
  24. context.RecoverFromDeclError(state, decl_kind,
  25. /*skip_past_likely_end=*/true);
  26. return;
  27. }
  28. context.PushState(state, definition_finish_state);
  29. context.PushState(State::DeclScopeLoop);
  30. context.AddNode(definition_start_kind, context.Consume(), state.subtree_start,
  31. state.has_error);
  32. }
  33. auto HandleDeclOrDefinitionAsClass(Context& context) -> void {
  34. HandleDeclOrDefinition(context, NodeKind::ClassDecl,
  35. NodeKind::ClassDefinitionStart,
  36. State::DeclDefinitionFinishAsClass);
  37. }
  38. auto HandleDeclOrDefinitionAsImpl(Context& context) -> void {
  39. HandleDeclOrDefinition(context, NodeKind::ImplDecl,
  40. NodeKind::ImplDefinitionStart,
  41. State::DeclDefinitionFinishAsImpl);
  42. }
  43. auto HandleDeclOrDefinitionAsInterface(Context& context) -> void {
  44. HandleDeclOrDefinition(context, NodeKind::InterfaceDecl,
  45. NodeKind::InterfaceDefinitionStart,
  46. State::DeclDefinitionFinishAsInterface);
  47. }
  48. auto HandleDeclOrDefinitionAsNamedConstraint(Context& context) -> void {
  49. HandleDeclOrDefinition(context, NodeKind::NamedConstraintDecl,
  50. NodeKind::NamedConstraintDefinitionStart,
  51. State::DeclDefinitionFinishAsNamedConstraint);
  52. }
  53. // Handles parsing after the declaration scope of a type.
  54. static auto HandleDeclDefinitionFinish(Context& context,
  55. NodeKind definition_kind) -> void {
  56. auto state = context.PopState();
  57. context.AddNode(definition_kind, context.Consume(), state.subtree_start,
  58. state.has_error);
  59. }
  60. auto HandleDeclDefinitionFinishAsClass(Context& context) -> void {
  61. HandleDeclDefinitionFinish(context, NodeKind::ClassDefinition);
  62. }
  63. auto HandleDeclDefinitionFinishAsImpl(Context& context) -> void {
  64. HandleDeclDefinitionFinish(context, NodeKind::ImplDefinition);
  65. }
  66. auto HandleDeclDefinitionFinishAsInterface(Context& context) -> void {
  67. HandleDeclDefinitionFinish(context, NodeKind::InterfaceDefinition);
  68. }
  69. auto HandleDeclDefinitionFinishAsNamedConstraint(Context& context) -> void {
  70. HandleDeclDefinitionFinish(context, NodeKind::NamedConstraintDefinition);
  71. }
  72. } // namespace Carbon::Parse