@@ -114,12 +114,13 @@ struct UnitInfo {
114
114
struct PackageImports {
115
115
// Use the constructor so that the SmallVector is only constructed
116
116
// as-needed.
117
- explicit PackageImports (Parse::NodeId node) : node(node) {}
117
+ explicit PackageImports (Parse::ImportDirectiveId node_id)
118
+ : node_id(node_id) {}
118
119
119
120
// The first `import` directive in the file, which declared the package's
120
121
// identifier (even if the import failed). Used for associating diagnostics
121
122
// not specific to a single import.
122
- Parse::NodeId node ;
123
+ Parse::ImportDirectiveId node_id ;
123
124
// Whether there's an import that failed to load.
124
125
bool has_load_error = false ;
125
126
// The list of valid imports.
@@ -181,10 +182,11 @@ static auto InitPackageScopeAndImports(Context& context, UnitInfo& unit_info)
181
182
bool error_in_import = self_import->second .has_load_error ;
182
183
for (const auto & import : self_import->second .imports ) {
183
184
const auto & import_sem_ir = **import .unit_info ->unit ->sem_ir ;
184
- Import (context, namespace_type_id, import_sem_ir);
185
- error_in_import = error_in_import || import_sem_ir.name_scopes ()
186
- .Get (SemIR::NameScopeId::Package)
187
- .has_error ;
185
+ ImportLibraryFromCurrentPackage (context, namespace_type_id,
186
+ import_sem_ir);
187
+ error_in_import |= import_sem_ir.name_scopes ()
188
+ .Get (SemIR::NameScopeId::Package)
189
+ .has_error ;
188
190
}
189
191
190
192
// If an import of the current package caused an error for the imported
@@ -210,8 +212,9 @@ static auto InitPackageScopeAndImports(Context& context, UnitInfo& unit_info)
210
212
for (auto import : package_imports.imports ) {
211
213
sem_irs.push_back (&**import .unit_info ->unit ->sem_ir );
212
214
}
213
- context.AddPackageImports (package_imports.node , package_id, sem_irs,
214
- package_imports.has_load_error );
215
+ ImportLibrariesFromOtherPackage (context, namespace_type_id,
216
+ package_imports.node_id , package_id,
217
+ sem_irs, package_imports.has_load_error );
215
218
}
216
219
217
220
context.import_ir_constant_values ().resize (
@@ -338,12 +341,12 @@ static auto TrackImport(
338
341
if (explicit_import_map) {
339
342
// Diagnose redundant imports.
340
343
if (auto [insert_it, success] =
341
- explicit_import_map->insert ({import_key, import .node });
344
+ explicit_import_map->insert ({import_key, import .node_id });
342
345
!success) {
343
346
CARBON_DIAGNOSTIC (RepeatedImport, Error,
344
347
" Library imported more than once." );
345
348
CARBON_DIAGNOSTIC (FirstImported, Note, " First import here." );
346
- unit_info.emitter .Build (import .node , RepeatedImport)
349
+ unit_info.emitter .Build (import .node_id , RepeatedImport)
347
350
.Note (insert_it->second , FirstImported)
348
351
.Emit ();
349
352
return ;
@@ -377,7 +380,7 @@ static auto TrackImport(
377
380
CARBON_DIAGNOSTIC (ImportSelf, Error, " File cannot import itself." );
378
381
bool is_impl =
379
382
!packaging || packaging->api_or_impl == Parse::Tree::ApiOrImpl::Impl;
380
- unit_info.emitter .Emit (import .node ,
383
+ unit_info.emitter .Emit (import .node_id ,
381
384
is_impl ? ExplicitImportApi : ImportSelf);
382
385
return ;
383
386
}
@@ -388,7 +391,7 @@ static auto TrackImport(
388
391
is_import_default_library) {
389
392
CARBON_DIAGNOSTIC (ImportMainDefaultLibrary, Error,
390
393
" Cannot import `Main//default`." );
391
- unit_info.emitter .Emit (import .node , ImportMainDefaultLibrary);
394
+ unit_info.emitter .Emit (import .node_id , ImportMainDefaultLibrary);
392
395
393
396
return ;
394
397
}
@@ -400,15 +403,15 @@ static auto TrackImport(
400
403
CARBON_DIAGNOSTIC (
401
404
ImportCurrentPackageByName, Error,
402
405
" Imports from the current package must omit the package name." );
403
- unit_info.emitter .Emit (import .node , ImportCurrentPackageByName);
406
+ unit_info.emitter .Emit (import .node_id , ImportCurrentPackageByName);
404
407
return ;
405
408
}
406
409
407
410
// Diagnose explicit imports from `Main`.
408
411
if (is_explicit_main) {
409
412
CARBON_DIAGNOSTIC (ImportMainPackage, Error,
410
413
" Cannot import `Main` from other packages." );
411
- unit_info.emitter .Emit (import .node , ImportMainPackage);
414
+ unit_info.emitter .Emit (import .node_id , ImportMainPackage);
412
415
return ;
413
416
}
414
417
}
@@ -420,9 +423,9 @@ static auto TrackImport(
420
423
}
421
424
422
425
// Get the package imports.
423
- auto package_imports_it =
424
- unit_info. package_imports_map . try_emplace (import .package_id , import .node )
425
- .first ;
426
+ auto package_imports_it = unit_info. package_imports_map
427
+ . try_emplace (import .package_id , import .node_id )
428
+ .first ;
426
429
427
430
if (auto api = api_map.find (import_key); api != api_map.end ()) {
428
431
// Add references between the file and imported api.
@@ -435,8 +438,9 @@ static auto TrackImport(
435
438
CARBON_DIAGNOSTIC (LibraryApiNotFound, Error,
436
439
" Corresponding API not found." );
437
440
CARBON_DIAGNOSTIC (ImportNotFound, Error, " Imported API not found." );
438
- unit_info.emitter .Emit (
439
- import .node , explicit_import_map ? ImportNotFound : LibraryApiNotFound);
441
+ unit_info.emitter .Emit (import .node_id , explicit_import_map
442
+ ? ImportNotFound
443
+ : LibraryApiNotFound);
440
444
}
441
445
}
442
446
@@ -463,9 +467,9 @@ static auto BuildApiMapAndDiagnosePackaging(
463
467
" `Main//default` must omit `package` directive." );
464
468
CARBON_DIAGNOSTIC (ExplicitMainLibrary, Error,
465
469
" Use `library` directive in `Main` package libraries." );
466
- unit_info.emitter .Emit (packaging->names .node , import_key. second . empty ()
467
- ? ExplicitMainPackage
468
- : ExplicitMainLibrary);
470
+ unit_info.emitter .Emit (packaging->names .node_id ,
471
+ import_key. second . empty () ? ExplicitMainPackage
472
+ : ExplicitMainLibrary);
469
473
continue ;
470
474
}
471
475
@@ -485,7 +489,7 @@ static auto BuildApiMapAndDiagnosePackaging(
485
489
CARBON_DIAGNOSTIC (DuplicateLibraryApi, Error,
486
490
" Library's API previously provided by `{0}`." ,
487
491
std::string);
488
- unit_info.emitter .Emit (packaging->names .node , DuplicateLibraryApi,
492
+ unit_info.emitter .Emit (packaging->names .node_id , DuplicateLibraryApi,
489
493
prev_filename.str ());
490
494
} else {
491
495
CARBON_DIAGNOSTIC (DuplicateMainApi, Error,
@@ -512,7 +516,7 @@ static auto BuildApiMapAndDiagnosePackaging(
512
516
" File extension of `{0}` required for `{1}`." ,
513
517
llvm::StringLiteral, Lex::TokenKind);
514
518
auto diag = unit_info.emitter .Build (
515
- packaging ? packaging->names .node : Parse::NodeId::Invalid,
519
+ packaging ? packaging->names .node_id : Parse::NodeId::Invalid,
516
520
IncorrectExtension, want_ext,
517
521
is_impl ? Lex::TokenKind::Impl : Lex::TokenKind::Api);
518
522
if (is_api_with_impl_ext) {
@@ -608,7 +612,7 @@ auto CheckParseTrees(const SemIR::File& builtin_ir,
608
612
CARBON_DIAGNOSTIC (ImportCycleDetected, Error,
609
613
" Import cannot be used due to a cycle. Cycle "
610
614
" must be fixed to import." );
611
- unit_info.emitter .Emit (import_it->names .node ,
615
+ unit_info.emitter .Emit (import_it->names .node_id ,
612
616
ImportCycleDetected);
613
617
// Make this look the same as an import which wasn't found.
614
618
package_imports.has_load_error = true ;
0 commit comments