@@ -116,7 +116,7 @@ extension IncrementalCompilationState.InitialStateComputer {
116116 /// For inputs with swiftDeps in OFM, but no readable file, puts input in graph map, but no nodes in graph:
117117 /// caller must ensure scheduling of those
118118 private func computeGraphAndInputsInvalidatedByExternals( )
119- -> ( ModuleDependencyGraph , Set < TypedVirtualPath > ) ? {
119+ -> ( ModuleDependencyGraph , TransitivelyInvalidatedInputSet ) ? {
120120 precondition ( sourceFiles. disappeared. isEmpty,
121121 " Would have to remove nodes from the graph if reading prior " )
122122 if readPriorsFromModuleDependencyGraph {
@@ -128,7 +128,7 @@ extension IncrementalCompilationState.InitialStateComputer {
128128 }
129129
130130 private func readPriorGraphAndCollectInputsInvalidatedByChangedOrAddedExternals(
131- ) -> ( ModuleDependencyGraph , Set < TypedVirtualPath > ) ?
131+ ) -> ( ModuleDependencyGraph , TransitivelyInvalidatedInputSet ) ?
132132 {
133133 let dependencyGraphPath = buildRecordInfo. dependencyGraphPath
134134 let graphIfPresent : ModuleDependencyGraph ?
@@ -154,9 +154,9 @@ extension IncrementalCompilationState.InitialStateComputer {
154154 // recompilation. Thus, `ChangedOrAdded`.
155155 let nodesDirectlyInvalidatedByExternals = graph. collectNodesInvalidatedByChangedOrAddedExternals ( )
156156 // Wait till the last minute to do the transitive closure as an optimization.
157- let inputsTransitivelyInvalidatedByExternals = graph. collectInputsUsingTransitivelyInvalidated (
157+ let inputsInvalidatedByExternals = graph. collectInputsUsingInvalidated (
158158 nodes: nodesDirectlyInvalidatedByExternals)
159- return ( graph, inputsTransitivelyInvalidatedByExternals )
159+ return ( graph, inputsInvalidatedByExternals )
160160 }
161161
162162 /// Builds a graph
@@ -167,15 +167,15 @@ extension IncrementalCompilationState.InitialStateComputer {
167167 /// For externalDependencies, puts then in graph.fingerprintedExternalDependencies, but otherwise
168168 /// does nothing special.
169169 private func buildInitialGraphFromSwiftDepsAndCollectInputsInvalidatedByChangedExternals(
170- ) -> ( ModuleDependencyGraph , Set < TypedVirtualPath > ) ?
170+ ) -> ( ModuleDependencyGraph , TransitivelyInvalidatedInputSet ) ?
171171 {
172172 let graph = ModuleDependencyGraph ( self , . buildingWithoutAPrior)
173173 assert ( outputFileMap. onlySourceFilesHaveSwiftDeps ( ) )
174174 guard graph. populateInputDependencySourceMap ( ) else {
175175 return nil
176176 }
177177
178- var inputsInvalidatedByChangedExternals = Set < TypedVirtualPath > ( )
178+ var inputsInvalidatedByChangedExternals = TransitivelyInvalidatedInputSet ( )
179179 for input in sourceFiles. currentInOrder {
180180 guard let invalidatedInputs = graph. collectInputsRequiringCompilationFromExternalsFoundByCompiling ( input: input)
181181 else {
@@ -195,7 +195,7 @@ extension IncrementalCompilationState.InitialStateComputer {
195195 /// listed in fingerprintExternalDependencies.
196196 private func computeInputsAndGroups(
197197 _ moduleDependencyGraph: ModuleDependencyGraph ,
198- _ inputsInvalidatedByExternals: Set < TypedVirtualPath > ,
198+ _ inputsInvalidatedByExternals: TransitivelyInvalidatedInputSet ,
199199 batchJobFormer: inout Driver
200200 ) throws -> ( skippedCompileGroups: [ TypedVirtualPath : CompileJobGroup ] ,
201201 mandatoryJobsInOrder: [ Job ] )
@@ -249,7 +249,7 @@ extension IncrementalCompilationState.InitialStateComputer {
249249
250250 /// Figure out which compilation inputs are *not* mandatory
251251 private func computeSkippedCompilationInputs(
252- inputsInvalidatedByExternals: Set < TypedVirtualPath > ,
252+ inputsInvalidatedByExternals: TransitivelyInvalidatedInputSet ,
253253 _ moduleDependencyGraph: ModuleDependencyGraph ,
254254 _ buildRecord: BuildRecord
255255 ) -> Set < TypedVirtualPath > {
@@ -285,7 +285,7 @@ extension IncrementalCompilationState.InitialStateComputer {
285285 // as each first wave job finished.
286286 let speculativeInputs = collectInputsToBeSpeculativelyRecompiled (
287287 changedInputs: changedInputs,
288- externalDependents: Array ( inputsInvalidatedByExternals) ,
288+ externalDependents: inputsInvalidatedByExternals,
289289 inputsMissingOutputs: Set ( inputsMissingOutputs) ,
290290 moduleDependencyGraph)
291291 . subtracting ( definitelyRequiredInputs)
@@ -371,28 +371,28 @@ extension IncrementalCompilationState.InitialStateComputer {
371371 /// before the whole frontend job finished.
372372 private func collectInputsToBeSpeculativelyRecompiled(
373373 changedInputs: [ ChangedInput ] ,
374- externalDependents: [ TypedVirtualPath ] ,
374+ externalDependents: TransitivelyInvalidatedInputSet ,
375375 inputsMissingOutputs: Set < TypedVirtualPath > ,
376376 _ moduleDependencyGraph: ModuleDependencyGraph
377377 ) -> Set < TypedVirtualPath > {
378378 let cascadingChangedInputs = computeCascadingChangedInputs (
379379 from: changedInputs,
380380 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 {
390391 reporter? . report (
391- " Immediately scheduling dependent on \( cascadingFile . file. basename) " , dep )
392+ " Immediately scheduling dependent on \( certainlyRecompiledInput . file. basename) " , speculativeDependent )
392393 }
393394 }
394395 }
395- return dependentFiles
396396 }
397397
398398 // Collect the files that will be compiled whose dependents should be schedule
0 commit comments