@@ -325,7 +325,7 @@ class BiIndexedTwoStageMap {
325
325
// / Write out the .swiftdeps file for a frontend compilation of a primary file.
326
326
bool emitReferenceDependencies (DiagnosticEngine &diags, SourceFile *SF,
327
327
const DependencyTracker &depTracker,
328
- StringRef outputPath);
328
+ StringRef outputPath, bool alsoEmitDotFile );
329
329
// ==============================================================================
330
330
// MARK: Enums
331
331
// ==============================================================================
@@ -438,8 +438,8 @@ class DependencyKey {
438
438
name () {}
439
439
440
440
// / For constructing a key in the frontend.
441
- DependencyKey (NodeKind kind, DeclAspect aspect, std::string context,
442
- std::string name)
441
+ DependencyKey (NodeKind kind, DeclAspect aspect, const std::string & context,
442
+ const std::string & name)
443
443
: kind(kind), aspect(aspect), context(context), name(name) {
444
444
assert (verify ());
445
445
}
@@ -449,7 +449,7 @@ class DependencyKey {
449
449
StringRef getContext () const { return context; }
450
450
StringRef getName () const { return name; }
451
451
452
- StringRef getSwiftDepsFromSourceFileProvide () const {
452
+ StringRef getSwiftDepsFromASourceFileProvideNodeKey () const {
453
453
assert (getKind () == NodeKind::sourceFileProvide &&
454
454
" Receiver must be sourceFileProvide." );
455
455
return getName ();
@@ -494,11 +494,19 @@ class DependencyKey {
494
494
static std::string computeNameForProvidedEntity (Entity);
495
495
496
496
// / Given some type of depended-upon entity create the key.
497
- template <NodeKind kind, typename Entity>
498
- static DependencyKey createDependedUponKey (const Entity &);
497
+ static DependencyKey createDependedUponKey (StringRef mangledHolderName,
498
+ StringRef memberBaseName);
499
+
500
+ template <NodeKind kind>
501
+ static DependencyKey createDependedUponKey (StringRef);
502
+
503
+ static DependencyKey
504
+ createTransitiveKeyForWholeSourceFile (StringRef swiftDeps);
499
505
500
506
std::string humanReadableName () const ;
501
507
508
+ StringRef aspectName () const { return DeclAspectNames[size_t (aspect)]; }
509
+
502
510
void dump (llvm::raw_ostream &os) const { os << asString () << " \n " ; }
503
511
SWIFT_DEBUG_DUMP { dump (llvm::errs ()); }
504
512
@@ -535,6 +543,13 @@ struct std::hash<typename swift::fine_grained_dependencies::DeclAspect> {
535
543
}
536
544
};
537
545
546
+ namespace swift {
547
+ namespace fine_grained_dependencies {
548
+ using ContextNameFingerprint =
549
+ std::tuple<std::string, std::string, Optional<std::string>>;
550
+ }
551
+ } // namespace swift
552
+
538
553
// ==============================================================================
539
554
// MARK: DepGraphNode
540
555
// ==============================================================================
@@ -684,6 +699,9 @@ class SourceFileDepGraphNode : public DepGraphNode {
684
699
}
685
700
686
701
// / Record the sequence number, \p n, of another use.
702
+ // / The relationship between an interface and its implementation is NOT
703
+ // / included here. See \c
704
+ // / SourceFileDepGraph::findExistingNodePairOrCreateAndAddIfNew.
687
705
void addDefIDependUpon (size_t n) {
688
706
if (n != getSequenceNumber ())
689
707
defsIDependUpon.insert (n);
@@ -727,6 +745,25 @@ class SourceFileDepGraph {
727
745
SourceFileDepGraph (const SourceFileDepGraph &g) = delete ;
728
746
SourceFileDepGraph (SourceFileDepGraph &&g) = default ;
729
747
748
+ // / Simulate loading for unit testing:
749
+ // / \param swiftDepsFileName The name of the swiftdeps file of the phony job
750
+ // / \param includePrivateDeps Whether the graph includes intra-file arcs
751
+ // / \param hadCompilationError Simulate a compilation error
752
+ // / \param interfaceHash The interface hash of the simulated graph
753
+ // / \param simpleNamesByRDK A map of vectors of names keyed by reference
754
+ // / dependency key \param compoundNamesByRDK A map of (mangledHolder,
755
+ // / baseName) pairs keyed by reference dependency key. For single-name
756
+ // / dependencies, an initial underscore indicates that the name does not
757
+ // / cascade. For compound names, it is the first name, the holder which
758
+ // / indicates non-cascading. For member names, an initial underscore indicates
759
+ // / file-privacy.
760
+ static SourceFileDepGraph
761
+ simulateLoad (std::string swiftDepsFileName, const bool includePrivateDeps,
762
+ const bool hadCompilationError, std::string interfaceHash,
763
+ llvm::StringMap<std::vector<std::string>> simpleNamesByRDK,
764
+ llvm::StringMap<std::vector<std::pair<std::string, std::string>>>
765
+ compoundNamesByRDK);
766
+
730
767
// / Nodes are owned by the graph.
731
768
~SourceFileDepGraph () {
732
769
forEachNode ([&](SourceFileDepGraphNode *n) { delete n; });
@@ -746,7 +783,7 @@ class SourceFileDepGraph {
746
783
InterfaceAndImplementationPair<SourceFileDepGraphNode>
747
784
getSourceFileNodePair () const ;
748
785
749
- StringRef getSwiftDepsFromSourceFileProvide () const ;
786
+ StringRef getSwiftDepsOfJobThatProducedThisGraph () const ;
750
787
751
788
std::string getGraphID () const {
752
789
return getSourceFileNodePair ().getInterface ()->getKey ().humanReadableName ();
@@ -770,12 +807,13 @@ class SourceFileDepGraph {
770
807
// / The frontend creates a pair of nodes for every tracked Decl and the source
771
808
// / file itself.
772
809
InterfaceAndImplementationPair<SourceFileDepGraphNode>
773
- findExistingNodePairOrCreateAndAddIfNew (NodeKind k, StringRef context,
774
- StringRef name,
775
- Optional<std::string> fingerprint);
810
+ findExistingNodePairOrCreateAndAddIfNew (
811
+ NodeKind k, const ContextNameFingerprint &contextNameFingerprint);
776
812
777
- SourceFileDepGraphNode *findExistingNodeOrCreateIfNew (
778
- DependencyKey key, Optional<std::string> fingerprint, bool isProvides);
813
+ SourceFileDepGraphNode *
814
+ findExistingNodeOrCreateIfNew (DependencyKey key,
815
+ const Optional<std::string> &fingerprint,
816
+ bool isProvides);
779
817
780
818
// / \p Use is the Node that must be rebuilt when \p def changes.
781
819
// / Record that fact in the graph.
@@ -892,7 +930,7 @@ template <typename GraphT> class DotFileEmitter {
892
930
}
893
931
void emitArcs () {
894
932
g.forEachArc ([&](const NodeT *def, const NodeT *use) {
895
- if (includeGraphArc (use, def ))
933
+ if (includeGraphArc (def, use ))
896
934
emitGraphArc (def, use);
897
935
});
898
936
}
0 commit comments