@@ -554,134 +554,24 @@ void FrontendSourceFileDepGraphFactory::addAllDefinedDeclsOfAGivenType(
554
554
// MARK: FrontendSourceFileDepGraphFactory - adding collections of used Decls
555
555
// ==============================================================================
556
556
557
- namespace {
558
- // / Extracts uses out of a SourceFile
559
- class UsedDeclEnumerator {
560
- SourceFile *SF;
561
- const DependencyTracker &depTracker;
562
- StringRef swiftDeps;
563
-
564
- // / Cache these for efficiency
565
- const DependencyKey sourceFileInterface;
566
- const DependencyKey sourceFileImplementation;
567
-
568
- const bool includeIntrafileDeps;
569
-
570
- function_ref<void (const DependencyKey &, const DependencyKey &)> createDefUse;
571
-
572
- public:
573
- UsedDeclEnumerator (
574
- SourceFile *SF, const DependencyTracker &depTracker, StringRef swiftDeps,
575
- bool includeIntrafileDeps,
576
- function_ref<void (const DependencyKey &, const DependencyKey &)>
577
- createDefUse)
578
- : SF(SF), depTracker(depTracker), swiftDeps(swiftDeps),
579
- sourceFileInterface (DependencyKey::createKeyForWholeSourceFile(
580
- DeclAspect::interface, swiftDeps)),
581
- sourceFileImplementation(DependencyKey::createKeyForWholeSourceFile(
582
- DeclAspect::implementation, swiftDeps)),
583
- includeIntrafileDeps(includeIntrafileDeps), createDefUse(createDefUse) {
584
- }
585
-
586
- public:
587
- void enumerateAllUses () {
588
- enumerateSimpleUses<NodeKind::topLevel>(
589
- SF->getReferencedNameTracker ()->getTopLevelNames ());
590
- enumerateSimpleUses<NodeKind::dynamicLookup>(
591
- SF->getReferencedNameTracker ()->getDynamicLookupNames ());
592
- enumerateExternalUses ();
593
- enumerateCompoundUses ();
594
- }
595
-
596
- private:
597
- void enumerateUse (NodeKind kind, StringRef context, StringRef name,
598
- bool isCascadingUse) {
599
- // Assume that what is depended-upon is the interface
600
- createDefUse (DependencyKey (kind, DeclAspect::interface, context.str (), name.str ()),
601
- isCascadingUse ? sourceFileInterface
602
- : sourceFileImplementation);
603
- }
604
- template <NodeKind kind>
605
- void enumerateSimpleUses (llvm::DenseMap<DeclBaseName, bool > cascadesByName) {
606
- for (const auto &p : cascadesByName)
607
- enumerateUse (kind, " " , p.getFirst ().userFacingName (), p.getSecond ());
608
- }
609
-
610
- void enumerateCompoundUses () {
611
- enumerateNominalUses (std::move (computeHoldersOfCascadingMembers ()));
612
- enumerateMemberUses ();
613
- }
614
-
615
- std::unordered_set<std::string> computeHoldersOfCascadingMembers () {
616
- std::unordered_set<std::string> holdersOfCascadingMembers;
617
- for (const auto &p : SF->getReferencedNameTracker ()->getUsedMembers ()) {
618
- {
619
- bool isPrivate = p.getFirst ().first ->isPrivateToEnclosingFile ();
620
- if (isPrivate && !includeIntrafileDeps)
621
- continue ;
622
- }
623
- std::string context =
624
- DependencyKey::computeContextForProvidedEntity<NodeKind::nominal>(
625
- p.getFirst ().first );
626
- bool isCascading = p.getSecond ();
627
- if (isCascading)
628
- holdersOfCascadingMembers.insert (context);
629
- }
630
- return holdersOfCascadingMembers;
631
- }
632
-
633
- void enumerateNominalUses (
634
- const std::unordered_set<std::string> &&holdersOfCascadingMembers) {
635
- for (const auto &p : SF->getReferencedNameTracker ()->getUsedMembers ()) {
636
- {
637
- bool isPrivate = p.getFirst ().first ->isPrivateToEnclosingFile ();
638
- if (isPrivate && !includeIntrafileDeps)
639
- continue ;
640
- }
641
- const NominalTypeDecl *nominal = p.getFirst ().first ;
642
-
643
- std::string context =
644
- DependencyKey::computeContextForProvidedEntity<NodeKind::nominal>(
645
- nominal);
646
- const bool isCascadingUse = holdersOfCascadingMembers.count (context) != 0 ;
647
- enumerateUse (NodeKind::nominal, context, " " , isCascadingUse);
648
- }
649
- }
650
-
651
- void enumerateMemberUses () {
652
- for (const auto &p : SF->getReferencedNameTracker ()->getUsedMembers ()) {
653
- const NominalTypeDecl *nominal = p.getFirst ().first ;
654
- const auto rawName = p.getFirst ().second ;
655
- const bool isPotentialMember = rawName.empty ();
656
- const bool isCascadingUse = p.getSecond ();
657
- if (isPotentialMember) {
658
- std::string context = DependencyKey::computeContextForProvidedEntity<
659
- NodeKind::potentialMember>(nominal);
660
- enumerateUse (NodeKind::potentialMember, context, " " , isCascadingUse);
661
- } else {
662
- std::string context =
663
- DependencyKey::computeContextForProvidedEntity<NodeKind::member>(
664
- nominal);
665
- std::string name = rawName.userFacingName ();
666
- enumerateUse (NodeKind::member, context, name, isCascadingUse);
667
- }
668
- }
669
- }
670
-
671
- void enumerateExternalUses () {
672
- // external dependencies always cascade
673
- for (StringRef s : depTracker.getDependencies ())
674
- enumerateUse (NodeKind::externalDepend, " " , s, true );
675
- }
676
- };
677
- } // end namespace
678
-
679
557
void FrontendSourceFileDepGraphFactory::addAllUsedDecls () {
680
- UsedDeclEnumerator (SF, depTracker, swiftDeps, includePrivateDeps,
681
- [&](const DependencyKey &def, const DependencyKey &use) {
682
- addAUsedDecl (def, use);
683
- })
684
- .enumerateAllUses ();
558
+ const DependencyKey sourceFileInterface =
559
+ DependencyKey::createKeyForWholeSourceFile (DeclAspect::interface,
560
+ swiftDeps);
561
+
562
+ const DependencyKey sourceFileImplementation =
563
+ DependencyKey::createKeyForWholeSourceFile (DeclAspect::implementation,
564
+ swiftDeps);
565
+
566
+ SF->getReferencedNameTracker ()->enumerateAllUses (
567
+ includePrivateDeps, depTracker,
568
+ [&](const fine_grained_dependencies::NodeKind kind, StringRef context,
569
+ StringRef name, const bool isCascadingUse) {
570
+ addAUsedDecl (DependencyKey (kind, DeclAspect::interface, context.str (),
571
+ name.str ()),
572
+ isCascadingUse ? sourceFileInterface
573
+ : sourceFileImplementation);
574
+ });
685
575
}
686
576
687
577
// ==============================================================================
0 commit comments