Jelajahi Sumber

Rename Directive->Decl in general, BindExport->ExportDecl (#3957)

Mechanically, replacing Directive->Decl, directive->declaration,
_declaration->_decl (to avoid comments).

Context:
https://discord.com/channels/655572317891461132/963846118964350976/1241145948625703062
Jon Ross-Perkins 1 tahun lalu
induk
melakukan
03e3a72628
66 mengubah file dengan 284 tambahan dan 277 penghapusan
  1. 8 8
      toolchain/base/kind_switch.h
  2. 18 17
      toolchain/check/check.cpp
  3. 1 1
      toolchain/check/context.cpp
  4. 1 1
      toolchain/check/eval.cpp
  5. 2 3
      toolchain/check/handle_export.cpp
  6. 6 6
      toolchain/check/handle_import_and_package.cpp
  7. 7 7
      toolchain/check/import.cpp
  8. 2 2
      toolchain/check/import.h
  9. 12 12
      toolchain/check/import_ref.cpp
  10. 2 2
      toolchain/check/testdata/alias/no_prelude/export_name.carbon
  11. 1 1
      toolchain/check/testdata/class/no_prelude/export_name.carbon
  12. 1 1
      toolchain/check/testdata/function/declaration/no_prelude/export_name.carbon
  13. 1 1
      toolchain/check/testdata/interface/no_prelude/export_name.carbon
  14. 4 4
      toolchain/check/testdata/packages/fail_package_main.carbon
  15. 2 2
      toolchain/check/testdata/packages/no_prelude/export_mixed.carbon
  16. 7 7
      toolchain/check/testdata/packages/no_prelude/export_name.carbon
  17. 1 1
      toolchain/check/testdata/var/no_prelude/export_name.carbon
  18. 2 2
      toolchain/lower/handle.cpp
  19. 7 7
      toolchain/parse/context.h
  20. 40 40
      toolchain/parse/handle_import_and_package.cpp
  21. 1 1
      toolchain/parse/node_ids.h
  22. 9 9
      toolchain/parse/node_kind.def
  23. 1 1
      toolchain/parse/state.def
  24. 28 28
      toolchain/parse/testdata/packages/export.carbon
  25. 2 2
      toolchain/parse/testdata/packages/import/after_import.carbon
  26. 2 2
      toolchain/parse/testdata/packages/import/after_package.carbon
  27. 1 1
      toolchain/parse/testdata/packages/import/basic.carbon
  28. 2 2
      toolchain/parse/testdata/packages/import/current_package_library.carbon
  29. 13 13
      toolchain/parse/testdata/packages/import/export.carbon
  30. 2 2
      toolchain/parse/testdata/packages/import/fail_after_decl.carbon
  31. 8 8
      toolchain/parse/testdata/packages/import/fail_after_decl_repeated.carbon
  32. 1 1
      toolchain/parse/testdata/packages/import/fail_extra_string.carbon
  33. 1 1
      toolchain/parse/testdata/packages/import/fail_library_is_identifier.carbon
  34. 1 1
      toolchain/parse/testdata/packages/import/fail_name_is_keyword.carbon
  35. 1 1
      toolchain/parse/testdata/packages/import/fail_no_name.carbon
  36. 1 1
      toolchain/parse/testdata/packages/import/fail_no_semi.carbon
  37. 1 1
      toolchain/parse/testdata/packages/import/fail_omit_library_keyword.carbon
  38. 1 1
      toolchain/parse/testdata/packages/import/fail_type.carbon
  39. 1 1
      toolchain/parse/testdata/packages/import/library.carbon
  40. 6 6
      toolchain/parse/testdata/packages/import/ordering.carbon
  41. 2 2
      toolchain/parse/testdata/packages/library/basic.carbon
  42. 5 5
      toolchain/parse/testdata/packages/library/fail_invalid_name.carbon
  43. 3 3
      toolchain/parse/testdata/packages/library/fail_too_late.carbon
  44. 1 1
      toolchain/parse/testdata/packages/package/api.carbon
  45. 1 1
      toolchain/parse/testdata/packages/package/api_library.carbon
  46. 2 2
      toolchain/parse/testdata/packages/package/fail_after_decl.carbon
  47. 3 3
      toolchain/parse/testdata/packages/package/fail_after_import.carbon
  48. 3 3
      toolchain/parse/testdata/packages/package/fail_after_package.carbon
  49. 1 1
      toolchain/parse/testdata/packages/package/fail_extra_string.carbon
  50. 1 1
      toolchain/parse/testdata/packages/package/fail_library_is_identifier.carbon
  51. 1 1
      toolchain/parse/testdata/packages/package/fail_library_skips_name.carbon
  52. 1 1
      toolchain/parse/testdata/packages/package/fail_name_is_keyword.carbon
  53. 1 1
      toolchain/parse/testdata/packages/package/fail_no_name.carbon
  54. 1 1
      toolchain/parse/testdata/packages/package/fail_no_semi.carbon
  55. 1 1
      toolchain/parse/testdata/packages/package/fail_no_type.carbon
  56. 1 1
      toolchain/parse/testdata/packages/package/fail_omit_library_keyword.carbon
  57. 1 1
      toolchain/parse/testdata/packages/package/impl.carbon
  58. 1 1
      toolchain/parse/testdata/packages/package/impl_library.carbon
  59. 8 8
      toolchain/parse/tree.h
  60. 10 14
      toolchain/parse/typed_nodes.h
  61. 1 1
      toolchain/parse/typed_nodes_test.cpp
  62. 4 4
      toolchain/sem_ir/file.cpp
  63. 1 1
      toolchain/sem_ir/import_ir.h
  64. 1 1
      toolchain/sem_ir/inst_kind.def
  65. 3 3
      toolchain/sem_ir/inst_namer.cpp
  66. 18 7
      toolchain/sem_ir/typed_insts.h

+ 8 - 8
toolchain/base/kind_switch.h

@@ -73,18 +73,18 @@ auto Cast(ValueT&& kind_switch_value) -> auto {
       ::Carbon::Internal::Kind::SwitchOn(carbon_internal_kind_switch_value))
       ::Carbon::Internal::Kind::SwitchOn(carbon_internal_kind_switch_value))
 
 
 // Produces a case-compatible block of code that also instantiates a local typed
 // Produces a case-compatible block of code that also instantiates a local typed
-// variable. typed_variable_declaration looks like `int i`, with a space.
+// variable. typed_variable_decl looks like `int i`, with a space.
 //
 //
 // This uses `if` to scope the variable, and provides a dangling `else` in order
 // This uses `if` to scope the variable, and provides a dangling `else` in order
 // to prevent accidental `else` use. The label allows `:` to follow the macro
 // to prevent accidental `else` use. The label allows `:` to follow the macro
 // name, making it look more like a typical `case`.
 // name, making it look more like a typical `case`.
-#define CARBON_KIND(typed_variable_declaration)                                \
-  ::Carbon::Internal::Kind::ForCase<                                           \
-      decltype([]([[maybe_unused]] typed_variable_declaration) {})>()          \
-      : if (typed_variable_declaration = ::Carbon::Internal::Kind::Cast<       \
-                decltype([]([[maybe_unused]] typed_variable_declaration) {})>( \
-                carbon_internal_kind_switch_value);                            \
-            false) {}                                                          \
+#define CARBON_KIND(typed_variable_decl)                                \
+  ::Carbon::Internal::Kind::ForCase<                                    \
+      decltype([]([[maybe_unused]] typed_variable_decl) {})>()          \
+      : if (typed_variable_decl = ::Carbon::Internal::Kind::Cast<       \
+                decltype([]([[maybe_unused]] typed_variable_decl) {})>( \
+                carbon_internal_kind_switch_value);                     \
+            false) {}                                                   \
   else [[maybe_unused]] CARBON_INTERNAL_KIND_LABEL(__LINE__)
   else [[maybe_unused]] CARBON_INTERNAL_KIND_LABEL(__LINE__)
 
 
 #endif  // CARBON_TOOLCHAIN_BASE_KIND_SWITCH_H_
 #endif  // CARBON_TOOLCHAIN_BASE_KIND_SWITCH_H_

+ 18 - 17
toolchain/check/check.cpp

@@ -88,7 +88,7 @@ class SemIRDiagnosticConverter : public DiagnosticConverter<SemIRLoc> {
     while (true) {
     while (true) {
       if (cursor_inst_id.is_valid()) {
       if (cursor_inst_id.is_valid()) {
         auto cursor_inst = cursor_ir->insts().Get(cursor_inst_id);
         auto cursor_inst = cursor_ir->insts().Get(cursor_inst_id);
-        if (auto bind_ref = cursor_inst.TryAs<SemIR::BindExport>();
+        if (auto bind_ref = cursor_inst.TryAs<SemIR::ExportDecl>();
             bind_ref && bind_ref->value_id.is_valid()) {
             bind_ref && bind_ref->value_id.is_valid()) {
           cursor_inst_id = bind_ref->value_id;
           cursor_inst_id = bind_ref->value_id;
           continue;
           continue;
@@ -159,15 +159,15 @@ struct UnitInfo {
     // Use the constructor so that the SmallVector is only constructed
     // Use the constructor so that the SmallVector is only constructed
     // as-needed.
     // as-needed.
     explicit PackageImports(IdentifierId package_id,
     explicit PackageImports(IdentifierId package_id,
-                            Parse::ImportDirectiveId node_id)
+                            Parse::ImportDeclId node_id)
         : package_id(package_id), node_id(node_id) {}
         : package_id(package_id), node_id(node_id) {}
 
 
     // The identifier of the imported package.
     // The identifier of the imported package.
     IdentifierId package_id;
     IdentifierId package_id;
-    // The first `import` directive in the file, which declared the package's
+    // The first `import` declaration in the file, which declared the package's
     // identifier (even if the import failed). Used for associating diagnostics
     // identifier (even if the import failed). Used for associating diagnostics
     // not specific to a single import.
     // not specific to a single import.
-    Parse::ImportDirectiveId node_id;
+    Parse::ImportDeclId node_id;
     // Whether there's an import that failed to load.
     // Whether there's an import that failed to load.
     bool has_load_error = false;
     bool has_load_error = false;
     // The list of valid imports.
     // The list of valid imports.
@@ -332,7 +332,7 @@ static auto InitPackageScopeAndImports(Context& context, UnitInfo& unit_info,
   if (unit_info.api_for_impl) {
   if (unit_info.api_for_impl) {
     SetApiImportIR(
     SetApiImportIR(
         context,
         context,
-        {.node_id = context.parse_tree().packaging_directive()->names.node_id,
+        {.node_id = context.parse_tree().packaging_decl()->names.node_id,
          .sem_ir = &**unit_info.api_for_impl->unit->sem_ir});
          .sem_ir = &**unit_info.api_for_impl->unit->sem_ir});
   } else {
   } else {
     SetApiImportIR(context,
     SetApiImportIR(context,
@@ -874,8 +874,8 @@ static auto CheckParseTree(
 using ImportKey = std::pair<llvm::StringRef, llvm::StringRef>;
 using ImportKey = std::pair<llvm::StringRef, llvm::StringRef>;
 
 
 // Returns a key form of the package object. file_package_id is only used for
 // Returns a key form of the package object. file_package_id is only used for
-// imports, not the main package directive; as a consequence, it will be invalid
-// for the main package directive.
+// imports, not the main package declaration; as a consequence, it will be
+// invalid for the main package declaration.
 static auto GetImportKey(UnitInfo& unit_info, IdentifierId file_package_id,
 static auto GetImportKey(UnitInfo& unit_info, IdentifierId file_package_id,
                          Parse::Tree::PackagingNames names) -> ImportKey {
                          Parse::Tree::PackagingNames names) -> ImportKey {
   auto* stores = unit_info.unit->value_stores;
   auto* stores = unit_info.unit->value_stores;
@@ -910,7 +910,7 @@ static auto TrackImport(
     llvm::DenseMap<ImportKey, UnitInfo*>& api_map,
     llvm::DenseMap<ImportKey, UnitInfo*>& api_map,
     llvm::DenseMap<ImportKey, Parse::NodeId>* explicit_import_map,
     llvm::DenseMap<ImportKey, Parse::NodeId>* explicit_import_map,
     UnitInfo& unit_info, Parse::Tree::PackagingNames import) -> void {
     UnitInfo& unit_info, Parse::Tree::PackagingNames import) -> void {
-  const auto& packaging = unit_info.unit->parse_tree->packaging_directive();
+  const auto& packaging = unit_info.unit->parse_tree->packaging_decl();
 
 
   IdentifierId file_package_id =
   IdentifierId file_package_id =
       packaging ? packaging->names.package_id : IdentifierId::Invalid;
       packaging ? packaging->names.package_id : IdentifierId::Invalid;
@@ -1051,8 +1051,8 @@ static auto BuildApiMapAndDiagnosePackaging(
     -> llvm::DenseMap<ImportKey, UnitInfo*> {
     -> llvm::DenseMap<ImportKey, UnitInfo*> {
   llvm::DenseMap<ImportKey, UnitInfo*> api_map;
   llvm::DenseMap<ImportKey, UnitInfo*> api_map;
   for (auto& unit_info : unit_infos) {
   for (auto& unit_info : unit_infos) {
-    const auto& packaging = unit_info.unit->parse_tree->packaging_directive();
-    // An import key formed from the `package` or `library` directive. Or, for
+    const auto& packaging = unit_info.unit->parse_tree->packaging_decl();
+    // An import key formed from the `package` or `library` declaration. Or, for
     // Main//default, a placeholder key.
     // Main//default, a placeholder key.
     auto import_key = packaging ? GetImportKey(unit_info, IdentifierId::Invalid,
     auto import_key = packaging ? GetImportKey(unit_info, IdentifierId::Invalid,
                                                packaging->names)
                                                packaging->names)
@@ -1063,9 +1063,10 @@ static auto BuildApiMapAndDiagnosePackaging(
     // APIs.
     // APIs.
     if (import_key.first == ExplicitMainName) {
     if (import_key.first == ExplicitMainName) {
       CARBON_DIAGNOSTIC(ExplicitMainPackage, Error,
       CARBON_DIAGNOSTIC(ExplicitMainPackage, Error,
-                        "`Main//default` must omit `package` directive.");
-      CARBON_DIAGNOSTIC(ExplicitMainLibrary, Error,
-                        "Use `library` directive in `Main` package libraries.");
+                        "`Main//default` must omit `package` declaration.");
+      CARBON_DIAGNOSTIC(
+          ExplicitMainLibrary, Error,
+          "Use `library` declaration in `Main` package libraries.");
       unit_info.emitter.Emit(packaging->names.node_id,
       unit_info.emitter.Emit(packaging->names.node_id,
                              import_key.second.empty() ? ExplicitMainPackage
                              import_key.second.empty() ? ExplicitMainPackage
                                                        : ExplicitMainLibrary);
                                                        : ExplicitMainLibrary);
@@ -1101,9 +1102,9 @@ static auto BuildApiMapAndDiagnosePackaging(
       }
       }
     }
     }
 
 
-    // Validate file extensions. Note imports rely the packaging directive, not
-    // the extension. If the input is not a regular file, for example because it
-    // is stdin, no filename checking is performed.
+    // Validate file extensions. Note imports rely the packaging declaration,
+    // not the extension. If the input is not a regular file, for example
+    // because it is stdin, no filename checking is performed.
     if (unit_info.unit->tokens->source().is_regular_file()) {
     if (unit_info.unit->tokens->source().is_regular_file()) {
       auto filename = unit_info.unit->tokens->source().filename();
       auto filename = unit_info.unit->tokens->source().filename();
       static constexpr llvm::StringLiteral ApiExt = ".carbon";
       static constexpr llvm::StringLiteral ApiExt = ".carbon";
@@ -1151,7 +1152,7 @@ auto CheckParseTrees(llvm::MutableArrayRef<Unit> units, bool prelude_import,
   llvm::SmallVector<UnitInfo*> ready_to_check;
   llvm::SmallVector<UnitInfo*> ready_to_check;
   ready_to_check.reserve(units.size());
   ready_to_check.reserve(units.size());
   for (auto& unit_info : unit_infos) {
   for (auto& unit_info : unit_infos) {
-    const auto& packaging = unit_info.unit->parse_tree->packaging_directive();
+    const auto& packaging = unit_info.unit->parse_tree->packaging_decl();
     if (packaging && packaging->api_or_impl == Parse::Tree::ApiOrImpl::Impl) {
     if (packaging && packaging->api_or_impl == Parse::Tree::ApiOrImpl::Impl) {
       // An `impl` has an implicit import of its `api`.
       // An `impl` has an implicit import of its `api`.
       auto implicit_names = packaging->names;
       auto implicit_names = packaging->names;

+ 1 - 1
toolchain/check/context.cpp

@@ -419,7 +419,7 @@ auto Context::LookupQualifiedName(Parse::NodeId node_id, SemIR::NameId name_id,
 static auto GetCorePackage(Context& context, SemIRLoc loc)
 static auto GetCorePackage(Context& context, SemIRLoc loc)
     -> SemIR::NameScopeId {
     -> SemIR::NameScopeId {
   auto core_ident_id = context.identifiers().Add("Core");
   auto core_ident_id = context.identifiers().Add("Core");
-  auto packaging = context.parse_tree().packaging_directive();
+  auto packaging = context.parse_tree().packaging_decl();
   if (packaging && packaging->names.package_id == core_ident_id) {
   if (packaging && packaging->names.package_id == core_ident_id) {
     return SemIR::NameScopeId::Package;
     return SemIR::NameScopeId::Package;
   }
   }

+ 1 - 1
toolchain/check/eval.cpp

@@ -1065,7 +1065,7 @@ auto TryEvalInst(Context& context, SemIR::InstId inst_id, SemIR::Inst inst)
     case CARBON_KIND(SemIR::BindAlias typed_inst): {
     case CARBON_KIND(SemIR::BindAlias typed_inst): {
       return context.constant_values().Get(typed_inst.value_id);
       return context.constant_values().Get(typed_inst.value_id);
     }
     }
-    case CARBON_KIND(SemIR::BindExport typed_inst): {
+    case CARBON_KIND(SemIR::ExportDecl typed_inst): {
       return context.constant_values().Get(typed_inst.value_id);
       return context.constant_values().Get(typed_inst.value_id);
     }
     }
     case CARBON_KIND(SemIR::NameRef typed_inst): {
     case CARBON_KIND(SemIR::NameRef typed_inst): {

+ 2 - 3
toolchain/check/handle_export.cpp

@@ -19,8 +19,7 @@ auto HandleExportIntroducer(Context& context,
   return true;
   return true;
 }
 }
 
 
-auto HandleExportDirective(Context& context, Parse::ExportDirectiveId node_id)
-    -> bool {
+auto HandleExportDecl(Context& context, Parse::ExportDeclId node_id) -> bool {
   auto name_context = context.decl_name_stack().FinishName();
   auto name_context = context.decl_name_stack().FinishName();
   context.decl_name_stack().PopScope();
   context.decl_name_stack().PopScope();
 
 
@@ -53,7 +52,7 @@ auto HandleExportDirective(Context& context, Parse::ExportDirectiveId node_id)
   }
   }
 
 
   auto export_id = context.AddInst(
   auto export_id = context.AddInst(
-      {node_id, SemIR::BindExport{.type_id = import_ref->type_id,
+      {node_id, SemIR::ExportDecl{.type_id = import_ref->type_id,
                                   .bind_name_id = import_ref->bind_name_id,
                                   .bind_name_id = import_ref->bind_name_id,
                                   .value_id = inst_id}});
                                   .value_id = inst_id}});
   context.AddExport(export_id);
   context.AddExport(export_id);

+ 6 - 6
toolchain/check/handle_import_and_package.cpp

@@ -19,8 +19,8 @@ auto HandleImportExport(Context& /*context*/, Parse::ImportExportId /*node_id*/)
   return true;
   return true;
 }
 }
 
 
-auto HandleImportDirective(Context& /*context*/,
-                           Parse::ImportDirectiveId /*node_id*/) -> bool {
+auto HandleImportDecl(Context& /*context*/, Parse::ImportDeclId /*node_id*/)
+    -> bool {
   return true;
   return true;
 }
 }
 
 
@@ -29,8 +29,8 @@ auto HandleLibraryIntroducer(Context& /*context*/,
   return true;
   return true;
 }
 }
 
 
-auto HandleLibraryDirective(Context& /*context*/,
-                            Parse::LibraryDirectiveId /*node_id*/) -> bool {
+auto HandleLibraryDecl(Context& /*context*/, Parse::LibraryDeclId /*node_id*/)
+    -> bool {
   return true;
   return true;
 }
 }
 
 
@@ -39,8 +39,8 @@ auto HandlePackageIntroducer(Context& /*context*/,
   return true;
   return true;
 }
 }
 
 
-auto HandlePackageDirective(Context& /*context*/,
-                            Parse::PackageDirectiveId /*node_id*/) -> bool {
+auto HandlePackageDecl(Context& /*context*/, Parse::PackageDeclId /*node_id*/)
+    -> bool {
   return true;
   return true;
 }
 }
 
 

+ 7 - 7
toolchain/check/import.cpp

@@ -25,10 +25,10 @@ static auto GetImportName(const SemIR::File& import_sem_ir,
     -> std::pair<SemIR::NameId, SemIR::NameScopeId> {
     -> std::pair<SemIR::NameId, SemIR::NameScopeId> {
   CARBON_KIND_SWITCH(import_inst) {
   CARBON_KIND_SWITCH(import_inst) {
     case SemIR::BindAlias::Kind:
     case SemIR::BindAlias::Kind:
-    case SemIR::BindExport::Kind:
     case SemIR::BindName::Kind:
     case SemIR::BindName::Kind:
-    case SemIR::BindSymbolicName::Kind: {
-      auto bind_inst = import_inst.As<SemIR::AnyBindName>();
+    case SemIR::BindSymbolicName::Kind:
+    case SemIR::ExportDecl::Kind: {
+      auto bind_inst = import_inst.As<SemIR::AnyBindNameOrExportDecl>();
       const auto& bind_name =
       const auto& bind_name =
           import_sem_ir.bind_names().Get(bind_inst.bind_name_id);
           import_sem_ir.bind_names().Get(bind_inst.bind_name_id);
       return {bind_name.name_id, bind_name.enclosing_scope_id};
       return {bind_name.name_id, bind_name.enclosing_scope_id};
@@ -80,7 +80,7 @@ static auto CopyNameFromImportIR(Context& context,
 // namespace is a different package.
 // namespace is a different package.
 static auto AddNamespace(
 static auto AddNamespace(
     Context& context, SemIR::TypeId namespace_type_id,
     Context& context, SemIR::TypeId namespace_type_id,
-    Parse::ImportDirectiveId node_id, SemIR::NameId name_id,
+    Parse::ImportDeclId node_id, SemIR::NameId name_id,
     SemIR::NameScopeId enclosing_scope_id, bool diagnose_duplicate_namespace,
     SemIR::NameScopeId enclosing_scope_id, bool diagnose_duplicate_namespace,
     std::optional<llvm::function_ref<SemIR::InstId()>> make_import_id)
     std::optional<llvm::function_ref<SemIR::InstId()>> make_import_id)
     -> std::tuple<SemIR::NameScopeId, SemIR::ConstantId, bool> {
     -> std::tuple<SemIR::NameScopeId, SemIR::ConstantId, bool> {
@@ -226,7 +226,7 @@ static auto GetCanonicalImportIRInst(Context& context,
   while (true) {
   while (true) {
     auto inst = cursor_ir->insts().Get(cursor_inst_id);
     auto inst = cursor_ir->insts().Get(cursor_inst_id);
     CARBON_KIND_SWITCH(inst) {
     CARBON_KIND_SWITCH(inst) {
-      case CARBON_KIND(SemIR::BindExport bind_export): {
+      case CARBON_KIND(SemIR::ExportDecl bind_export): {
         cursor_inst_id = bind_export.value_id;
         cursor_inst_id = bind_export.value_id;
         continue;
         continue;
       }
       }
@@ -290,7 +290,7 @@ static auto AddImportRefOrMerge(Context& context, SemIR::ImportIRId ir_id,
 
 
 auto ImportLibraryFromCurrentPackage(Context& context,
 auto ImportLibraryFromCurrentPackage(Context& context,
                                      SemIR::TypeId namespace_type_id,
                                      SemIR::TypeId namespace_type_id,
-                                     Parse::ImportDirectiveId node_id,
+                                     Parse::ImportDeclId node_id,
                                      const SemIR::File& import_sem_ir,
                                      const SemIR::File& import_sem_ir,
                                      bool is_export) -> void {
                                      bool is_export) -> void {
   auto ir_id = AddImportIR(
   auto ir_id = AddImportIR(
@@ -335,7 +335,7 @@ auto ImportLibraryFromCurrentPackage(Context& context,
 
 
 auto ImportLibrariesFromOtherPackage(Context& context,
 auto ImportLibrariesFromOtherPackage(Context& context,
                                      SemIR::TypeId namespace_type_id,
                                      SemIR::TypeId namespace_type_id,
-                                     Parse::ImportDirectiveId node_id,
+                                     Parse::ImportDeclId node_id,
                                      IdentifierId package_id,
                                      IdentifierId package_id,
                                      llvm::ArrayRef<SemIR::ImportIR> import_irs,
                                      llvm::ArrayRef<SemIR::ImportIR> import_irs,
                                      bool has_load_error) -> void {
                                      bool has_load_error) -> void {

+ 2 - 2
toolchain/check/import.h

@@ -16,7 +16,7 @@ namespace Carbon::Check {
 // though they are several layers deep.
 // though they are several layers deep.
 auto ImportLibraryFromCurrentPackage(Context& context,
 auto ImportLibraryFromCurrentPackage(Context& context,
                                      SemIR::TypeId namespace_type_id,
                                      SemIR::TypeId namespace_type_id,
-                                     Parse::ImportDirectiveId node_id,
+                                     Parse::ImportDeclId node_id,
                                      const SemIR::File& import_sem_ir,
                                      const SemIR::File& import_sem_ir,
                                      bool is_export) -> void;
                                      bool is_export) -> void;
 
 
@@ -29,7 +29,7 @@ auto ImportLibraryFromCurrentPackage(Context& context,
 // the package failed to import correctly.
 // the package failed to import correctly.
 auto ImportLibrariesFromOtherPackage(Context& context,
 auto ImportLibrariesFromOtherPackage(Context& context,
                                      SemIR::TypeId namespace_type_id,
                                      SemIR::TypeId namespace_type_id,
-                                     Parse::ImportDirectiveId node_id,
+                                     Parse::ImportDeclId node_id,
                                      IdentifierId package_id,
                                      IdentifierId package_id,
                                      llvm::ArrayRef<SemIR::ImportIR> import_irs,
                                      llvm::ArrayRef<SemIR::ImportIR> import_irs,
                                      bool has_load_error) -> void;
                                      bool has_load_error) -> void;

+ 12 - 12
toolchain/check/import_ref.cpp

@@ -542,9 +542,6 @@ class ImportRefResolver {
       case CARBON_KIND(SemIR::BindAlias inst): {
       case CARBON_KIND(SemIR::BindAlias inst): {
         return TryResolveTypedInst(inst);
         return TryResolveTypedInst(inst);
       }
       }
-      case CARBON_KIND(SemIR::BindExport inst): {
-        return TryResolveTypedInst(inst);
-      }
       case CARBON_KIND(SemIR::BindName inst): {
       case CARBON_KIND(SemIR::BindName inst): {
         // TODO: This always returns `ConstantId::NotConstant`.
         // TODO: This always returns `ConstantId::NotConstant`.
         return {TryEvalInst(context_, inst_id, inst)};
         return {TryEvalInst(context_, inst_id, inst)};
@@ -561,6 +558,9 @@ class ImportRefResolver {
       case CARBON_KIND(SemIR::ConstType inst): {
       case CARBON_KIND(SemIR::ConstType inst): {
         return TryResolveTypedInst(inst);
         return TryResolveTypedInst(inst);
       }
       }
+      case CARBON_KIND(SemIR::ExportDecl inst): {
+        return TryResolveTypedInst(inst);
+      }
       case CARBON_KIND(SemIR::FieldDecl inst): {
       case CARBON_KIND(SemIR::FieldDecl inst): {
         return TryResolveTypedInst(inst, inst_id);
         return TryResolveTypedInst(inst, inst_id);
       }
       }
@@ -674,15 +674,6 @@ class ImportRefResolver {
     return {value_id};
     return {value_id};
   }
   }
 
 
-  auto TryResolveTypedInst(SemIR::BindExport inst) -> ResolveResult {
-    auto initial_work = work_stack_.size();
-    auto value_id = GetLocalConstantId(inst.value_id);
-    if (HasNewWork(initial_work)) {
-      return ResolveResult::Retry();
-    }
-    return {value_id};
-  }
-
   auto TryResolveTypedInst(SemIR::BindSymbolicName inst,
   auto TryResolveTypedInst(SemIR::BindSymbolicName inst,
                            SemIR::InstId import_inst_id) -> ResolveResult {
                            SemIR::InstId import_inst_id) -> ResolveResult {
     auto initial_work = work_stack_.size();
     auto initial_work = work_stack_.size();
@@ -870,6 +861,15 @@ class ImportRefResolver {
                     SemIR::ConstType{SemIR::TypeId::TypeType, inner_type_id})};
                     SemIR::ConstType{SemIR::TypeId::TypeType, inner_type_id})};
   }
   }
 
 
+  auto TryResolveTypedInst(SemIR::ExportDecl inst) -> ResolveResult {
+    auto initial_work = work_stack_.size();
+    auto value_id = GetLocalConstantId(inst.value_id);
+    if (HasNewWork(initial_work)) {
+      return ResolveResult::Retry();
+    }
+    return {value_id};
+  }
+
   auto TryResolveTypedInst(SemIR::FieldDecl inst, SemIR::InstId import_inst_id)
   auto TryResolveTypedInst(SemIR::FieldDecl inst, SemIR::InstId import_inst_id)
       -> ResolveResult {
       -> ResolveResult {
     auto initial_work = work_stack_.size();
     auto initial_work = work_stack_.size();

+ 2 - 2
toolchain/check/testdata/alias/no_prelude/export_name.carbon

@@ -101,7 +101,7 @@ var d: D* = &c;
 // CHECK:STDOUT:   %import_ref.1 = import_ref ir1, inst+1, unloaded
 // CHECK:STDOUT:   %import_ref.1 = import_ref ir1, inst+1, unloaded
 // CHECK:STDOUT:   %import_ref.2: type = import_ref ir1, inst+5, loaded [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.2: type = import_ref ir1, inst+5, loaded [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+2, unloaded
-// CHECK:STDOUT:   %D: type = bind_export D, %import_ref.2 [template = constants.%C]
+// CHECK:STDOUT:   %D: type = export D, %import_ref.2 [template = constants.%C]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {
@@ -124,7 +124,7 @@ var d: D* = &c;
 // CHECK:STDOUT:   %import_ref.1: type = import_ref ir1, inst+1, loaded [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.1: type = import_ref ir1, inst+1, loaded [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+5, unloaded
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+5, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+2, unloaded
-// CHECK:STDOUT:   %C: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {

+ 1 - 1
toolchain/check/testdata/class/no_prelude/export_name.carbon

@@ -66,7 +66,7 @@ var c: C = {};
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   %import_ref.1: type = import_ref ir1, inst+1, loaded [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.1: type = import_ref ir1, inst+1, loaded [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+2, unloaded
-// CHECK:STDOUT:   %C: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {

+ 1 - 1
toolchain/check/testdata/function/declaration/no_prelude/export_name.carbon

@@ -64,7 +64,7 @@ var f: () = F();
 // CHECK:STDOUT:     .F = %import_ref
 // CHECK:STDOUT:     .F = %import_ref
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   %import_ref: F = import_ref ir1, inst+1, loaded [template = constants.%struct]
 // CHECK:STDOUT:   %import_ref: F = import_ref ir1, inst+1, loaded [template = constants.%struct]
-// CHECK:STDOUT:   %F: F = bind_export F, %import_ref [template = constants.%struct]
+// CHECK:STDOUT:   %F: F = export F, %import_ref [template = constants.%struct]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: fn @F();
 // CHECK:STDOUT: fn @F();

+ 1 - 1
toolchain/check/testdata/interface/no_prelude/export_name.carbon

@@ -69,7 +69,7 @@ fn UseEmpty(i: I) {}
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   %import_ref.1: type = import_ref ir1, inst+1, loaded [template = constants.%.1]
 // CHECK:STDOUT:   %import_ref.1: type = import_ref ir1, inst+1, loaded [template = constants.%.1]
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+3, unloaded
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+3, unloaded
-// CHECK:STDOUT:   %I: type = bind_export I, %import_ref.1 [template = constants.%.1]
+// CHECK:STDOUT:   %I: type = export I, %import_ref.1 [template = constants.%.1]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: interface @I {
 // CHECK:STDOUT: interface @I {

+ 4 - 4
toolchain/check/testdata/packages/fail_package_main.carbon

@@ -6,7 +6,7 @@
 
 
 // --- fail_main.carbon
 // --- fail_main.carbon
 
 
-// CHECK:STDERR: fail_main.carbon:[[@LINE+4]]:1: ERROR: `Main//default` must omit `package` directive.
+// CHECK:STDERR: fail_main.carbon:[[@LINE+4]]:1: ERROR: `Main//default` must omit `package` declaration.
 // CHECK:STDERR: package Main api;
 // CHECK:STDERR: package Main api;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR:
 // CHECK:STDERR:
@@ -14,7 +14,7 @@ package Main api;
 
 
 // --- fail_main_impl.carbon
 // --- fail_main_impl.carbon
 
 
-// CHECK:STDERR: fail_main_impl.carbon:[[@LINE+4]]:1: ERROR: `Main//default` must omit `package` directive.
+// CHECK:STDERR: fail_main_impl.carbon:[[@LINE+4]]:1: ERROR: `Main//default` must omit `package` declaration.
 // CHECK:STDERR: package Main impl;
 // CHECK:STDERR: package Main impl;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR:
 // CHECK:STDERR:
@@ -23,7 +23,7 @@ package Main impl;
 // --- fail_raw_main.carbon
 // --- fail_raw_main.carbon
 
 
 // `Main` isn't a keyword, so this fails the same way.
 // `Main` isn't a keyword, so this fails the same way.
-// CHECK:STDERR: fail_raw_main.carbon:[[@LINE+4]]:1: ERROR: `Main//default` must omit `package` directive.
+// CHECK:STDERR: fail_raw_main.carbon:[[@LINE+4]]:1: ERROR: `Main//default` must omit `package` declaration.
 // CHECK:STDERR: package r#Main api;
 // CHECK:STDERR: package r#Main api;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR:
 // CHECK:STDERR:
@@ -31,7 +31,7 @@ package r#Main api;
 
 
 // --- fail_main_lib.carbon
 // --- fail_main_lib.carbon
 
 
-// CHECK:STDERR: fail_main_lib.carbon:[[@LINE+3]]:1: ERROR: Use `library` directive in `Main` package libraries.
+// CHECK:STDERR: fail_main_lib.carbon:[[@LINE+3]]:1: ERROR: Use `library` declaration in `Main` package libraries.
 // CHECK:STDERR: package Main library "lib" api;
 // CHECK:STDERR: package Main library "lib" api;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 package Main library "lib" api;
 package Main library "lib" api;

+ 2 - 2
toolchain/check/testdata/packages/no_prelude/export_mixed.carbon

@@ -178,7 +178,7 @@ var d: D = {.y = ()};
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir2, inst+11, unloaded
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir2, inst+11, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir2, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir2, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir2, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir2, inst+2, unloaded
-// CHECK:STDOUT:   %C: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {
@@ -204,7 +204,7 @@ var d: D = {.y = ()};
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+11, unloaded
 // CHECK:STDOUT:   %import_ref.2 = import_ref ir1, inst+11, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+2, unloaded
-// CHECK:STDOUT:   %C: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {

+ 7 - 7
toolchain/check/testdata/packages/no_prelude/export_name.carbon

@@ -257,10 +257,10 @@ private export C;
 // CHECK:STDOUT:   %import_ref.3: type = import_ref ir1, inst+12, loaded [template = constants.%NSC]
 // CHECK:STDOUT:   %import_ref.3: type = import_ref ir1, inst+12, loaded [template = constants.%NSC]
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+2, unloaded
-// CHECK:STDOUT:   %C: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.6 = import_ref ir1, inst+13, unloaded
 // CHECK:STDOUT:   %import_ref.6 = import_ref ir1, inst+13, unloaded
 // CHECK:STDOUT:   %import_ref.7 = import_ref ir1, inst+17, unloaded
 // CHECK:STDOUT:   %import_ref.7 = import_ref ir1, inst+17, unloaded
-// CHECK:STDOUT:   %NSC: type = bind_export NSC, %import_ref.3 [template = constants.%NSC]
+// CHECK:STDOUT:   %NSC: type = export NSC, %import_ref.3 [template = constants.%NSC]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {
@@ -313,10 +313,10 @@ private export C;
 // CHECK:STDOUT:   %import_ref.3: type = import_ref ir1, inst+21, loaded [template = constants.%NSC]
 // CHECK:STDOUT:   %import_ref.3: type = import_ref ir1, inst+21, loaded [template = constants.%NSC]
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+12, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+12, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+11, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+11, unloaded
-// CHECK:STDOUT:   %C: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT:   %import_ref.6 = import_ref ir1, inst+20, unloaded
 // CHECK:STDOUT:   %import_ref.6 = import_ref ir1, inst+20, unloaded
 // CHECK:STDOUT:   %import_ref.7 = import_ref ir1, inst+19, unloaded
 // CHECK:STDOUT:   %import_ref.7 = import_ref ir1, inst+19, unloaded
-// CHECK:STDOUT:   %NSC: type = bind_export NSC, %import_ref.3 [template = constants.%NSC]
+// CHECK:STDOUT:   %NSC: type = export NSC, %import_ref.3 [template = constants.%NSC]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {
@@ -804,8 +804,8 @@ private export C;
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+12, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+12, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+2, unloaded
-// CHECK:STDOUT:   %C.loc6: type = bind_export C, %import_ref.1 [template = constants.%C]
-// CHECK:STDOUT:   %C.loc7: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C.loc6: type = export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C.loc7: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {
@@ -878,7 +878,7 @@ private export C;
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+12, unloaded
 // CHECK:STDOUT:   %import_ref.3 = import_ref ir1, inst+12, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.4 = import_ref ir1, inst+7, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+2, unloaded
 // CHECK:STDOUT:   %import_ref.5 = import_ref ir1, inst+2, unloaded
-// CHECK:STDOUT:   %C: type = bind_export C, %import_ref.1 [template = constants.%C]
+// CHECK:STDOUT:   %C: type = export C, %import_ref.1 [template = constants.%C]
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: class @C {
 // CHECK:STDOUT: class @C {

+ 1 - 1
toolchain/check/testdata/var/no_prelude/export_name.carbon

@@ -70,7 +70,7 @@ var w: () = v;
 // CHECK:STDOUT:     .v = %import_ref
 // CHECK:STDOUT:     .v = %import_ref
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   }
 // CHECK:STDOUT:   %import_ref: ref () = import_ref ir1, inst+5, loaded
 // CHECK:STDOUT:   %import_ref: ref () = import_ref ir1, inst+5, loaded
-// CHECK:STDOUT:   %v: ref () = bind_export v, %import_ref
+// CHECK:STDOUT:   %v: ref () = export v, %import_ref
 // CHECK:STDOUT: }
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT:
 // CHECK:STDOUT: --- fail_todo_use_export.carbon
 // CHECK:STDOUT: --- fail_todo_use_export.carbon

+ 2 - 2
toolchain/lower/handle.cpp

@@ -88,8 +88,8 @@ auto HandleBindAlias(FunctionContext& context, SemIR::InstId inst_id,
   context.SetLocal(inst_id, context.GetValue(inst.value_id));
   context.SetLocal(inst_id, context.GetValue(inst.value_id));
 }
 }
 
 
-auto HandleBindExport(FunctionContext& context, SemIR::InstId inst_id,
-                      SemIR::BindExport inst) -> void {
+auto HandleExportDecl(FunctionContext& context, SemIR::InstId inst_id,
+                      SemIR::ExportDecl inst) -> void {
   auto type_inst_id = context.sem_ir().types().GetInstId(inst.type_id);
   auto type_inst_id = context.sem_ir().types().GetInstId(inst.type_id);
   if (type_inst_id == SemIR::InstId::BuiltinNamespaceType) {
   if (type_inst_id == SemIR::InstId::BuiltinNamespaceType) {
     return;
     return;

+ 7 - 7
toolchain/parse/context.h

@@ -39,7 +39,7 @@ class Context {
   // Possible return values for FindListToken.
   // Possible return values for FindListToken.
   enum class ListTokenKind : int8_t { Comma, Close, CommaClose };
   enum class ListTokenKind : int8_t { Comma, Close, CommaClose };
 
 
-  // Used for restricting ordering of `package` and `import` directives.
+  // Used for restricting ordering of `package` and `import` declarations.
   enum class PackagingState : int8_t {
   enum class PackagingState : int8_t {
     FileStart,
     FileStart,
     InImports,
     InImports,
@@ -302,12 +302,12 @@ class Context {
   auto RecoverFromDeclError(StateStackEntry state, NodeKind node_kind,
   auto RecoverFromDeclError(StateStackEntry state, NodeKind node_kind,
                             bool skip_past_likely_end) -> void;
                             bool skip_past_likely_end) -> void;
 
 
-  // Sets the package directive information. Called at most once.
-  auto set_packaging_directive(Tree::PackagingNames packaging_names,
-                               Tree::ApiOrImpl api_or_impl) -> void {
-    CARBON_CHECK(!tree_->packaging_directive_);
-    tree_->packaging_directive_ = {.names = packaging_names,
-                                   .api_or_impl = api_or_impl};
+  // Sets the package declaration information. Called at most once.
+  auto set_packaging_decl(Tree::PackagingNames packaging_names,
+                          Tree::ApiOrImpl api_or_impl) -> void {
+    CARBON_CHECK(!tree_->packaging_decl_);
+    tree_->packaging_decl_ = {.names = packaging_names,
+                              .api_or_impl = api_or_impl};
   }
   }
 
 
   // Adds an import.
   // Adds an import.

+ 40 - 40
toolchain/parse/handle_import_and_package.cpp

@@ -12,8 +12,8 @@ namespace Carbon::Parse {
 
 
 // Provides common error exiting logic that skips to the semi, if present.
 // Provides common error exiting logic that skips to the semi, if present.
 static auto OnParseError(Context& context, Context::StateStackEntry state,
 static auto OnParseError(Context& context, Context::StateStackEntry state,
-                         NodeKind directive) -> void {
-  return context.AddNode(directive, context.SkipPastLikelyEnd(state.token),
+                         NodeKind declaration) -> void {
+  return context.AddNode(declaration, context.SkipPastLikelyEnd(state.token),
                          state.subtree_start, /*has_error=*/true);
                          state.subtree_start, /*has_error=*/true);
 }
 }
 
 
@@ -70,16 +70,15 @@ static auto HandleApiOrImpl(Context& context)
   }
   }
 }
 }
 
 
-// Handles everything after the directive's introducer.
-static auto HandleDirectiveContent(Context& context,
-                                   Context::StateStackEntry state,
-                                   NodeKind directive, bool is_export,
-                                   llvm::function_ref<void()> on_parse_error)
+// Handles everything after the declaration's introducer.
+static auto HandleDeclContent(Context& context, Context::StateStackEntry state,
+                              NodeKind declaration, bool is_export,
+                              llvm::function_ref<void()> on_parse_error)
     -> void {
     -> void {
   Tree::PackagingNames names{
   Tree::PackagingNames names{
-      .node_id = ImportDirectiveId(NodeId(state.subtree_start)),
+      .node_id = ImportDeclId(NodeId(state.subtree_start)),
       .is_export = is_export};
       .is_export = is_export};
-  if (directive != NodeKind::LibraryDirective) {
+  if (declaration != NodeKind::LibraryDecl) {
     if (auto package_name_token =
     if (auto package_name_token =
             context.ConsumeIf(Lex::TokenKind::Identifier)) {
             context.ConsumeIf(Lex::TokenKind::Identifier)) {
       if (names.is_export) {
       if (names.is_export) {
@@ -92,14 +91,14 @@ static auto HandleDirectiveContent(Context& context,
       }
       }
       names.package_id = context.tokens().GetIdentifier(*package_name_token);
       names.package_id = context.tokens().GetIdentifier(*package_name_token);
       context.AddLeafNode(NodeKind::PackageName, *package_name_token);
       context.AddLeafNode(NodeKind::PackageName, *package_name_token);
-    } else if (directive == NodeKind::PackageDirective ||
+    } else if (declaration == NodeKind::PackageDecl ||
                !context.PositionIs(Lex::TokenKind::Library)) {
                !context.PositionIs(Lex::TokenKind::Library)) {
       CARBON_DIAGNOSTIC(ExpectedIdentifierAfterPackage, Error,
       CARBON_DIAGNOSTIC(ExpectedIdentifierAfterPackage, Error,
                         "Expected identifier after `package`.");
                         "Expected identifier after `package`.");
       CARBON_DIAGNOSTIC(ExpectedIdentifierAfterImport, Error,
       CARBON_DIAGNOSTIC(ExpectedIdentifierAfterImport, Error,
                         "Expected identifier or `library` after `import`.");
                         "Expected identifier or `library` after `import`.");
       context.emitter().Emit(*context.position(),
       context.emitter().Emit(*context.position(),
-                             directive == NodeKind::PackageDirective
+                             declaration == NodeKind::PackageDecl
                                  ? ExpectedIdentifierAfterPackage
                                  ? ExpectedIdentifierAfterPackage
                                  : ExpectedIdentifierAfterImport);
                                  : ExpectedIdentifierAfterImport);
       on_parse_error();
       on_parse_error();
@@ -109,7 +108,7 @@ static auto HandleDirectiveContent(Context& context,
 
 
   // Parse the optional library keyword.
   // Parse the optional library keyword.
   bool accept_default = !names.package_id.is_valid();
   bool accept_default = !names.package_id.is_valid();
-  if (directive == NodeKind::LibraryDirective) {
+  if (declaration == NodeKind::LibraryDecl) {
     auto library_id = HandleLibraryName(context, accept_default);
     auto library_id = HandleLibraryName(context, accept_default);
     if (!library_id) {
     if (!library_id) {
       on_parse_error();
       on_parse_error();
@@ -144,7 +143,7 @@ static auto HandleDirectiveContent(Context& context,
   }
   }
 
 
   std::optional<Tree::ApiOrImpl> api_or_impl;
   std::optional<Tree::ApiOrImpl> api_or_impl;
-  if (directive != NodeKind::ImportDirective) {
+  if (declaration != NodeKind::ImportDecl) {
     api_or_impl = HandleApiOrImpl(context);
     api_or_impl = HandleApiOrImpl(context);
     if (!api_or_impl) {
     if (!api_or_impl) {
       on_parse_error();
       on_parse_error();
@@ -153,13 +152,13 @@ static auto HandleDirectiveContent(Context& context,
   }
   }
 
 
   if (auto semi = context.ConsumeIf(Lex::TokenKind::Semi)) {
   if (auto semi = context.ConsumeIf(Lex::TokenKind::Semi)) {
-    if (directive == NodeKind::ImportDirective) {
+    if (declaration == NodeKind::ImportDecl) {
       context.AddImport(names);
       context.AddImport(names);
     } else {
     } else {
-      context.set_packaging_directive(names, *api_or_impl);
+      context.set_packaging_decl(names, *api_or_impl);
     }
     }
 
 
-    context.AddNode(directive, *semi, state.subtree_start, state.has_error);
+    context.AddNode(declaration, *semi, state.subtree_start, state.has_error);
   } else {
   } else {
     context.DiagnoseExpectedDeclSemi(context.tokens().GetKind(state.token));
     context.DiagnoseExpectedDeclSemi(context.tokens().GetKind(state.token));
     on_parse_error();
     on_parse_error();
@@ -183,8 +182,8 @@ static auto VerifyInImports(Context& context, Lex::TokenIndex intro_token)
       context.set_packaging_state(
       context.set_packaging_state(
           Context::PackagingState::InImportsAfterNonPackagingDecl);
           Context::PackagingState::InImportsAfterNonPackagingDecl);
       CARBON_DIAGNOSTIC(ImportTooLate, Error,
       CARBON_DIAGNOSTIC(ImportTooLate, Error,
-                        "`import` directives must come after the `package` "
-                        "directive (if present) and before any other "
+                        "`import` declarations must come after the `package` "
+                        "declaration (if present) and before any other "
                         "entities in the file.");
                         "entities in the file.");
       CARBON_DIAGNOSTIC(FirstDecl, Note, "First declaration is here.");
       CARBON_DIAGNOSTIC(FirstDecl, Note, "First declaration is here.");
       context.emitter()
       context.emitter()
@@ -207,8 +206,8 @@ static auto VerifyInImports(Context& context, Lex::TokenIndex intro_token)
 static auto HandleImportHelper(Context& context,
 static auto HandleImportHelper(Context& context,
                                const Context::StateStackEntry& state,
                                const Context::StateStackEntry& state,
                                Lex::TokenIndex export_token) -> void {
                                Lex::TokenIndex export_token) -> void {
-  auto directive = NodeKind::ImportDirective;
-  auto on_parse_error = [&] { OnParseError(context, state, directive); };
+  auto declaration = NodeKind::ImportDecl;
+  auto on_parse_error = [&] { OnParseError(context, state, declaration); };
 
 
   auto intro_token = context.ConsumeChecked(Lex::TokenKind::Import);
   auto intro_token = context.ConsumeChecked(Lex::TokenKind::Import);
   context.AddLeafNode(NodeKind::ImportIntroducer, intro_token);
   context.AddLeafNode(NodeKind::ImportIntroducer, intro_token);
@@ -218,8 +217,8 @@ static auto HandleImportHelper(Context& context,
   }
   }
 
 
   if (VerifyInImports(context, intro_token)) {
   if (VerifyInImports(context, intro_token)) {
-    HandleDirectiveContent(context, state, directive, export_token.is_valid(),
-                           on_parse_error);
+    HandleDeclContent(context, state, declaration, export_token.is_valid(),
+                      on_parse_error);
   } else {
   } else {
     on_parse_error();
     on_parse_error();
   }
   }
@@ -235,7 +234,7 @@ auto HandleImportAsRegular(Context& context) -> void {
 static auto RestrictExportToApi(Context& context,
 static auto RestrictExportToApi(Context& context,
                                 Context::StateStackEntry& state) -> void {
                                 Context::StateStackEntry& state) -> void {
   // Error for both Main//default and every implementation file.
   // Error for both Main//default and every implementation file.
-  auto packaging = context.tree().packaging_directive();
+  auto packaging = context.tree().packaging_decl();
   if (!packaging || packaging->api_or_impl == Tree::ApiOrImpl::Impl) {
   if (!packaging || packaging->api_or_impl == Tree::ApiOrImpl::Impl) {
     CARBON_DIAGNOSTIC(ExportFromImpl, Error,
     CARBON_DIAGNOSTIC(ExportFromImpl, Error,
                       "`export` is only allowed in API files.");
                       "`export` is only allowed in API files.");
@@ -265,27 +264,28 @@ auto HandleExportName(Context& context) -> void {
 auto HandleExportNameFinish(Context& context) -> void {
 auto HandleExportNameFinish(Context& context) -> void {
   auto state = context.PopState();
   auto state = context.PopState();
 
 
-  context.AddNodeExpectingDeclSemi(state, NodeKind::ExportDirective,
+  context.AddNodeExpectingDeclSemi(state, NodeKind::ExportDecl,
                                    Lex::TokenKind::Export,
                                    Lex::TokenKind::Export,
                                    /*is_def_allowed=*/false);
                                    /*is_def_allowed=*/false);
 }
 }
 
 
 // Handles common logic for `package` and `library`.
 // Handles common logic for `package` and `library`.
-static auto HandlePackageAndLibraryDirectives(Context& context,
-                                              Lex::TokenKind intro_token_kind,
-                                              NodeKind intro,
-                                              NodeKind directive) -> void {
+static auto HandlePackageAndLibraryDecls(Context& context,
+                                         Lex::TokenKind intro_token_kind,
+                                         NodeKind intro, NodeKind declaration)
+    -> void {
   auto state = context.PopState();
   auto state = context.PopState();
 
 
-  auto on_parse_error = [&] { OnParseError(context, state, directive); };
+  auto on_parse_error = [&] { OnParseError(context, state, declaration); };
 
 
   auto intro_token = context.ConsumeChecked(intro_token_kind);
   auto intro_token = context.ConsumeChecked(intro_token_kind);
   context.AddLeafNode(intro, intro_token);
   context.AddLeafNode(intro, intro_token);
 
 
   if (intro_token != Lex::TokenIndex::FirstNonCommentToken) {
   if (intro_token != Lex::TokenIndex::FirstNonCommentToken) {
-    CARBON_DIAGNOSTIC(PackageTooLate, Error,
-                      "The `{0}` directive must be the first non-comment line.",
-                      Lex::TokenKind);
+    CARBON_DIAGNOSTIC(
+        PackageTooLate, Error,
+        "The `{0}` declaration must be the first non-comment line.",
+        Lex::TokenKind);
     CARBON_DIAGNOSTIC(FirstNonCommentLine, Note,
     CARBON_DIAGNOSTIC(FirstNonCommentLine, Note,
                       "First non-comment line is here.");
                       "First non-comment line is here.");
     context.emitter()
     context.emitter()
@@ -299,20 +299,20 @@ static auto HandlePackageAndLibraryDirectives(Context& context,
   // `package`/`library` is no longer allowed, but `import` may repeat.
   // `package`/`library` is no longer allowed, but `import` may repeat.
   context.set_packaging_state(Context::PackagingState::InImports);
   context.set_packaging_state(Context::PackagingState::InImports);
 
 
-  HandleDirectiveContent(context, state, directive, /*is_export=*/false,
-                         on_parse_error);
+  HandleDeclContent(context, state, declaration, /*is_export=*/false,
+                    on_parse_error);
 }
 }
 
 
 auto HandlePackage(Context& context) -> void {
 auto HandlePackage(Context& context) -> void {
-  HandlePackageAndLibraryDirectives(context, Lex::TokenKind::Package,
-                                    NodeKind::PackageIntroducer,
-                                    NodeKind::PackageDirective);
+  HandlePackageAndLibraryDecls(context, Lex::TokenKind::Package,
+                               NodeKind::PackageIntroducer,
+                               NodeKind::PackageDecl);
 }
 }
 
 
 auto HandleLibrary(Context& context) -> void {
 auto HandleLibrary(Context& context) -> void {
-  HandlePackageAndLibraryDirectives(context, Lex::TokenKind::Library,
-                                    NodeKind::LibraryIntroducer,
-                                    NodeKind::LibraryDirective);
+  HandlePackageAndLibraryDecls(context, Lex::TokenKind::Library,
+                               NodeKind::LibraryIntroducer,
+                               NodeKind::LibraryDecl);
 }
 }
 
 
 }  // namespace Carbon::Parse
 }  // namespace Carbon::Parse

+ 1 - 1
toolchain/parse/node_ids.h

@@ -98,7 +98,7 @@ using AnyFunctionDeclId = NodeIdOneOf<FunctionDeclId, FunctionDefinitionStartId,
 using AnyImplDeclId = NodeIdOneOf<ImplDeclId, ImplDefinitionStartId>;
 using AnyImplDeclId = NodeIdOneOf<ImplDeclId, ImplDefinitionStartId>;
 using AnyInterfaceDeclId =
 using AnyInterfaceDeclId =
     NodeIdOneOf<InterfaceDeclId, InterfaceDefinitionStartId>;
     NodeIdOneOf<InterfaceDeclId, InterfaceDefinitionStartId>;
-using AnyNamespaceId = NodeIdOneOf<NamespaceId, ImportDirectiveId>;
+using AnyNamespaceId = NodeIdOneOf<NamespaceId, ImportDeclId>;
 using AnyPointerDeferenceExprId =
 using AnyPointerDeferenceExprId =
     NodeIdOneOf<PrefixOperatorStarId, PointerMemberAccessExprId>;
     NodeIdOneOf<PrefixOperatorStarId, PointerMemberAccessExprId>;
 
 

+ 9 - 9
toolchain/parse/node_kind.def

@@ -185,11 +185,11 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibraryName, 0, StringLiteral)
 //   _optional_ _external_: PackageName
 //   _optional_ _external_: PackageName
 //   _optional_ _external_: LibrarySpecifier
 //   _optional_ _external_: LibrarySpecifier
 //   PackageApi or PackageImpl
 //   PackageApi or PackageImpl
-// PackageDirective
+// PackageDecl
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageIntroducer, 0, Package)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageIntroducer, 0, Package)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageApi, 0, Api)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageApi, 0, Api)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageImpl, 0, Impl)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(PackageImpl, 0, Impl)
-CARBON_PARSE_NODE_KIND_BRACKET(PackageDirective, PackageIntroducer,
+CARBON_PARSE_NODE_KIND_BRACKET(PackageDecl, PackageIntroducer,
                                CARBON_IF_VALID(Semi))
                                CARBON_IF_VALID(Semi))
 
 
 // `import`:
 // `import`:
@@ -197,20 +197,20 @@ CARBON_PARSE_NODE_KIND_BRACKET(PackageDirective, PackageIntroducer,
 //   _optional_: ImportExport
 //   _optional_: ImportExport
 //   _optional_ _external_: PackageName
 //   _optional_ _external_: PackageName
 //   _optional_ _external_: LibrarySpecifier
 //   _optional_ _external_: LibrarySpecifier
-// ImportDirective
+// ImportDecl
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImportIntroducer, 0, Import)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImportIntroducer, 0, Import)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImportExport, 0, Export)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(ImportExport, 0, Export)
-CARBON_PARSE_NODE_KIND_BRACKET(ImportDirective, ImportIntroducer,
+CARBON_PARSE_NODE_KIND_BRACKET(ImportDecl, ImportIntroducer,
                                CARBON_IF_VALID(Semi))
                                CARBON_IF_VALID(Semi))
 
 
-// `library` as directive:
+// `library` as declaration:
 //   LibraryIntroducer
 //   LibraryIntroducer
 //   DefaultLibrary or _external_: LibraryName
 //   DefaultLibrary or _external_: LibraryName
 //   PackageApi or PackageImpl
 //   PackageApi or PackageImpl
-// LibraryDirective
+// LibraryDecl
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(DefaultLibrary, 0, Default)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(DefaultLibrary, 0, Default)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibraryIntroducer, 0, Library)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibraryIntroducer, 0, Library)
-CARBON_PARSE_NODE_KIND_BRACKET(LibraryDirective, LibraryIntroducer,
+CARBON_PARSE_NODE_KIND_BRACKET(LibraryDecl, LibraryIntroducer,
                                CARBON_IF_VALID(Semi))
                                CARBON_IF_VALID(Semi))
 
 
 // `library` in `package` or `import`:
 // `library` in `package` or `import`:
@@ -221,9 +221,9 @@ CARBON_PARSE_NODE_KIND_CHILD_COUNT(LibrarySpecifier, 1, Library)
 // `export`:
 // `export`:
 //   ExportIntroducer
 //   ExportIntroducer
 //   _external_: IdentifierName or QualifiedName
 //   _external_: IdentifierName or QualifiedName
-// ExportDirective
+// ExportDecl
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(ExportIntroducer, 0, Export)
 CARBON_PARSE_NODE_KIND_CHILD_COUNT(ExportIntroducer, 0, Export)
-CARBON_PARSE_NODE_KIND_BRACKET(ExportDirective, ExportIntroducer,
+CARBON_PARSE_NODE_KIND_BRACKET(ExportDecl, ExportIntroducer,
                                CARBON_IF_VALID(Semi))
                                CARBON_IF_VALID(Semi))
 
 
 // `namespace`:
 // `namespace`:

+ 1 - 1
toolchain/parse/state.def

@@ -701,7 +701,7 @@ CARBON_PARSE_STATE(ExportNameFinish)
 //   (state done)
 //   (state done)
 CARBON_PARSE_STATE_VARIANTS2(Import, Regular, Export)
 CARBON_PARSE_STATE_VARIANTS2(Import, Regular, Export)
 
 
-// Handles `library` in directive form.
+// Handles `library` in declaration form.
 //
 //
 // Always:
 // Always:
 //   (state done)
 //   (state done)

+ 28 - 28
toolchain/parse/testdata/packages/export.carbon

@@ -104,7 +104,7 @@ package Pkg api;
 
 
 export Foo;
 export Foo;
 
 
-// CHECK:STDERR: fail_before_import.carbon:[[@LINE+7]]:1: ERROR: `import` directives must come after the `package` directive (if present) and before any other entities in the file.
+// CHECK:STDERR: fail_before_import.carbon:[[@LINE+7]]:1: ERROR: `import` declarations must come after the `package` declaration (if present) and before any other entities in the file.
 // CHECK:STDERR: import library "lib";
 // CHECK:STDERR: import library "lib";
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: fail_before_import.carbon:[[@LINE-5]]:1: First declaration is here.
 // CHECK:STDERR: fail_before_import.carbon:[[@LINE-5]]:1: First declaration is here.
@@ -136,7 +136,7 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: name.carbon
 // CHECK:STDOUT: - filename: name.carbon
@@ -145,10 +145,10 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: qual_name.carbon
 // CHECK:STDOUT: - filename: qual_name.carbon
@@ -157,12 +157,12 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'Bar'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'Bar'},
 // CHECK:STDOUT:       {kind: 'QualifiedName', text: '.', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'QualifiedName', text: '.', subtree_size: 3},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_expr.carbon
 // CHECK:STDOUT: - filename: fail_expr.carbon
@@ -171,10 +171,10 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: '(', has_error: yes},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: '(', has_error: yes},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_package_in_name.carbon
 // CHECK:STDOUT: - filename: fail_package_in_name.carbon
@@ -183,10 +183,10 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: 'package', has_error: yes},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: 'package', has_error: yes},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_keyword_only
 // CHECK:STDOUT: - filename: fail_keyword_only
@@ -195,10 +195,10 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: '', has_error: yes},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: '', has_error: yes},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: 'export', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: 'export', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_no_name.carbon
 // CHECK:STDOUT: - filename: fail_no_name.carbon
@@ -207,10 +207,10 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: ';', has_error: yes},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: ';', has_error: yes},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_no_semi.carbon
 // CHECK:STDOUT: - filename: fail_no_semi.carbon
@@ -219,10 +219,10 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: 'Foo', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: 'Foo', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_incomplete_qual_name.carbon
 // CHECK:STDOUT: - filename: fail_incomplete_qual_name.carbon
@@ -231,12 +231,12 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: ';', has_error: yes},
 // CHECK:STDOUT:         {kind: 'IdentifierName', text: ';', has_error: yes},
 // CHECK:STDOUT:       {kind: 'QualifiedName', text: '.', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'QualifiedName', text: '.', subtree_size: 3},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_incomplete_qual_name2.carbon
 // CHECK:STDOUT: - filename: fail_incomplete_qual_name2.carbon
@@ -245,10 +245,10 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: '.', has_error: yes},
 // CHECK:STDOUT:       {kind: 'InvalidParse', text: '.', has_error: yes},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: after_decl.carbon
 // CHECK:STDOUT: - filename: after_decl.carbon
@@ -257,13 +257,13 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ClassIntroducer', text: 'class'},
 // CHECK:STDOUT:       {kind: 'ClassIntroducer', text: 'class'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'C'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'C'},
 // CHECK:STDOUT:     {kind: 'ClassDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'ClassDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_before_import.carbon
 // CHECK:STDOUT: - filename: fail_before_import.carbon
@@ -272,12 +272,12 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_in_default_library.carbon
 // CHECK:STDOUT: - filename: fail_in_default_library.carbon
@@ -285,7 +285,7 @@ export Foo;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_in_impl.carbon
 // CHECK:STDOUT: - filename: fail_in_impl.carbon
@@ -294,9 +294,9 @@ export Foo;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ExportIntroducer', text: 'export'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'Foo'},
-// CHECK:STDOUT:     {kind: 'ExportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ExportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 2 - 2
toolchain/parse/testdata/packages/import/after_import.carbon

@@ -12,9 +12,9 @@ import B;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 2 - 2
toolchain/parse/testdata/packages/import/after_package.carbon

@@ -14,9 +14,9 @@ import B;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/basic.carbon

@@ -11,6 +11,6 @@ import Geometry;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 2 - 2
toolchain/parse/testdata/packages/import/current_package_library.carbon

@@ -18,7 +18,7 @@ import library "Shapes";
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:         {kind: 'DefaultLibrary', text: 'default'},
 // CHECK:STDOUT:         {kind: 'DefaultLibrary', text: 'default'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: named.carbon
 // CHECK:STDOUT: - filename: named.carbon
@@ -27,6 +27,6 @@ import library "Shapes";
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 13 - 13
toolchain/parse/testdata/packages/import/export.carbon

@@ -34,7 +34,7 @@ export import library "a";
 
 
 class C;
 class C;
 
 
-// CHECK:STDERR: fail_order.carbon:[[@LINE+7]]:8: ERROR: `import` directives must come after the `package` directive (if present) and before any other entities in the file.
+// CHECK:STDERR: fail_order.carbon:[[@LINE+7]]:8: ERROR: `import` declarations must come after the `package` declaration (if present) and before any other entities in the file.
 // CHECK:STDERR: export import library "b";
 // CHECK:STDERR: export import library "b";
 // CHECK:STDERR:        ^~~~~~
 // CHECK:STDERR:        ^~~~~~
 // CHECK:STDERR: fail_order.carbon:[[@LINE-5]]:1: First declaration is here.
 // CHECK:STDERR: fail_order.carbon:[[@LINE-5]]:1: First declaration is here.
@@ -66,11 +66,11 @@ export import library "lib";
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Bar'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Bar'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: default.carbon
 // CHECK:STDOUT: - filename: default.carbon
@@ -79,12 +79,12 @@ export import library "lib";
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:         {kind: 'DefaultLibrary', text: 'default'},
 // CHECK:STDOUT:         {kind: 'DefaultLibrary', text: 'default'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: named.carbon
 // CHECK:STDOUT: - filename: named.carbon
@@ -93,12 +93,12 @@ export import library "lib";
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_order.carbon
 // CHECK:STDOUT: - filename: fail_order.carbon
@@ -107,18 +107,18 @@ export import library "lib";
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"a"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"a"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'ClassIntroducer', text: 'class'},
 // CHECK:STDOUT:       {kind: 'ClassIntroducer', text: 'class'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'C'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'C'},
 // CHECK:STDOUT:     {kind: 'ClassDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'ClassDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_in_default_library.carbon
 // CHECK:STDOUT: - filename: fail_in_default_library.carbon
@@ -128,7 +128,7 @@ export import library "lib";
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_in_impl.carbon
 // CHECK:STDOUT: - filename: fail_in_impl.carbon
@@ -137,11 +137,11 @@ export import library "lib";
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Pkg'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:       {kind: 'ImportExport', text: 'export'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"lib"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 2 - 2
toolchain/parse/testdata/packages/import/fail_after_decl.carbon

@@ -6,7 +6,7 @@
 
 
 fn A();
 fn A();
 
 
-// CHECK:STDERR: fail_after_decl.carbon:[[@LINE+6]]:1: ERROR: `import` directives must come after the `package` directive (if present) and before any other entities in the file.
+// CHECK:STDERR: fail_after_decl.carbon:[[@LINE+6]]:1: ERROR: `import` declarations must come after the `package` declaration (if present) and before any other entities in the file.
 // CHECK:STDERR: import B;
 // CHECK:STDERR: import B;
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: fail_after_decl.carbon:[[@LINE-5]]:1: First declaration is here.
 // CHECK:STDERR: fail_after_decl.carbon:[[@LINE-5]]:1: First declaration is here.
@@ -23,6 +23,6 @@ import B;
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 8 - 8
toolchain/parse/testdata/packages/import/fail_after_decl_repeated.carbon

@@ -6,7 +6,7 @@
 
 
 fn A();
 fn A();
 
 
-// CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE+7]]:1: ERROR: `import` directives must come after the `package` directive (if present) and before any other entities in the file.
+// CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE+7]]:1: ERROR: `import` declarations must come after the `package` declaration (if present) and before any other entities in the file.
 // CHECK:STDERR: import B;
 // CHECK:STDERR: import B;
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE-5]]:1: First declaration is here.
 // CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE-5]]:1: First declaration is here.
@@ -17,7 +17,7 @@ import B;
 // Note this is still invalid, but doesn't warn because it's sequential.
 // Note this is still invalid, but doesn't warn because it's sequential.
 import C;
 import C;
 
 
-// CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE+7]]:1: ERROR: The `package` directive must be the first non-comment line.
+// CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE+7]]:1: ERROR: The `package` declaration must be the first non-comment line.
 // CHECK:STDERR: package D;
 // CHECK:STDERR: package D;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE-16]]:1: First non-comment line is here.
 // CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE-16]]:1: First non-comment line is here.
@@ -28,7 +28,7 @@ package D;
 
 
 fn E();
 fn E();
 
 
-// CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE+6]]:1: ERROR: `import` directives must come after the `package` directive (if present) and before any other entities in the file.
+// CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE+6]]:1: ERROR: `import` declarations must come after the `package` declaration (if present) and before any other entities in the file.
 // CHECK:STDERR: import F;
 // CHECK:STDERR: import F;
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: ^~~~~~
 // CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE-27]]:1: First declaration is here.
 // CHECK:STDERR: fail_after_decl_repeated.carbon:[[@LINE-27]]:1: First declaration is here.
@@ -47,19 +47,19 @@ import G;
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'FunctionIntroducer', text: 'fn'},
 // CHECK:STDOUT:       {kind: 'FunctionIntroducer', text: 'fn'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'E'},
 // CHECK:STDOUT:       {kind: 'IdentifierName', text: 'E'},
 // CHECK:STDOUT:         {kind: 'TuplePatternStart', text: '('},
 // CHECK:STDOUT:         {kind: 'TuplePatternStart', text: '('},
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/fail_extra_string.carbon

@@ -16,6 +16,6 @@ import Foo library "bar" "baz";
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Foo'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"bar"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"bar"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/fail_library_is_identifier.carbon

@@ -14,6 +14,6 @@ import Geometry library Shapes;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/fail_name_is_keyword.carbon

@@ -13,6 +13,6 @@ import fn;
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/fail_no_name.carbon

@@ -13,6 +13,6 @@ import;
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/fail_no_semi.carbon

@@ -14,6 +14,6 @@ import Geometry
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: 'Geometry', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: 'Geometry', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/fail_omit_library_keyword.carbon

@@ -14,6 +14,6 @@ import Geometry "Shapes";
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/fail_type.carbon

@@ -14,6 +14,6 @@ import Geometry api;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/import/library.carbon

@@ -13,6 +13,6 @@ import Geometry library "Shapes";
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 6 - 6
toolchain/parse/testdata/packages/import/ordering.carbon

@@ -26,10 +26,10 @@ import B;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: after_library.carbon
 // CHECK:STDOUT: - filename: after_library.carbon
@@ -38,10 +38,10 @@ import B;
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"A"'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"A"'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: after_package.carbon
 // CHECK:STDOUT: - filename: after_package.carbon
@@ -50,9 +50,9 @@ import B;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'B'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 2 - 2
toolchain/parse/testdata/packages/library/basic.carbon

@@ -18,7 +18,7 @@ library "Shapes" impl;
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'DefaultLibrary', text: 'default'},
 // CHECK:STDOUT:       {kind: 'DefaultLibrary', text: 'default'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: named.carbon
 // CHECK:STDOUT: - filename: named.carbon
@@ -27,6 +27,6 @@ library "Shapes" impl;
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 5 - 5
toolchain/parse/testdata/packages/library/fail_invalid_name.carbon

@@ -47,28 +47,28 @@ library "NoSemi" api
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_raw_identifier.carbon
 // CHECK:STDOUT: - filename: fail_raw_identifier.carbon
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_missing.carbon
 // CHECK:STDOUT: - filename: fail_missing.carbon
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_missing_with_api.carbon
 // CHECK:STDOUT: - filename: fail_missing_with_api.carbon
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT: - filename: fail_no_semi.carbon
 // CHECK:STDOUT: - filename: fail_no_semi.carbon
@@ -77,6 +77,6 @@ library "NoSemi" api
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"NoSemi"'},
 // CHECK:STDOUT:       {kind: 'LibraryName', text: '"NoSemi"'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: 'api', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: 'api', has_error: yes, subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/packages/library/fail_too_late.carbon

@@ -6,7 +6,7 @@
 
 
 import Geometry;
 import Geometry;
 
 
-// CHECK:STDERR: fail_too_late.carbon:[[@LINE+6]]:1: ERROR: The `library` directive must be the first non-comment line.
+// CHECK:STDERR: fail_too_late.carbon:[[@LINE+6]]:1: ERROR: The `library` declaration must be the first non-comment line.
 // CHECK:STDERR: library "Shapes" api;
 // CHECK:STDERR: library "Shapes" api;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: fail_too_late.carbon:[[@LINE-5]]:1: First non-comment line is here.
 // CHECK:STDERR: fail_too_late.carbon:[[@LINE-5]]:1: First non-comment line is here.
@@ -19,8 +19,8 @@ library "Shapes" api;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
 // CHECK:STDOUT:       {kind: 'LibraryIntroducer', text: 'library'},
-// CHECK:STDOUT:     {kind: 'LibraryDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'LibraryDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/api.carbon

@@ -12,6 +12,6 @@ package Geometry api;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/api_library.carbon

@@ -14,6 +14,6 @@ package Geometry library "Shapes" api;
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 6},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 6},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 2 - 2
toolchain/parse/testdata/packages/package/fail_after_decl.carbon

@@ -6,7 +6,7 @@
 
 
 fn A();
 fn A();
 
 
-// CHECK:STDERR: fail_after_decl.carbon:[[@LINE+6]]:1: ERROR: The `package` directive must be the first non-comment line.
+// CHECK:STDERR: fail_after_decl.carbon:[[@LINE+6]]:1: ERROR: The `package` declaration must be the first non-comment line.
 // CHECK:STDERR: package B api;
 // CHECK:STDERR: package B api;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: fail_after_decl.carbon:[[@LINE-5]]:1: First non-comment line is here.
 // CHECK:STDERR: fail_after_decl.carbon:[[@LINE-5]]:1: First non-comment line is here.
@@ -23,6 +23,6 @@ package B api;
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'TuplePattern', text: ')', subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FunctionDecl', text: ';', subtree_size: 5},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/packages/package/fail_after_import.carbon

@@ -6,7 +6,7 @@
 
 
 import A;
 import A;
 
 
-// CHECK:STDERR: fail_after_import.carbon:[[@LINE+6]]:1: ERROR: The `package` directive must be the first non-comment line.
+// CHECK:STDERR: fail_after_import.carbon:[[@LINE+6]]:1: ERROR: The `package` declaration must be the first non-comment line.
 // CHECK:STDERR: package B api;
 // CHECK:STDERR: package B api;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: fail_after_import.carbon:[[@LINE-5]]:1: First non-comment line is here.
 // CHECK:STDERR: fail_after_import.carbon:[[@LINE-5]]:1: First non-comment line is here.
@@ -19,8 +19,8 @@ package B api;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'ImportIntroducer', text: 'import'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
-// CHECK:STDOUT:     {kind: 'ImportDirective', text: ';', subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'ImportDecl', text: ';', subtree_size: 3},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 3 - 3
toolchain/parse/testdata/packages/package/fail_after_package.carbon

@@ -5,7 +5,7 @@
 // AUTOUPDATE
 // AUTOUPDATE
 
 
 package A api;
 package A api;
-// CHECK:STDERR: fail_after_package.carbon:[[@LINE+6]]:1: ERROR: The `package` directive must be the first non-comment line.
+// CHECK:STDERR: fail_after_package.carbon:[[@LINE+6]]:1: ERROR: The `package` declaration must be the first non-comment line.
 // CHECK:STDERR: package B api;
 // CHECK:STDERR: package B api;
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: ^~~~~~~
 // CHECK:STDERR: fail_after_package.carbon:[[@LINE-4]]:1: First non-comment line is here.
 // CHECK:STDERR: fail_after_package.carbon:[[@LINE-4]]:1: First non-comment line is here.
@@ -19,8 +19,8 @@ package B api;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'A'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_extra_string.carbon

@@ -16,6 +16,6 @@ package Foo library "bar" "baz";
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Foo'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Foo'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"bar"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"bar"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 5},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 5},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_library_is_identifier.carbon

@@ -14,6 +14,6 @@ package Geometry library Shapes api;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_library_skips_name.carbon

@@ -13,6 +13,6 @@ package library "Shapes" api;
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_name_is_keyword.carbon

@@ -13,6 +13,6 @@ package fn;
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_no_name.carbon

@@ -13,6 +13,6 @@ package;
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:   parse_tree: [
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 2},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 2},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_no_semi.carbon

@@ -15,6 +15,6 @@ package Geometry api
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
 // CHECK:STDOUT:       {kind: 'PackageApi', text: 'api'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: 'api', has_error: yes, subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: 'api', has_error: yes, subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_no_type.carbon

@@ -14,6 +14,6 @@ package Geometry;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/fail_omit_library_keyword.carbon

@@ -14,6 +14,6 @@ package Geometry "Shapes" api;
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:     {kind: 'FileStart', text: ''},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', has_error: yes, subtree_size: 3},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', has_error: yes, subtree_size: 3},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/impl.carbon

@@ -12,6 +12,6 @@ package Geometry impl;
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageIntroducer', text: 'package'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageName', text: 'Geometry'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 4},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 4},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 1 - 1
toolchain/parse/testdata/packages/package/impl_library.carbon

@@ -14,6 +14,6 @@ package Geometry library "Shapes" impl;
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:         {kind: 'LibraryName', text: '"Shapes"'},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'LibrarySpecifier', text: 'library', subtree_size: 2},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
 // CHECK:STDOUT:       {kind: 'PackageImpl', text: 'impl'},
-// CHECK:STDOUT:     {kind: 'PackageDirective', text: ';', subtree_size: 6},
+// CHECK:STDOUT:     {kind: 'PackageDecl', text: ';', subtree_size: 6},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:     {kind: 'FileEnd', text: ''},
 // CHECK:STDOUT:   ]
 // CHECK:STDOUT:   ]

+ 8 - 8
toolchain/parse/tree.h

@@ -80,7 +80,7 @@ class Tree : public Printable<Tree> {
   class PostorderIterator;
   class PostorderIterator;
   class SiblingIterator;
   class SiblingIterator;
 
 
-  // For PackagingDirective.
+  // For PackagingDecl.
   enum class ApiOrImpl : uint8_t {
   enum class ApiOrImpl : uint8_t {
     Api,
     Api,
     Impl,
     Impl,
@@ -89,16 +89,16 @@ class Tree : public Printable<Tree> {
   // Names in packaging, whether the file's packaging or an import. Links back
   // Names in packaging, whether the file's packaging or an import. Links back
   // to the node for diagnostics.
   // to the node for diagnostics.
   struct PackagingNames {
   struct PackagingNames {
-    ImportDirectiveId node_id;
+    ImportDeclId node_id;
     IdentifierId package_id = IdentifierId::Invalid;
     IdentifierId package_id = IdentifierId::Invalid;
     StringLiteralValueId library_id = StringLiteralValueId::Invalid;
     StringLiteralValueId library_id = StringLiteralValueId::Invalid;
-    // Whether an import is exported. This is on the file's packaging directive
-    // even though it doesn't apply, for consistency in structure.
+    // Whether an import is exported. This is on the file's packaging
+    // declaration even though it doesn't apply, for consistency in structure.
     bool is_export = false;
     bool is_export = false;
   };
   };
 
 
   // The file's packaging.
   // The file's packaging.
-  struct PackagingDirective {
+  struct PackagingDecl {
     PackagingNames names;
     PackagingNames names;
     ApiOrImpl api_or_impl;
     ApiOrImpl api_or_impl;
   };
   };
@@ -180,8 +180,8 @@ class Tree : public Printable<Tree> {
     return T(n);
     return T(n);
   }
   }
 
 
-  auto packaging_directive() const -> const std::optional<PackagingDirective>& {
-    return packaging_directive_;
+  auto packaging_decl() const -> const std::optional<PackagingDecl>& {
+    return packaging_decl_;
   }
   }
   auto imports() const -> llvm::ArrayRef<PackagingNames> { return imports_; }
   auto imports() const -> llvm::ArrayRef<PackagingNames> { return imports_; }
   auto deferred_definitions() const
   auto deferred_definitions() const
@@ -376,7 +376,7 @@ class Tree : public Printable<Tree> {
   // nodes as some tokens may have been skipped.
   // nodes as some tokens may have been skipped.
   bool has_errors_ = false;
   bool has_errors_ = false;
 
 
-  std::optional<PackagingDirective> packaging_directive_;
+  std::optional<PackagingDecl> packaging_decl_;
   llvm::SmallVector<PackagingNames> imports_;
   llvm::SmallVector<PackagingNames> imports_;
   ValueStore<DeferredDefinitionIndex> deferred_definitions_;
   ValueStore<DeferredDefinitionIndex> deferred_definitions_;
 };
 };

+ 10 - 14
toolchain/parse/typed_nodes.h

@@ -167,9 +167,8 @@ struct LibrarySpecifier {
 
 
 // First line of the file, such as:
 // First line of the file, such as:
 //   `package MyPackage library "MyLibrary" impl;`
 //   `package MyPackage library "MyLibrary" impl;`
-struct PackageDirective {
-  static constexpr auto Kind =
-      NodeKind::PackageDirective.Define(NodeCategory::Decl);
+struct PackageDecl {
+  static constexpr auto Kind = NodeKind::PackageDecl.Define(NodeCategory::Decl);
 
 
   PackageIntroducerId introducer;
   PackageIntroducerId introducer;
   std::optional<PackageNameId> name;
   std::optional<PackageNameId> name;
@@ -180,9 +179,8 @@ struct PackageDirective {
 // `import TheirPackage library "TheirLibrary";`
 // `import TheirPackage library "TheirLibrary";`
 using ImportIntroducer = LeafNode<NodeKind::ImportIntroducer>;
 using ImportIntroducer = LeafNode<NodeKind::ImportIntroducer>;
 using ImportExport = LeafNode<NodeKind::ImportExport>;
 using ImportExport = LeafNode<NodeKind::ImportExport>;
-struct ImportDirective {
-  static constexpr auto Kind =
-      NodeKind::ImportDirective.Define(NodeCategory::Decl);
+struct ImportDecl {
+  static constexpr auto Kind = NodeKind::ImportDecl.Define(NodeCategory::Decl);
 
 
   ImportIntroducerId introducer;
   ImportIntroducerId introducer;
   std::optional<ImportExportId> export_modifier;
   std::optional<ImportExportId> export_modifier;
@@ -190,22 +188,20 @@ struct ImportDirective {
   std::optional<LibrarySpecifierId> library;
   std::optional<LibrarySpecifierId> library;
 };
 };
 
 
-// `library` as directive.
+// `library` as declaration.
 using LibraryIntroducer = LeafNode<NodeKind::LibraryIntroducer>;
 using LibraryIntroducer = LeafNode<NodeKind::LibraryIntroducer>;
-struct LibraryDirective {
-  static constexpr auto Kind =
-      NodeKind::LibraryDirective.Define(NodeCategory::Decl);
+struct LibraryDecl {
+  static constexpr auto Kind = NodeKind::LibraryDecl.Define(NodeCategory::Decl);
 
 
   LibraryIntroducerId introducer;
   LibraryIntroducerId introducer;
   NodeIdOneOf<LibraryName, DefaultLibrary> library_name;
   NodeIdOneOf<LibraryName, DefaultLibrary> library_name;
   NodeIdOneOf<PackageApi, PackageImpl> api_or_impl;
   NodeIdOneOf<PackageApi, PackageImpl> api_or_impl;
 };
 };
 
 
-// `export` as a directive.
+// `export` as a declaration.
 using ExportIntroducer = LeafNode<NodeKind::ExportIntroducer>;
 using ExportIntroducer = LeafNode<NodeKind::ExportIntroducer>;
-struct ExportDirective {
-  static constexpr auto Kind =
-      NodeKind::ExportDirective.Define(NodeCategory::Decl);
+struct ExportDecl {
+  static constexpr auto Kind = NodeKind::ExportDecl.Define(NodeCategory::Decl);
 
 
   ExportIntroducerId introducer;
   ExportIntroducerId introducer;
   llvm::SmallVector<AnyModifierId> modifiers;
   llvm::SmallVector<AnyModifierId> modifiers;

+ 1 - 1
toolchain/parse/typed_nodes_test.cpp

@@ -144,7 +144,7 @@ TEST_F(TypedNodeTest, VerifyExtractTraceLibrary) {
 
 
   ASSERT_EQ(file.decls.size(), 1);
   ASSERT_EQ(file.decls.size(), 1);
   ErrorBuilder trace;
   ErrorBuilder trace;
-  auto library = tree->VerifyExtractAs<LibraryDirective>(file.decls[0], &trace);
+  auto library = tree->VerifyExtractAs<LibraryDecl>(file.decls[0], &trace);
   EXPECT_TRUE(library.has_value());
   EXPECT_TRUE(library.has_value());
   Error err = trace;
   Error err = trace;
   // Use Regex matching to avoid hard-coding the result of `typeinfo(T).name()`.
   // Use Regex matching to avoid hard-coding the result of `typeinfo(T).name()`.

+ 4 - 4
toolchain/sem_ir/file.cpp

@@ -266,9 +266,9 @@ static auto StringifyTypeExprImpl(const SemIR::File& outer_sem_ir,
         break;
         break;
       }
       }
       case BindAlias::Kind:
       case BindAlias::Kind:
-      case BindExport::Kind:
-      case BindSymbolicName::Kind: {
-        auto name_id = untyped_inst.As<AnyBindName>().bind_name_id;
+      case BindSymbolicName::Kind:
+      case ExportDecl::Kind: {
+        auto name_id = untyped_inst.As<AnyBindNameOrExportDecl>().bind_name_id;
         out << sem_ir.names().GetFormatted(
         out << sem_ir.names().GetFormatted(
             sem_ir.bind_names().Get(name_id).name_id);
             sem_ir.bind_names().Get(name_id).name_id);
         break;
         break;
@@ -535,7 +535,7 @@ auto GetExprCategory(const File& file, InstId inst_id) -> ExprCategory {
         inst_id = inst.value_id;
         inst_id = inst.value_id;
         continue;
         continue;
       }
       }
-      case CARBON_KIND(BindExport inst): {
+      case CARBON_KIND(ExportDecl inst): {
         inst_id = inst.value_id;
         inst_id = inst.value_id;
         continue;
         continue;
       }
       }

+ 1 - 1
toolchain/sem_ir/import_ir.h

@@ -16,7 +16,7 @@ struct ImportIR : public Printable<ImportIR> {
   auto Print(llvm::raw_ostream& out) const -> void { out << node_id; }
   auto Print(llvm::raw_ostream& out) const -> void { out << node_id; }
 
 
   // The node ID for the import.
   // The node ID for the import.
-  Parse::ImportDirectiveId node_id;
+  Parse::ImportDeclId node_id;
   // The imported IR.
   // The imported IR.
   const File* sem_ir;
   const File* sem_ir;
   // True if this is part of an `export import`.
   // True if this is part of an `export import`.

+ 1 - 1
toolchain/sem_ir/inst_kind.def

@@ -85,7 +85,7 @@ CARBON_SEM_IR_INST_KIND_IMPL(AssociatedEntityType, TYPE_ALWAYS,
                              CONSTANT_CONDITIONAL)
                              CONSTANT_CONDITIONAL)
 CARBON_SEM_IR_INST_KIND_IMPL(BaseDecl, TYPE_NEVER, CONSTANT_ALWAYS)
 CARBON_SEM_IR_INST_KIND_IMPL(BaseDecl, TYPE_NEVER, CONSTANT_ALWAYS)
 CARBON_SEM_IR_INST_KIND_IMPL(BindAlias, TYPE_NEVER, CONSTANT_NEVER)
 CARBON_SEM_IR_INST_KIND_IMPL(BindAlias, TYPE_NEVER, CONSTANT_NEVER)
-CARBON_SEM_IR_INST_KIND_IMPL(BindExport, TYPE_NEVER, CONSTANT_NEVER)
+CARBON_SEM_IR_INST_KIND_IMPL(ExportDecl, TYPE_NEVER, CONSTANT_NEVER)
 CARBON_SEM_IR_INST_KIND_IMPL(BindName, TYPE_NEVER, CONSTANT_NEVER)
 CARBON_SEM_IR_INST_KIND_IMPL(BindName, TYPE_NEVER, CONSTANT_NEVER)
 CARBON_SEM_IR_INST_KIND_IMPL(BindSymbolicName, TYPE_MAYBE,
 CARBON_SEM_IR_INST_KIND_IMPL(BindSymbolicName, TYPE_MAYBE,
                              CONSTANT_SYMBOLIC_ONLY)
                              CONSTANT_SYMBOLIC_ONLY)

+ 3 - 3
toolchain/sem_ir/inst_namer.cpp

@@ -391,10 +391,10 @@ auto InstNamer::CollectNamesInBlock(ScopeId scope_id,
         continue;
         continue;
       }
       }
       case BindAlias::Kind:
       case BindAlias::Kind:
-      case BindExport::Kind:
       case BindName::Kind:
       case BindName::Kind:
-      case BindSymbolicName::Kind: {
-        auto inst = untyped_inst.As<AnyBindName>();
+      case BindSymbolicName::Kind:
+      case ExportDecl::Kind: {
+        auto inst = untyped_inst.As<AnyBindNameOrExportDecl>();
         add_inst_name_id(sem_ir_.bind_names().Get(inst.bind_name_id).name_id);
         add_inst_name_id(sem_ir_.bind_names().Get(inst.bind_name_id).name_id);
         continue;
         continue;
       }
       }

+ 18 - 7
toolchain/sem_ir/typed_insts.h

@@ -222,8 +222,7 @@ struct BaseDecl {
 // Common representation for both kinds of `bind*name` node.
 // Common representation for both kinds of `bind*name` node.
 struct AnyBindName {
 struct AnyBindName {
   // TODO: Also handle BindTemplateName once it exists.
   // TODO: Also handle BindTemplateName once it exists.
-  static constexpr InstKind Kinds[] = {InstKind::BindAlias,
-                                       InstKind::BindExport, InstKind::BindName,
+  static constexpr InstKind Kinds[] = {InstKind::BindAlias, InstKind::BindName,
                                        InstKind::BindSymbolicName};
                                        InstKind::BindSymbolicName};
 
 
   InstKind kind;
   InstKind kind;
@@ -232,18 +231,21 @@ struct AnyBindName {
   InstId value_id;
   InstId value_id;
 };
 };
 
 
-struct BindAlias {
-  static constexpr auto Kind =
-      InstKind::BindAlias.Define<Parse::NodeId>("bind_alias");
+struct AnyBindNameOrExportDecl {
+  // TODO: Also handle BindTemplateName once it exists.
+  static constexpr InstKind Kinds[] = {InstKind::BindAlias, InstKind::BindName,
+                                       InstKind::BindSymbolicName,
+                                       InstKind::ExportDecl};
 
 
+  InstKind kind;
   TypeId type_id;
   TypeId type_id;
   BindNameId bind_name_id;
   BindNameId bind_name_id;
   InstId value_id;
   InstId value_id;
 };
 };
 
 
-struct BindExport {
+struct BindAlias {
   static constexpr auto Kind =
   static constexpr auto Kind =
-      InstKind::BindExport.Define<Parse::NodeId>("bind_export");
+      InstKind::BindAlias.Define<Parse::NodeId>("bind_alias");
 
 
   TypeId type_id;
   TypeId type_id;
   BindNameId bind_name_id;
   BindNameId bind_name_id;
@@ -444,6 +446,15 @@ struct Deref {
   InstId pointer_id;
   InstId pointer_id;
 };
 };
 
 
+struct ExportDecl {
+  static constexpr auto Kind =
+      InstKind::ExportDecl.Define<Parse::NodeId>("export");
+
+  TypeId type_id;
+  BindNameId bind_name_id;
+  InstId value_id;
+};
+
 // Represents accessing the `type` field in a facet value, which is notionally a
 // Represents accessing the `type` field in a facet value, which is notionally a
 // pair of a type and a witness.
 // pair of a type and a witness.
 struct FacetTypeAccess {
 struct FacetTypeAccess {