@@ -402,16 +402,14 @@ namespace {
402
402
// / Extracts uses out of a SourceFile
403
403
class UsedDeclEnumerator {
404
404
const SourceFile *SF;
405
- const DependencyTracker &depTracker;
406
405
StringRef swiftDeps;
407
406
408
407
// / Cache these for efficiency
409
408
const DependencyKey sourceFileImplementation;
410
409
411
410
public:
412
- UsedDeclEnumerator (const SourceFile *SF, const DependencyTracker &depTracker,
413
- StringRef swiftDeps)
414
- : SF(SF), depTracker(depTracker), swiftDeps(swiftDeps),
411
+ UsedDeclEnumerator (const SourceFile *SF, StringRef swiftDeps)
412
+ : SF(SF), swiftDeps(swiftDeps),
415
413
sourceFileImplementation (DependencyKey::createKeyForWholeSourceFile(
416
414
DeclAspect::implementation, swiftDeps)) {}
417
415
@@ -446,7 +444,6 @@ class UsedDeclEnumerator {
446
444
}
447
445
}
448
446
});
449
- enumerateExternalUses (enumerator);
450
447
enumerateNominalUses (enumerator);
451
448
}
452
449
@@ -474,23 +471,59 @@ class UsedDeclEnumerator {
474
471
enumerateUse<NodeKind::nominal>(context, " " , enumerator);
475
472
});
476
473
}
474
+ };
475
+ } // end namespace
476
+
477
+ namespace {
478
+ class ExternalDependencyEnumerator {
479
+ const DependencyTracker &depTracker;
480
+ const DependencyKey sourceFileImplementation;
481
+
482
+ public:
483
+ using UseEnumerator = llvm::function_ref<void (
484
+ const DependencyKey &, const DependencyKey &, Optional<Fingerprint>)>;
485
+
486
+ ExternalDependencyEnumerator (const DependencyTracker &depTracker,
487
+ StringRef swiftDeps)
488
+ : depTracker(depTracker),
489
+ sourceFileImplementation (DependencyKey::createKeyForWholeSourceFile(
490
+ DeclAspect::implementation, swiftDeps)) {}
477
491
478
492
void enumerateExternalUses (UseEnumerator enumerator) {
479
- for (StringRef s : depTracker.getIncrementalDependencies ())
480
- enumerateUse<NodeKind::incrementalExternalDepend>(" " , s, enumerator);
493
+ for (const auto &id : depTracker.getIncrementalDependencies ()) {
494
+ enumerateUse<NodeKind::incrementalExternalDepend>(enumerator, id.path ,
495
+ id.fingerprint );
496
+ }
497
+ for (StringRef s : depTracker.getDependencies ()) {
498
+ enumerateUse<NodeKind::externalDepend>(enumerator, s, None);
499
+ }
500
+ }
481
501
482
- for (StringRef s : depTracker.getDependencies ())
483
- enumerateUse<NodeKind::externalDepend>(" " , s, enumerator);
502
+ private:
503
+ template <NodeKind kind>
504
+ void enumerateUse (UseEnumerator createDefUse, StringRef name,
505
+ Optional<Fingerprint> maybeFP) {
506
+ static_assert (kind == NodeKind::incrementalExternalDepend ||
507
+ kind == NodeKind::externalDepend,
508
+ " Not a kind of external dependency!" );
509
+ createDefUse (DependencyKey (kind, DeclAspect::interface, " " , name.str ()),
510
+ sourceFileImplementation, maybeFP);
484
511
}
485
512
};
486
513
} // end namespace
487
514
488
515
void FrontendSourceFileDepGraphFactory::addAllUsedDecls () {
489
- UsedDeclEnumerator (SF, depTracker, swiftDeps)
516
+ UsedDeclEnumerator (SF, swiftDeps)
490
517
.enumerateAllUses (
491
518
[&](const DependencyKey &def, const DependencyKey &use) {
492
519
addAUsedDecl (def, use);
493
520
});
521
+ ExternalDependencyEnumerator (depTracker, swiftDeps)
522
+ .enumerateExternalUses ([&](const DependencyKey &def,
523
+ const DependencyKey &use,
524
+ Optional<Fingerprint> maybeFP) {
525
+ addAnExternalDependency (def, use, maybeFP);
526
+ });
494
527
}
495
528
496
529
// ==============================================================================
0 commit comments