handle_decl_definition.cpp 3.1 KB

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