|
12 | 12 | import TSCBasic
|
13 | 13 | import SwiftOptions
|
14 | 14 |
|
| 15 | +public class PrebuitModuleGenerationDelegate: JobExecutionDelegate { |
| 16 | + var failingModules = Set<String>() |
| 17 | + var commandMap: [Int: String] = [:] |
| 18 | + let diagnosticsEngine: DiagnosticsEngine |
| 19 | + let verbose: Bool |
| 20 | + public init(_ diagnosticsEngine: DiagnosticsEngine, _ verbose: Bool) { |
| 21 | + self.diagnosticsEngine = diagnosticsEngine |
| 22 | + self.verbose = verbose |
| 23 | + } |
| 24 | + |
| 25 | + func printJobInfo(_ job: Job, _ start: Bool) { |
| 26 | + guard verbose else { |
| 27 | + return |
| 28 | + } |
| 29 | + for arg in job.commandLine { |
| 30 | + if case .path(let p) = arg { |
| 31 | + if p.extension == "swiftinterface" { |
| 32 | + Driver.stdErrQueue.sync { |
| 33 | + stderrStream <<< (start ? "started: " : "finished: ") |
| 34 | + stderrStream <<< p.absolutePath!.pathString <<< "\n" |
| 35 | + stderrStream.flush() |
| 36 | + } |
| 37 | + return |
| 38 | + } |
| 39 | + } |
| 40 | + } |
| 41 | + } |
| 42 | + |
| 43 | + public func jobStarted(job: Job, arguments: [String], pid: Int) { |
| 44 | + commandMap[pid] = arguments.reduce("") { return $0 + " " + $1 } |
| 45 | + printJobInfo(job, true) |
| 46 | + } |
| 47 | + |
| 48 | + public var hasStdlibFailure: Bool { |
| 49 | + return failingModules.contains("Swift") || failingModules.contains("_Concurrency") |
| 50 | + } |
| 51 | + |
| 52 | + public func jobFinished(job: Job, result: ProcessResult, pid: Int) { |
| 53 | + switch result.exitStatus { |
| 54 | + case .terminated(code: let code): |
| 55 | + if code == 0 { |
| 56 | + printJobInfo(job, false) |
| 57 | + } else { |
| 58 | + failingModules.insert(job.moduleName) |
| 59 | + let result: String = try! result.utf8stderrOutput() |
| 60 | + Driver.stdErrQueue.sync { |
| 61 | + stderrStream <<< "failed: " <<< commandMap[pid]! <<< "\n" |
| 62 | + stderrStream <<< result <<< "\n" |
| 63 | + stderrStream.flush() |
| 64 | + } |
| 65 | + } |
| 66 | +#if !os(Windows) |
| 67 | + case .signalled: |
| 68 | + diagnosticsEngine.emit(.remark("\(job.moduleName) interrupted")) |
| 69 | +#endif |
| 70 | + } |
| 71 | + } |
| 72 | + |
| 73 | + public func jobSkipped(job: Job) { |
| 74 | + diagnosticsEngine.emit(.error("\(job.moduleName) skipped")) |
| 75 | + } |
| 76 | +} |
| 77 | + |
15 | 78 | public struct PrebuiltModuleInput {
|
16 | 79 | // The path to the input/output of the a module building task.
|
17 | 80 | let path: TypedVirtualPath
|
|
0 commit comments