@@ -116,7 +116,7 @@ extension IncrementalCompilationState.InitialStateComputer {
116
116
/// For inputs with swiftDeps in OFM, but no readable file, puts input in graph map, but no nodes in graph:
117
117
/// caller must ensure scheduling of those
118
118
private func computeGraphAndInputsInvalidatedByExternals( )
119
- -> ( ModuleDependencyGraph , Set < TypedVirtualPath > ) ? {
119
+ -> ( ModuleDependencyGraph , TransitivelyInvalidatedInputSet ) ? {
120
120
precondition ( sourceFiles. disappeared. isEmpty,
121
121
" Would have to remove nodes from the graph if reading prior " )
122
122
if readPriorsFromModuleDependencyGraph {
@@ -128,7 +128,7 @@ extension IncrementalCompilationState.InitialStateComputer {
128
128
}
129
129
130
130
private func readPriorGraphAndCollectInputsInvalidatedByChangedOrAddedExternals(
131
- ) -> ( ModuleDependencyGraph , Set < TypedVirtualPath > ) ?
131
+ ) -> ( ModuleDependencyGraph , TransitivelyInvalidatedInputSet ) ?
132
132
{
133
133
let dependencyGraphPath = buildRecordInfo. dependencyGraphPath
134
134
let graphIfPresent : ModuleDependencyGraph ?
@@ -154,9 +154,9 @@ extension IncrementalCompilationState.InitialStateComputer {
154
154
// recompilation. Thus, `ChangedOrAdded`.
155
155
let nodesDirectlyInvalidatedByExternals = graph. collectNodesInvalidatedByChangedOrAddedExternals ( )
156
156
// Wait till the last minute to do the transitive closure as an optimization.
157
- let inputsTransitivelyInvalidatedByExternals = graph. collectInputsUsingTransitivelyInvalidated (
157
+ let inputsInvalidatedByExternals = graph. collectInputsUsingInvalidated (
158
158
nodes: nodesDirectlyInvalidatedByExternals)
159
- return ( graph, inputsTransitivelyInvalidatedByExternals )
159
+ return ( graph, inputsInvalidatedByExternals )
160
160
}
161
161
162
162
/// Builds a graph
@@ -167,15 +167,15 @@ extension IncrementalCompilationState.InitialStateComputer {
167
167
/// For externalDependencies, puts then in graph.fingerprintedExternalDependencies, but otherwise
168
168
/// does nothing special.
169
169
private func buildInitialGraphFromSwiftDepsAndCollectInputsInvalidatedByChangedExternals(
170
- ) -> ( ModuleDependencyGraph , Set < TypedVirtualPath > ) ?
170
+ ) -> ( ModuleDependencyGraph , TransitivelyInvalidatedInputSet ) ?
171
171
{
172
172
let graph = ModuleDependencyGraph ( self , . buildingWithoutAPrior)
173
173
assert ( outputFileMap. onlySourceFilesHaveSwiftDeps ( ) )
174
174
guard graph. populateInputDependencySourceMap ( ) else {
175
175
return nil
176
176
}
177
177
178
- var inputsInvalidatedByChangedExternals = Set < TypedVirtualPath > ( )
178
+ var inputsInvalidatedByChangedExternals = TransitivelyInvalidatedInputSet ( )
179
179
for input in sourceFiles. currentInOrder {
180
180
guard let invalidatedInputs = graph. collectInputsRequiringCompilationFromExternalsFoundByCompiling ( input: input)
181
181
else {
@@ -195,7 +195,7 @@ extension IncrementalCompilationState.InitialStateComputer {
195
195
/// listed in fingerprintExternalDependencies.
196
196
private func computeInputsAndGroups(
197
197
_ moduleDependencyGraph: ModuleDependencyGraph ,
198
- _ inputsInvalidatedByExternals: Set < TypedVirtualPath > ,
198
+ _ inputsInvalidatedByExternals: TransitivelyInvalidatedInputSet ,
199
199
batchJobFormer: inout Driver
200
200
) throws -> ( skippedCompileGroups: [ TypedVirtualPath : CompileJobGroup ] ,
201
201
mandatoryJobsInOrder: [ Job ] )
@@ -249,7 +249,7 @@ extension IncrementalCompilationState.InitialStateComputer {
249
249
250
250
/// Figure out which compilation inputs are *not* mandatory
251
251
private func computeSkippedCompilationInputs(
252
- inputsInvalidatedByExternals: Set < TypedVirtualPath > ,
252
+ inputsInvalidatedByExternals: TransitivelyInvalidatedInputSet ,
253
253
_ moduleDependencyGraph: ModuleDependencyGraph ,
254
254
_ buildRecord: BuildRecord
255
255
) -> Set < TypedVirtualPath > {
@@ -285,7 +285,7 @@ extension IncrementalCompilationState.InitialStateComputer {
285
285
// as each first wave job finished.
286
286
let speculativeInputs = collectInputsToBeSpeculativelyRecompiled (
287
287
changedInputs: changedInputs,
288
- externalDependents: Array ( inputsInvalidatedByExternals) ,
288
+ externalDependents: inputsInvalidatedByExternals,
289
289
inputsMissingOutputs: Set ( inputsMissingOutputs) ,
290
290
moduleDependencyGraph)
291
291
. subtracting ( definitelyRequiredInputs)
@@ -371,28 +371,28 @@ extension IncrementalCompilationState.InitialStateComputer {
371
371
/// before the whole frontend job finished.
372
372
private func collectInputsToBeSpeculativelyRecompiled(
373
373
changedInputs: [ ChangedInput ] ,
374
- externalDependents: [ TypedVirtualPath ] ,
374
+ externalDependents: TransitivelyInvalidatedInputSet ,
375
375
inputsMissingOutputs: Set < TypedVirtualPath > ,
376
376
_ moduleDependencyGraph: ModuleDependencyGraph
377
377
) -> Set < TypedVirtualPath > {
378
378
let cascadingChangedInputs = computeCascadingChangedInputs (
379
379
from: changedInputs,
380
380
inputsMissingOutputs: inputsMissingOutputs)
381
- let cascadingExternalDependents = alwaysRebuildDependents ? externalDependents : [ ]
382
- // Collect the dependent files to speculatively schedule
383
- var dependentFiles = Set < TypedVirtualPath > ( )
384
- let cascadingFileSet = Set ( cascadingChangedInputs) . union ( cascadingExternalDependents)
385
- for cascadingFile in cascadingFileSet {
386
- let dependentsOfOneFile = moduleDependencyGraph
387
- . collectInputsTransitivelyInvalidatedBy ( input: cascadingFile)
388
- for dep in dependentsOfOneFile where !cascadingFileSet. contains ( dep) {
389
- if dependentFiles. insert ( dep) . 0 {
381
+
382
+ var inputsToBeCertainlyRecompiled = alwaysRebuildDependents ? externalDependents : TransitivelyInvalidatedInputSet ( )
383
+ inputsToBeCertainlyRecompiled. formUnion ( cascadingChangedInputs)
384
+
385
+ return inputsToBeCertainlyRecompiled. reduce ( into: Set ( ) ) {
386
+ speculativelyRecompiledInputs, certainlyRecompiledInput in
387
+ let speculativeDependents = moduleDependencyGraph. collectInputsInvalidatedBy ( input: certainlyRecompiledInput)
388
+ for speculativeDependent in speculativeDependents
389
+ where !inputsToBeCertainlyRecompiled. contains ( speculativeDependent) {
390
+ if speculativelyRecompiledInputs. insert ( speculativeDependent) . inserted {
390
391
reporter? . report (
391
- " Immediately scheduling dependent on \( cascadingFile . file. basename) " , dep )
392
+ " Immediately scheduling dependent on \( certainlyRecompiledInput . file. basename) " , speculativeDependent )
392
393
}
393
394
}
394
395
}
395
- return dependentFiles
396
396
}
397
397
398
398
// Collect the files that will be compiled whose dependents should be schedule
0 commit comments