@@ -103,6 +103,22 @@ package enum ConvertActionConverter {
103103        let  resultsSyncQueue  =  DispatchQueue ( label:  " Convert Serial Queue " ,  qos:  . unspecified,  attributes:  [ ] ) 
104104        let  resultsGroup  =  DispatchGroup ( ) 
105105
106+         let  linkHierarchySerializationProblems  =  Synchronized < [ Problem ] > ( [ ] ) 
107+         if  FeatureFlags . current. isLinkHierarchySerializationEnabled { 
108+             resultsGroup. async ( queue:  resultsSyncQueue)  { 
109+                 signposter. withIntervalSignpost ( " Serialize link hierarchy " ,  id:  signposter. makeSignpostID ( ) )  { 
110+                     do  { 
111+                         let  serializableLinkInformation  =  try   context. linkResolver. localResolver. prepareForSerialization ( bundleID:  bundle. id) 
112+                         try   outputConsumer. consume ( linkResolutionInformation:  serializableLinkInformation) 
113+                     }  catch  { 
114+                         linkHierarchySerializationProblems. sync  { 
115+                             recordProblem ( from:  error,  in:  & $0,  withIdentifier:  " link-resolver " ) 
116+                         } 
117+                     } 
118+                 } 
119+             } 
120+         } 
121+         
106122        let  renderSignpostHandle  =  signposter. beginInterval ( " Render " ,  id:  signposter. makeSignpostID ( ) ,  " Render  \( context. knownPages. count)  pages " ) 
107123
108124        var  conversionProblems :  [ Problem ]  =  context. knownPages. concurrentPerform  {  identifier,  results in 
@@ -164,44 +180,25 @@ package enum ConvertActionConverter {
164180        // Wait for any concurrent updates to complete.
165181        resultsGroup. wait ( ) 
166182
183+         conversionProblems +=  linkHierarchySerializationProblems. sync  {  $0 } 
184+         
167185        signposter. endInterval ( " Render " ,  renderSignpostHandle) 
168186
169187        guard  !Task. isCancelled else  {  return  [ ]  } 
170188
171189        // Write various metadata
172-         if  emitDigest { 
190+         if  emitDigest ||  FeatureFlags . current . isLinkHierarchySerializationEnabled  { 
173191            signposter. withIntervalSignpost ( " Emit digest " ,  id:  signposter. makeSignpostID ( ) )  { 
174192                do  { 
175193                    try   outputConsumer. finishedConsumingLinkElementSummaries ( ) 
176-                     try   outputConsumer. consume ( indexingRecords:  indexingRecords) 
177-                     try   outputConsumer. consume ( assets:  assets) 
178-                 }  catch  { 
179-                     recordProblem ( from:  error,  in:  & conversionProblems,  withIdentifier:  " metadata " ) 
180-                 } 
181-             } 
182-         } 
183-         
184-         if  FeatureFlags . current. isLinkHierarchySerializationEnabled { 
185-             signposter. withIntervalSignpost ( " Serialize link hierarchy " ,  id:  signposter. makeSignpostID ( ) )  { 
186-                 do  { 
187-                     let  serializableLinkInformation  =  try   context. linkResolver. localResolver. prepareForSerialization ( bundleID:  bundle. id) 
188-                     try   outputConsumer. consume ( linkResolutionInformation:  serializableLinkInformation) 
189-                     
190-                     if  !emitDigest { 
191-                         try   outputConsumer. finishedConsumingLinkElementSummaries ( ) 
194+                     if  emitDigest { 
195+                         // Only emit the other digest files if `--emit-digest` is passed
196+                         try   outputConsumer. consume ( indexingRecords:  indexingRecords) 
197+                         try   outputConsumer. consume ( assets:  assets) 
198+                         try   outputConsumer. consume ( problems:  context. problems +  conversionProblems) 
192199                    } 
193200                }  catch  { 
194-                     recordProblem ( from:  error,  in:  & conversionProblems,  withIdentifier:  " link-resolver " ) 
195-                 } 
196-             } 
197-         } 
198-         
199-         if  emitDigest { 
200-             signposter. withIntervalSignpost ( " Emit digest " ,  id:  signposter. makeSignpostID ( ) )  { 
201-                 do  { 
202-                     try   outputConsumer. consume ( problems:  context. problems +  conversionProblems) 
203-                 }  catch  { 
204-                     recordProblem ( from:  error,  in:  & conversionProblems,  withIdentifier:  " problems " ) 
201+                     recordProblem ( from:  error,  in:  & conversionProblems,  withIdentifier:  " metadata " ) 
205202                } 
206203            } 
207204        } 
0 commit comments