From b9f1a8539980450bad71e39009854a9040a3346f Mon Sep 17 00:00:00 2001 From: Hesham Salman Date: Thu, 13 Mar 2025 10:58:33 -0400 Subject: [PATCH] Fix xclogparser typechecking/functiontiming in modern xcode builds Signed-off-by: Hesham Salman --- Sources/XCLogParser/parser/BuildStep.swift | 2 +- .../IDEActivityLogSection+Parsing.swift | 2 +- .../XCLogParser/parser/ParserBuildSteps.swift | 2 +- .../parser/SwiftFunctionTime.swift | 2 +- .../XCLogParser/parser/SwiftTypeCheck.swift | 2 +- .../XCLogParser/reporter/HtmlReporter.swift | 45 +++++++++---------- Tests/XCLogParserTests/ParserTests.swift | 4 +- 7 files changed, 29 insertions(+), 30 deletions(-) diff --git a/Sources/XCLogParser/parser/BuildStep.swift b/Sources/XCLogParser/parser/BuildStep.swift index 4c082f5..a3532e1 100644 --- a/Sources/XCLogParser/parser/BuildStep.swift +++ b/Sources/XCLogParser/parser/BuildStep.swift @@ -96,7 +96,7 @@ public enum DetailStepType: String, Encodable { switch signature { case Prefix("CompileC "): return .cCompilation - case Prefix("CompileSwift "): + case Prefix("SwiftCompile "): return .swiftCompilation case Prefix("Ld "): return .linker diff --git a/Sources/XCLogParser/parser/IDEActivityLogSection+Parsing.swift b/Sources/XCLogParser/parser/IDEActivityLogSection+Parsing.swift index b16a7b8..089741a 100644 --- a/Sources/XCLogParser/parser/IDEActivityLogSection+Parsing.swift +++ b/Sources/XCLogParser/parser/IDEActivityLogSection+Parsing.swift @@ -87,7 +87,7 @@ extension IDEActivityLogSection { public func getSwiftIndividualSteps(buildStep: BuildStep, parentCommandDetailDesc: String, currentIndex: inout Int) -> [BuildStep]? { - let pattern = #"^CompileSwift\s\w+\s\w+\s.+\.swift\s"# + let pattern = #"^SwiftCompile\s\w+\s\w+\s.+\.swift\s"# guard commandDetailDesc.range(of: pattern, options: .regularExpression) == nil else { return nil } diff --git a/Sources/XCLogParser/parser/ParserBuildSteps.swift b/Sources/XCLogParser/parser/ParserBuildSteps.swift index cdea461..bf8601f 100644 --- a/Sources/XCLogParser/parser/ParserBuildSteps.swift +++ b/Sources/XCLogParser/parser/ParserBuildSteps.swift @@ -75,7 +75,7 @@ public final class ParserBuildSteps { }() lazy var swiftcArchRegexp: NSRegularExpression? = { - let pattern = "^CompileSwift normal (\\w*) " + let pattern = "^SwiftCompile normal (\\w*) " return NSRegularExpression.fromPattern(pattern) }() diff --git a/Sources/XCLogParser/parser/SwiftFunctionTime.swift b/Sources/XCLogParser/parser/SwiftFunctionTime.swift index 467c6dc..a2fd2fc 100644 --- a/Sources/XCLogParser/parser/SwiftFunctionTime.swift +++ b/Sources/XCLogParser/parser/SwiftFunctionTime.swift @@ -20,7 +20,7 @@ import Foundation /// Represents the time it took to the Swift Compiler to compile a function -public struct SwiftFunctionTime: Encodable { +public struct SwiftFunctionTime: Encodable, Hashable { /// URL of the file where the function is public let file: String diff --git a/Sources/XCLogParser/parser/SwiftTypeCheck.swift b/Sources/XCLogParser/parser/SwiftTypeCheck.swift index ca18c21..0f81263 100644 --- a/Sources/XCLogParser/parser/SwiftTypeCheck.swift +++ b/Sources/XCLogParser/parser/SwiftTypeCheck.swift @@ -20,7 +20,7 @@ import Foundation /// Represents the time it took to the Swift Compiler to type check an expression -public struct SwiftTypeCheck: Encodable { +public struct SwiftTypeCheck: Encodable, Hashable { /// URL of the file where the function is public let file: String diff --git a/Sources/XCLogParser/reporter/HtmlReporter.swift b/Sources/XCLogParser/reporter/HtmlReporter.swift index c3b5925..43b2e28 100644 --- a/Sources/XCLogParser/reporter/HtmlReporter.swift +++ b/Sources/XCLogParser/reporter/HtmlReporter.swift @@ -203,40 +203,39 @@ public struct HtmlReporter: LogReporter { let steps = build.subSteps.map { $0.subSteps }.joined() let aggretatedAndSwiftSteps = steps.filter { !$0.fetchedFromCache && ($0.detailStepType == .swiftCompilation || $0.detailStepType == .swiftAggregatedCompilation) } - var swiftFunctionTimes: [SwiftFunctionTime] = [] - var swiftTypeCheckTimes: [SwiftTypeCheck] = [] + var _swiftFunctionTimes: Set = [] + var _swiftTypeCheckTimes: Set = [] var swiftSteps: [BuildStep] = [] aggretatedAndSwiftSteps.forEach { step in - if step.detailStepType == .swiftAggregatedCompilation { - let swiftSubSteps = step.subSteps.filter { $0.detailStepType == .swiftCompilation} - .map { subStep in - subStep.with(parentIdentifier: step.parentIdentifier) - } - swiftSteps.append(contentsOf: swiftSubSteps) - let functions = swiftSubSteps - .compactMap { $0.swiftFunctionTimes } - .joined() - let typeChecks = swiftSubSteps - .compactMap { $0.swiftTypeCheckTimes } - .joined() - swiftFunctionTimes.append(contentsOf: functions) - swiftTypeCheckTimes.append(contentsOf: typeChecks) - } else { - swiftSteps.append(step) - if let functions = step.swiftFunctionTimes { - swiftFunctionTimes.append(contentsOf: functions) - } - if let typeChecks = step.swiftTypeCheckTimes { - swiftTypeCheckTimes.append(contentsOf: typeChecks) + let swiftSubSteps = step.subSteps.filter { $0.detailStepType == .swiftCompilation} + .map { subStep in + subStep.with(parentIdentifier: step.parentIdentifier) } + swiftSteps.append(contentsOf: swiftSubSteps) + let functions = swiftSubSteps + .compactMap { $0.swiftFunctionTimes } + .joined() + let typeChecks = swiftSubSteps + .compactMap { $0.swiftTypeCheckTimes } + .joined() + if let functionTimes = step.swiftFunctionTimes { + functionTimes.forEach { _swiftFunctionTimes.insert($0) } + } + if let typeCheckTimes = step.swiftTypeCheckTimes { + typeCheckTimes.forEach { _swiftTypeCheckTimes.insert($0) } } + functions.forEach { _swiftFunctionTimes.insert($0) } + typeChecks.forEach { _swiftTypeCheckTimes.insert($0) } } swiftSteps.sort { $0.compilationDuration > $1.compilationDuration } let cSteps = steps.filter { !$0.fetchedFromCache && $0.detailStepType == .cCompilation } .sorted { $0.compilationDuration > $1.compilationDuration } + var swiftFunctionTimes: [SwiftFunctionTime] = Array(_swiftFunctionTimes) + var swiftTypeCheckTimes: [SwiftTypeCheck] = Array(_swiftTypeCheckTimes) + swiftFunctionTimes.sort { $0.durationMS > $1.durationMS } let topFunctions = Array(swiftFunctionTimes.prefix(Self.maxSwifTypeChecks)) diff --git a/Tests/XCLogParserTests/ParserTests.swift b/Tests/XCLogParserTests/ParserTests.swift index a0e978a..22d7bb5 100644 --- a/Tests/XCLogParserTests/ParserTests.swift +++ b/Tests/XCLogParserTests/ParserTests.swift @@ -541,8 +541,8 @@ CompileSwift normal x86_64 (in target 'Alamofire' from project 'Pods') lazy var fakeSwiftCompilation: IDEActivityLogSection = { return IDEActivityLogSection(sectionType: 1, domainType: "", - title: "CompileSwift", - signature: "CompileSwift normal x86_64", + title: "SwiftCompile", + signature: "SwiftCompile normal x86_64", timeStartedRecording: 1.0, timeStoppedRecording: 2.0, subSections: [],