handle_decl_definition.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. State 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. context.PushState(State::DeclScopeLoop);
  21. context.AddNode(definition_start_kind, context.Consume(), state.subtree_start,
  22. state.has_error);
  23. }
  24. auto HandleDeclOrDefinitionAsClass(Context& context) -> void {
  25. HandleDeclOrDefinition(context, NodeKind::ClassDecl,
  26. NodeKind::ClassDefinitionStart,
  27. State::DeclDefinitionFinishAsClass);
  28. }
  29. auto HandleDeclOrDefinitionAsImpl(Context& context) -> void {
  30. HandleDeclOrDefinition(context, NodeKind::ImplDecl,
  31. NodeKind::ImplDefinitionStart,
  32. State::DeclDefinitionFinishAsImpl);
  33. }
  34. auto HandleDeclOrDefinitionAsInterface(Context& context) -> void {
  35. HandleDeclOrDefinition(context, NodeKind::InterfaceDecl,
  36. NodeKind::InterfaceDefinitionStart,
  37. State::DeclDefinitionFinishAsInterface);
  38. }
  39. auto HandleDeclOrDefinitionAsNamedConstraint(Context& context) -> void {
  40. HandleDeclOrDefinition(context, NodeKind::NamedConstraintDecl,
  41. NodeKind::NamedConstraintDefinitionStart,
  42. State::DeclDefinitionFinishAsNamedConstraint);
  43. }
  44. // Handles parsing after the declaration scope of a type.
  45. static auto HandleDeclDefinitionFinish(Context& context,
  46. NodeKind definition_kind) -> void {
  47. auto state = context.PopState();
  48. context.AddNode(definition_kind, context.Consume(), state.subtree_start,
  49. state.has_error);
  50. }
  51. auto HandleDeclDefinitionFinishAsClass(Context& context) -> void {
  52. HandleDeclDefinitionFinish(context, NodeKind::ClassDefinition);
  53. }
  54. auto HandleDeclDefinitionFinishAsImpl(Context& context) -> void {
  55. HandleDeclDefinitionFinish(context, NodeKind::ImplDefinition);
  56. }
  57. auto HandleDeclDefinitionFinishAsInterface(Context& context) -> void {
  58. HandleDeclDefinitionFinish(context, NodeKind::InterfaceDefinition);
  59. }
  60. auto HandleDeclDefinitionFinishAsNamedConstraint(Context& context) -> void {
  61. HandleDeclDefinitionFinish(context, NodeKind::NamedConstraintDefinition);
  62. }
  63. } // namespace Carbon::Parse