@@ -195,6 +195,12 @@ std::vector<StringRef> ModuleDepGraph::getExternalDependencies() const {
195195 externalDependencies.end ());
196196}
197197
198+ std::vector<StringRef>
199+ ModuleDepGraph::getIncrementalExternalDependencies () const {
200+ return std::vector<StringRef>(incrementalExternalDependencies.begin (),
201+ incrementalExternalDependencies.end ());
202+ }
203+
198204// Add every (swiftdeps) use of the external dependency to foundJobs.
199205// Can return duplicates, but it doesn't break anything, and they will be
200206// canonicalized later.
@@ -216,6 +222,26 @@ std::vector<const Job *> ModuleDepGraph::findExternallyDependentUntracedJobs(
216222 return foundJobs;
217223}
218224
225+ std::vector<const Job *>
226+ ModuleDepGraph::findIncrementalExternallyDependentUntracedJobs (
227+ StringRef externalDependency) {
228+ FrontendStatsTracer tracer (stats,
229+ " fine-grained-dependencies-"
230+ " findIncrementalExternallyDependentUntracedJobs" );
231+ std::vector<const Job *> foundJobs;
232+ forEachUntracedJobDirectlyDependentOnExternalIncrementalSwiftDeps (
233+ externalDependency, [&](const Job *job) {
234+ foundJobs.push_back (job);
235+ for (const Job *marked : findJobsToRecompileWhenWholeJobChanges (job)) {
236+ // findJobsToRecompileWhenWholeJobChanges is reflexive
237+ // Don't return job twice.
238+ if (marked != job)
239+ foundJobs.push_back (marked);
240+ }
241+ });
242+ return foundJobs;
243+ }
244+
219245void ModuleDepGraph::forEachUntracedJobDirectlyDependentOnExternalSwiftDeps (
220246 StringRef externalSwiftDeps, function_ref<void (const Job *)> fn) {
221247 // TODO move nameForDep into key
@@ -228,6 +254,19 @@ void ModuleDepGraph::forEachUntracedJobDirectlyDependentOnExternalSwiftDeps(
228254 }
229255}
230256
257+ void ModuleDepGraph::
258+ forEachUntracedJobDirectlyDependentOnExternalIncrementalSwiftDeps (
259+ StringRef externalSwiftDeps, function_ref<void (const Job *)> fn) {
260+ // TODO move nameForDep into key
261+ // These nodes will depend on the *interface* of the external Decl.
262+ DependencyKey key (NodeKind::incrementalExternalDepend, DeclAspect::interface,
263+ " " , externalSwiftDeps.str ());
264+ for (const ModuleDepGraphNode *useNode : usesByDef[key]) {
265+ if (!useNode->getHasBeenTraced ())
266+ fn (getJob (useNode->getSwiftDepsOfProvides ()));
267+ }
268+ }
269+
231270// ==============================================================================
232271// MARK: Integrating SourceFileDepGraph into ModuleDepGraph
233272// ==============================================================================
@@ -387,9 +426,14 @@ bool ModuleDepGraph::recordWhatUseDependsUpon(
387426 sourceFileUseNode, [&](const SourceFileDepGraphNode *def) {
388427 const bool isNewUse =
389428 usesByDef[def->getKey ()].insert (moduleUseNode).second ;
390- if (isNewUse && def-> getKey (). getKind () == NodeKind::externalDepend ) {
429+ if (isNewUse) {
391430 StringRef externalSwiftDeps = def->getKey ().getName ();
392- externalDependencies.insert (externalSwiftDeps.str ());
431+ if (def->getKey ().getKind () == NodeKind::externalDepend) {
432+ externalDependencies.insert (externalSwiftDeps.str ());
433+ } else if (def->getKey ().getKind () ==
434+ NodeKind::incrementalExternalDepend) {
435+ incrementalExternalDependencies.insert (externalSwiftDeps.str ());
436+ }
393437 useHasNewExternalDependency = true ;
394438 }
395439 });
@@ -641,6 +685,9 @@ void ModuleDepGraph::verifyExternalDependencyUniqueness(
641685 assert ((key.getKind () != NodeKind::externalDepend ||
642686 externalDependencies.count (key.getName ().str ()) == 1 ) &&
643687 " Ensure each external dependency is tracked exactly once" );
688+ assert ((key.getKind () != NodeKind::incrementalExternalDepend ||
689+ incrementalExternalDependencies.count (key.getName ().str ()) == 1 ) &&
690+ " Ensure each incremental external dependency is tracked exactly once" );
644691}
645692
646693void ModuleDepGraph::verifyCanFindEachJob () const {
@@ -725,6 +772,10 @@ void ModuleDepGraph::printOneNodeOfPath(raw_ostream &out,
725772 out << filename << " depends on " << key.aspectName () << " of module '"
726773 << key.humanReadableName () << " '" ;
727774 break ;
775+ case NodeKind::incrementalExternalDepend:
776+ out << filename << " depends on " << key.aspectName ()
777+ << " of incremental module '" << key.humanReadableName () << " '" ;
778+ break ;
728779 case NodeKind::sourceFileProvide:
729780 out << key.aspectName () << " of source file " << key.humanReadableName ();
730781 break ;
0 commit comments