handle_impl.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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/check/context.h"
  5. namespace Carbon::Check {
  6. auto HandleImplIntroducer(Context& context, Parse::ImplIntroducerId parse_node)
  7. -> bool {
  8. // Create an instruction block to hold the instructions created for the type
  9. // and interface.
  10. context.inst_block_stack().Push();
  11. // Push the bracketing node.
  12. context.node_stack().Push(parse_node);
  13. // Optional modifiers follow.
  14. context.decl_state_stack().Push(DeclState::Impl);
  15. // Create a scope for implicit parameters. We may not use it, but it's simpler
  16. // to create it unconditionally than to track whether it exists.
  17. context.scope_stack().Push();
  18. return true;
  19. }
  20. auto HandleImplForall(Context& context, Parse::ImplForallId parse_node)
  21. -> bool {
  22. auto params_id =
  23. context.node_stack().Pop<Parse::NodeKind::ImplicitParamList>();
  24. context.node_stack().Push(parse_node, params_id);
  25. return true;
  26. }
  27. auto HandleTypeImplAs(Context& context, Parse::TypeImplAsId parse_node)
  28. -> bool {
  29. auto self_id = context.node_stack().PopExpr();
  30. context.node_stack().Push(parse_node, self_id);
  31. return true;
  32. }
  33. auto HandleDefaultSelfImplAs(Context& /*context*/,
  34. Parse::DefaultSelfImplAsId /*parse_node*/)
  35. -> bool {
  36. // TODO: Determine self_id and push it onto node stack.
  37. return true;
  38. }
  39. static auto BuildImplDecl(Context& context, Parse::AnyImplDeclId /*parse_node*/)
  40. -> SemIR::InstId {
  41. auto interface_id = context.node_stack().PopExpr();
  42. auto self_id = context.node_stack().PopIf<Parse::NodeKind::TypeImplAs>();
  43. auto params_id = context.node_stack().PopIf<Parse::NodeKind::ImplForall>();
  44. auto decl_block_id = context.inst_block_stack().Pop();
  45. context.node_stack()
  46. .PopAndDiscardSoloParseNode<Parse::NodeKind::ImplIntroducer>();
  47. // TODO: Build an `Impl` object.
  48. static_cast<void>(decl_block_id);
  49. static_cast<void>(params_id);
  50. static_cast<void>(self_id);
  51. static_cast<void>(interface_id);
  52. return SemIR::InstId::Invalid;
  53. }
  54. auto HandleImplDecl(Context& context, Parse::ImplDeclId parse_node) -> bool {
  55. BuildImplDecl(context, parse_node);
  56. context.scope_stack().Pop();
  57. return true;
  58. }
  59. auto HandleImplDefinitionStart(Context& context,
  60. Parse::ImplDefinitionStartId parse_node)
  61. -> bool {
  62. auto impl_decl_id = BuildImplDecl(context, parse_node);
  63. auto enclosing_scope_id = SemIR::NameScopeId::Invalid;
  64. auto scope_id = context.name_scopes().Add(
  65. impl_decl_id, SemIR::NameId::Invalid, enclosing_scope_id);
  66. context.scope_stack().Push(impl_decl_id, scope_id);
  67. return true;
  68. }
  69. auto HandleImplDefinition(Context& context,
  70. Parse::ImplDefinitionId /*parse_node*/) -> bool {
  71. context.scope_stack().Pop();
  72. context.scope_stack().Pop();
  73. return true;
  74. }
  75. } // namespace Carbon::Check