@@ -97,14 +97,20 @@ class ActivityParserTests: XCTestCase {
9797 Token . string ( " 501796C4-6BE4-4F80-9F9D-3269617ECC17 " ) ,
9898 Token . string ( " localizedResultString " ) ,
9999 Token . string ( " xcbuildSignature " ) ,
100- Token . list ( 2 ) ,
100+ Token . list ( 3 ) ,
101101 Token . classNameRef ( " IDEFoundation.IDEActivityLogSectionAttachment " ) ,
102102 Token . string ( " com.apple.dt.ActivityLogSectionAttachment.TaskBacktrace " ) ,
103103 Token . int ( 1 ) ,
104104 Token . int ( 0 ) ,
105105 // swiftlint:disable:next line_length
106106 Token . json ( #"[{"description":"'Planning Swift module ConcurrencyExtras (arm64)' had never run","category":{"ruleNeverBuilt":{}},"identifier":{"storage":{"task":{"_0":[0,80,50,58,116,97,114,103,101,116,45,67,111,110,99,117,114,114,101,110,99,121,69,120,116,114,97,115,45,101,102,52,50,51,48,52,53,57,52,98,102,56,53,50,102,52,51,56,101,102,55,99,51,97,49,51,54,98,50,99,57,48,100,102,56,55,49,56,97,102,50,98,57,100,51,97,97,99,48,100,48,100,99,97,50,50,98,52,99,50,57,99,50,45,58,66,101,116,97,32,68,101,98,117,103,58,51,99,57,97,99,57,53,50,98,52,99,56,49,100,57,99,99,49,55,100,49,97,102,52,55,49,97,48,52,53,101,56]}}},"frameKind":{"genericTask":{}}}]"# ) ,
107107 Token . classNameRef ( " IDEFoundation.IDEActivityLogSectionAttachment " ) ,
108+ Token . string ( " com.apple.dt.ActivityLogSectionAttachment.BuildOperationMetrics " ) ,
109+ Token . int ( 1 ) ,
110+ Token . int ( 0 ) ,
111+ // swiftlint:disable:next line_length
112+ Token . json ( #"{"clangCacheHits":0,"clangCacheMisses":2,"swiftCacheHits":0,"swiftCacheMisses":8}"# ) ,
113+ Token . classNameRef ( " IDEFoundation.IDEActivityLogSectionAttachment " ) ,
108114 Token . string ( " com.apple.dt.ActivityLogSectionAttachment.TaskMetrics " ) ,
109115 Token . int ( 1 ) ,
110116 Token . int ( 0 ) ,
@@ -142,6 +148,36 @@ class ActivityParserTests: XCTestCase {
142148 return startTokens + logMessageTokens + endTokens
143149 } ( )
144150
151+ // Xcode 26.2 format: unknown integer appears before subtitle
152+ lazy var IDEActivityLogSectionTokensXcode262 : [ Token ] = {
153+ let startTokens = [ Token . int ( 2 ) ,
154+ Token . string ( " com.apple.dt.IDE.BuildLogSection " ) ,
155+ Token . string ( " Prepare build " ) ,
156+ Token . string ( " Prepare build " ) ,
157+ Token . double ( 575479851.278759 ) ,
158+ Token . double ( 575479851.778325 ) ,
159+ Token . null,
160+ Token . string ( " note: Using legacy build system " ) ,
161+ Token . list ( 1 ) ,
162+ Token . className ( " IDEActivityLogMessage " ) ,
163+ Token . classNameRef ( " IDEActivityLogMessage " ) ,
164+ ]
165+ let logMessageTokens = IDEActivityLogMessageTokens
166+ let endTokens = [ Token . int ( 1 ) ,
167+ Token . int ( 0 ) ,
168+ Token . int ( 1 ) ,
169+ Token . int ( 42 ) , // unknown integer before subtitle (Xcode 26.2+)
170+ Token . string ( " subtitle " ) ,
171+ Token . null,
172+ Token . string ( " commandDetailDesc " ) ,
173+ Token . string ( " 501796C4-6BE4-4F80-9F9D-3269617ECC17 " ) ,
174+ Token . string ( " localizedResultString " ) ,
175+ Token . string ( " xcbuildSignature " ) ,
176+ Token . list ( 0 ) , // attachments
177+ ]
178+ return startTokens + logMessageTokens + endTokens
179+ } ( )
180+
145181 let IDEConsoleItemTokens : [ Token ] = [
146182 Token . className ( " IDEConsoleItem " ) ,
147183 Token . classNameRef ( " IDEConsoleItem " ) ,
@@ -345,9 +381,11 @@ class ActivityParserTests: XCTestCase {
345381 XCTAssertEqual ( " 501796C4-6BE4-4F80-9F9D-3269617ECC17 " , logSection. uniqueIdentifier)
346382 XCTAssertEqual ( " localizedResultString " , logSection. localizedResultString)
347383 XCTAssertEqual ( " xcbuildSignature " , logSection. xcbuildSignature)
348- XCTAssertEqual ( 2 , logSection. attachments. count)
384+ XCTAssertEqual ( 3 , logSection. attachments. count)
349385 XCTAssertEqual ( logSection. attachments [ 0 ] . backtrace? . frames. first? . category, . ruleNeverBuilt)
350- XCTAssertEqual ( logSection. attachments [ 1 ] . metrics? . wcDuration, 1 )
386+ print ( logSection. attachments)
387+ XCTAssertEqual ( logSection. attachments [ 1 ] . buildOperationMetrics? . clangCacheMisses, 2 )
388+ XCTAssertEqual ( logSection. attachments [ 2 ] . metrics? . wcDuration, 1 )
351389 XCTAssertEqual ( 0 , logSection. unknown)
352390 }
353391
@@ -379,6 +417,34 @@ class ActivityParserTests: XCTestCase {
379417 XCTAssertEqual ( 0 , logSection. unknown)
380418 }
381419
420+ func testParseIDEActivityLogSectionXcode262( ) throws {
421+ parser. logVersion = 12
422+ let tokens = IDEActivityLogSectionTokensXcode262
423+ var iterator = tokens. makeIterator ( )
424+ let logSection = try parser. parseIDEActivityLogSection ( iterator: & iterator)
425+ XCTAssertEqual ( 2 , logSection. sectionType)
426+ XCTAssertEqual ( " com.apple.dt.IDE.BuildLogSection " , logSection. domainType)
427+ XCTAssertEqual ( " Prepare build " , logSection. title)
428+ XCTAssertEqual ( " Prepare build " , logSection. signature)
429+ XCTAssertEqual ( 575479851.278759 , logSection. timeStartedRecording)
430+ XCTAssertEqual ( 575479851.778325 , logSection. timeStoppedRecording)
431+ XCTAssertEqual ( 0 , logSection. subSections. count)
432+ XCTAssertEqual ( " note: Using legacy build system " , logSection. text)
433+ XCTAssertEqual ( 1 , logSection. messages. count)
434+ XCTAssertTrue ( logSection. wasCancelled)
435+ XCTAssertFalse ( logSection. isQuiet)
436+ XCTAssertTrue ( logSection. wasFetchedFromCache)
437+ XCTAssertEqual ( " subtitle " , logSection. subtitle)
438+ XCTAssertEqual ( " " , logSection. location. documentURLString)
439+ XCTAssertEqual ( 0 , logSection. location. timestamp)
440+ XCTAssertEqual ( " commandDetailDesc " , logSection. commandDetailDesc)
441+ XCTAssertEqual ( " 501796C4-6BE4-4F80-9F9D-3269617ECC17 " , logSection. uniqueIdentifier)
442+ XCTAssertEqual ( " localizedResultString " , logSection. localizedResultString)
443+ XCTAssertEqual ( " xcbuildSignature " , logSection. xcbuildSignature)
444+ XCTAssertEqual ( 0 , logSection. attachments. count)
445+ XCTAssertEqual ( 42 , logSection. unknown)
446+ }
447+
382448 func testParseActivityLog( ) throws {
383449 let activityLog = try parser. parseIDEActiviyLogFromTokens ( IDEActivityLogTokens)
384450 XCTAssertEqual ( 10 , activityLog. version)
0 commit comments