@@ -195,6 +195,12 @@ std::vector<StringRef> ModuleDepGraph::getExternalDependencies() const {
195
195
externalDependencies.end ());
196
196
}
197
197
198
+ std::vector<StringRef>
199
+ ModuleDepGraph::getIncrementalExternalDependencies () const {
200
+ return std::vector<StringRef>(incrementalExternalDependencies.begin (),
201
+ incrementalExternalDependencies.end ());
202
+ }
203
+
198
204
// Add every (swiftdeps) use of the external dependency to foundJobs.
199
205
// Can return duplicates, but it doesn't break anything, and they will be
200
206
// canonicalized later.
@@ -216,6 +222,26 @@ std::vector<const Job *> ModuleDepGraph::findExternallyDependentUntracedJobs(
216
222
return foundJobs;
217
223
}
218
224
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
+
219
245
void ModuleDepGraph::forEachUntracedJobDirectlyDependentOnExternalSwiftDeps (
220
246
StringRef externalSwiftDeps, function_ref<void (const Job *)> fn) {
221
247
// TODO move nameForDep into key
@@ -228,6 +254,19 @@ void ModuleDepGraph::forEachUntracedJobDirectlyDependentOnExternalSwiftDeps(
228
254
}
229
255
}
230
256
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
+
231
270
// ==============================================================================
232
271
// MARK: Integrating SourceFileDepGraph into ModuleDepGraph
233
272
// ==============================================================================
@@ -387,9 +426,14 @@ bool ModuleDepGraph::recordWhatUseDependsUpon(
387
426
sourceFileUseNode, [&](const SourceFileDepGraphNode *def) {
388
427
const bool isNewUse =
389
428
usesByDef[def->getKey ()].insert (moduleUseNode).second ;
390
- if (isNewUse && def-> getKey (). getKind () == NodeKind::externalDepend ) {
429
+ if (isNewUse) {
391
430
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
+ }
393
437
useHasNewExternalDependency = true ;
394
438
}
395
439
});
@@ -641,6 +685,9 @@ void ModuleDepGraph::verifyExternalDependencyUniqueness(
641
685
assert ((key.getKind () != NodeKind::externalDepend ||
642
686
externalDependencies.count (key.getName ().str ()) == 1 ) &&
643
687
" 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" );
644
691
}
645
692
646
693
void ModuleDepGraph::verifyCanFindEachJob () const {
@@ -725,6 +772,10 @@ void ModuleDepGraph::printOneNodeOfPath(raw_ostream &out,
725
772
out << filename << " depends on " << key.aspectName () << " of module '"
726
773
<< key.humanReadableName () << " '" ;
727
774
break ;
775
+ case NodeKind::incrementalExternalDepend:
776
+ out << filename << " depends on " << key.aspectName ()
777
+ << " of incremental module '" << key.humanReadableName () << " '" ;
778
+ break ;
728
779
case NodeKind::sourceFileProvide:
729
780
out << key.aspectName () << " of source file " << key.humanReadableName ();
730
781
break ;
0 commit comments