@@ -110,6 +110,7 @@ public class ActivityParser {
110110 uniqueIdentifier: try parseAsString ( token: iterator. next ( ) ) ,
111111 localizedResultString: try parseAsString ( token: iterator. next ( ) ) ,
112112 xcbuildSignature: try parseAsString ( token: iterator. next ( ) ) ,
113+ attachments: try parseIDEActivityLogSectionAttachments ( iterator: & iterator) ,
113114 unknown: isCommandLineLog ? Int ( try parseAsInt ( token: iterator. next ( ) ) ) : 0 )
114115 }
115116
@@ -133,6 +134,7 @@ public class ActivityParser {
133134 uniqueIdentifier: try parseAsString ( token: iterator. next ( ) ) ,
134135 localizedResultString: try parseAsString ( token: iterator. next ( ) ) ,
135136 xcbuildSignature: try parseAsString ( token: iterator. next ( ) ) ,
137+ attachments: try parseIDEActivityLogSectionAttachments ( iterator: & iterator) ,
136138 unknown: isCommandLineLog ? Int ( try parseAsInt ( token: iterator. next ( ) ) ) : 0 ,
137139 testsPassedString: try parseAsString ( token: iterator. next ( ) ) ,
138140 durationString: try parseAsString ( token: iterator. next ( ) ) ,
@@ -163,6 +165,8 @@ public class ActivityParser {
163165 localizedResultString: try parseAsString ( token: iterator. next ( ) ) ,
164166 xcbuildSignature: try parseAsString ( token: iterator. next ( ) ) ,
165167 // swiftlint:disable:next line_length
168+ attachments: try parseIDEActivityLogSectionAttachments ( iterator: & iterator) ,
169+ // swiftlint:disable:next line_length
166170 unknown: isCommandLineLog ? Int ( try parseAsInt ( token: iterator. next ( ) ) ) : 0 ,
167171 logConsoleItems: try parseIDEConsoleItems ( iterator: & iterator)
168172 )
@@ -361,6 +365,25 @@ public class ActivityParser {
361365 throw XCLogParserError . parseError ( " Unexpected className found parsing IDEActivityLogMessage \( className) " )
362366 }
363367
368+ private func parseLogSectionAttachment( iterator: inout IndexingIterator < [ Token ] > )
369+ throws -> IDEActivityLogSectionAttachment {
370+ let classRefToken = try getClassRefToken ( iterator: & iterator)
371+ guard case Token . classNameRef( let className) = classRefToken else {
372+ throw XCLogParserError . parseError ( " Unexpected token found parsing " +
373+ " IDEActivityLogSectionAttachment \( classRefToken) " )
374+ }
375+
376+ if className == " IDEFoundation. \( String ( describing: IDEActivityLogSectionAttachment . self) ) " {
377+ let jsonType = IDEActivityLogSectionAttachment . BuildOperationTaskMetrics. self
378+ return try IDEActivityLogSectionAttachment ( identifier: try parseAsString ( token: iterator. next ( ) ) ,
379+ majorVersion: try parseAsInt ( token: iterator. next ( ) ) ,
380+ minorVersion: try parseAsInt ( token: iterator. next ( ) ) ,
381+ metrics: try parseAsJson ( token: iterator. next ( ) ,
382+ type: jsonType) )
383+ }
384+ throw XCLogParserError . parseError ( " Unexpected className found parsing IDEConsoleItem \( className) " )
385+ }
386+
364387 private func parseLogSection( iterator: inout IndexingIterator < [ Token ] > )
365388 throws -> IDEActivityLogSection {
366389 var classRefToken = try getClassRefToken ( iterator: & iterator)
@@ -433,6 +456,27 @@ public class ActivityParser {
433456 }
434457 }
435458
459+ private func parseIDEActivityLogSectionAttachments( iterator: inout IndexingIterator < [ Token ] > )
460+ throws -> [ IDEActivityLogSectionAttachment ] {
461+ guard let listToken = iterator. next ( ) else {
462+ throw XCLogParserError . parseError ( " Unexpected EOF parsing array of IDEActivityLogSectionAttachment " )
463+ }
464+ switch listToken {
465+ case . null:
466+ return [ ]
467+ case . list( let count) :
468+ var sections = [ IDEActivityLogSectionAttachment] ( )
469+ for _ in 0 ..< count {
470+ let section = try parseLogSectionAttachment ( iterator: & iterator)
471+ sections. append ( section)
472+ }
473+ return sections
474+ default :
475+ throw XCLogParserError . parseError ( " Unexpected token parsing array of " +
476+ " IDEActivityLogSectionAttachment: \( listToken) " )
477+ }
478+ }
479+
436480 private func parseIDEConsoleItem( iterator: inout IndexingIterator < [ Token ] > )
437481 throws -> IDEConsoleItem ? {
438482 let classRefToken = try getClassRefToken ( iterator: & iterator)
@@ -555,6 +599,23 @@ public class ActivityParser {
555599 }
556600 }
557601
602+ private func parseAsJson< T: Decodable > ( token: Token ? , type: T . Type ) throws -> T ? {
603+ guard let token = token else {
604+ throw XCLogParserError . parseError ( " Unexpected EOF parsing JSON String " )
605+ }
606+ switch token {
607+ case . json( let string) :
608+ guard let data = string. data ( using: . utf8) else {
609+ throw XCLogParserError . parseError ( " Unexpected JSON string \( string) " )
610+ }
611+ return try JSONDecoder ( ) . decode ( type, from: data)
612+ case . null:
613+ return nil
614+ default :
615+ throw XCLogParserError . parseError ( " Unexpected token parsing JSON String: \( token) " )
616+ }
617+ }
618+
558619 private func parseAsInt( token: Token ? ) throws -> UInt64 {
559620 guard let token = token else {
560621 throw XCLogParserError . parseError ( " Unexpected EOF parsing Int " )
0 commit comments