declaration_name_stack.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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/declaration_name_stack.h"
  5. #include "toolchain/check/context.h"
  6. namespace Carbon::Check {
  7. auto DeclarationNameStack::Push() -> void {
  8. declaration_name_stack_.push_back(
  9. {.state = NameContext::State::New,
  10. .target_scope_id = SemIR::NameScopeId::Invalid,
  11. .resolved_node_id = SemIR::NodeId::Invalid});
  12. }
  13. auto DeclarationNameStack::Pop() -> NameContext {
  14. if (context_->parse_tree().node_kind(
  15. context_->node_stack().PeekParseNode()) ==
  16. Parse::NodeKind::QualifiedDeclaration) {
  17. // Any parts from a QualifiedDeclaration will already have been processed
  18. // into the name.
  19. context_->node_stack()
  20. .PopAndDiscardSoloParseNode<Parse::NodeKind::QualifiedDeclaration>();
  21. } else {
  22. // The name had no qualifiers, so we need to process the node now.
  23. auto [parse_node, name_id] =
  24. context_->node_stack().PopWithParseNode<Parse::NodeKind::Name>();
  25. ApplyNameQualifier(parse_node, name_id);
  26. }
  27. return declaration_name_stack_.pop_back_val();
  28. }
  29. auto DeclarationNameStack::AddNameToLookup(NameContext name_context,
  30. SemIR::NodeId target_id) -> void {
  31. switch (name_context.state) {
  32. case NameContext::State::Error:
  33. // The name is invalid and a diagnostic has already been emitted.
  34. return;
  35. case NameContext::State::New:
  36. CARBON_FATAL() << "Name is missing, not expected to call AddNameToLookup "
  37. "(but that may change based on error handling).";
  38. case NameContext::State::Resolved:
  39. case NameContext::State::ResolvedNonScope: {
  40. context_->DiagnoseDuplicateName(name_context.parse_node,
  41. name_context.resolved_node_id);
  42. return;
  43. }
  44. case NameContext::State::Unresolved:
  45. if (name_context.target_scope_id == SemIR::NameScopeId::Invalid) {
  46. context_->AddNameToLookup(name_context.parse_node,
  47. name_context.unresolved_name_id, target_id);
  48. } else {
  49. bool success = context_->semantics_ir().AddNameScopeEntry(
  50. name_context.target_scope_id, name_context.unresolved_name_id,
  51. target_id);
  52. CARBON_CHECK(success)
  53. << "Duplicate names should have been resolved previously: "
  54. << name_context.unresolved_name_id << " in "
  55. << name_context.target_scope_id;
  56. }
  57. return;
  58. }
  59. }
  60. auto DeclarationNameStack::ApplyExpressionQualifier(Parse::Node parse_node,
  61. SemIR::NodeId node_id)
  62. -> void {
  63. auto& name_context = declaration_name_stack_.back();
  64. if (CanResolveQualifier(name_context, parse_node)) {
  65. if (node_id == SemIR::NodeId::BuiltinError) {
  66. // The input node is an error, so error the context.
  67. name_context.state = NameContext::State::Error;
  68. return;
  69. }
  70. // For other nodes, we expect a regular resolved node, for example a
  71. // namespace or generic type. Store it and continue for the target scope
  72. // update.
  73. name_context.resolved_node_id = node_id;
  74. UpdateScopeIfNeeded(name_context);
  75. }
  76. }
  77. auto DeclarationNameStack::ApplyNameQualifier(Parse::Node parse_node,
  78. SemIR::StringId name_id) -> void {
  79. auto& name_context = declaration_name_stack_.back();
  80. if (CanResolveQualifier(name_context, parse_node)) {
  81. // For identifier nodes, we need to perform a lookup on the identifier.
  82. // This means the input node_id is actually a string ID.
  83. auto resolved_node_id = context_->LookupName(
  84. name_context.parse_node, name_id, name_context.target_scope_id,
  85. /*print_diagnostics=*/false);
  86. if (resolved_node_id == SemIR::NodeId::BuiltinError) {
  87. // Invalid indicates an unresolved node. Store it and return.
  88. name_context.state = NameContext::State::Unresolved;
  89. name_context.unresolved_name_id = name_id;
  90. return;
  91. } else {
  92. // Store the resolved node and continue for the target scope update.
  93. name_context.resolved_node_id = resolved_node_id;
  94. }
  95. UpdateScopeIfNeeded(name_context);
  96. }
  97. }
  98. auto DeclarationNameStack::UpdateScopeIfNeeded(NameContext& name_context)
  99. -> void {
  100. // This will only be reached for resolved nodes. We update the target
  101. // scope based on the resolved type.
  102. auto resolved_node =
  103. context_->semantics_ir().GetNode(name_context.resolved_node_id);
  104. switch (resolved_node.kind()) {
  105. case SemIR::NodeKind::Namespace:
  106. name_context.state = NameContext::State::Resolved;
  107. name_context.target_scope_id =
  108. resolved_node.As<SemIR::Namespace>().name_scope_id;
  109. break;
  110. default:
  111. name_context.state = NameContext::State::ResolvedNonScope;
  112. break;
  113. }
  114. }
  115. auto DeclarationNameStack::CanResolveQualifier(NameContext& name_context,
  116. Parse::Node parse_node) -> bool {
  117. switch (name_context.state) {
  118. case NameContext::State::Error:
  119. // Already in an error state, so return without examining.
  120. return false;
  121. case NameContext::State::Unresolved:
  122. // Because more qualifiers were found, we diagnose that the earlier
  123. // qualifier failed to resolve.
  124. name_context.state = NameContext::State::Error;
  125. context_->DiagnoseNameNotFound(name_context.parse_node,
  126. name_context.unresolved_name_id);
  127. return false;
  128. case NameContext::State::ResolvedNonScope: {
  129. // Because more qualifiers were found, we diagnose that the earlier
  130. // qualifier didn't resolve to a scoped entity.
  131. name_context.state = NameContext::State::Error;
  132. CARBON_DIAGNOSTIC(QualifiedDeclarationInNonScope, Error,
  133. "Declaration qualifiers are only allowed for entities "
  134. "that provide a scope.");
  135. CARBON_DIAGNOSTIC(QualifiedDeclarationNonScopeEntity, Note,
  136. "Non-scope entity referenced here.");
  137. context_->emitter()
  138. .Build(parse_node, QualifiedDeclarationInNonScope)
  139. .Note(name_context.parse_node, QualifiedDeclarationNonScopeEntity)
  140. .Emit();
  141. return false;
  142. }
  143. case NameContext::State::New:
  144. case NameContext::State::Resolved: {
  145. name_context.parse_node = parse_node;
  146. return true;
  147. }
  148. }
  149. }
  150. } // namespace Carbon::Check