Skip to content

Commit 17b3a2c

Browse files
committed
Implement SignalledMessage
1 parent 0f431c1 commit 17b3a2c

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

Sources/SwiftDriver/Driver/ToolExecutionDelegate.swift

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@
1111
//===----------------------------------------------------------------------===//
1212
import TSCBasic
1313

14+
#if canImport(Darwin)
15+
import Darwin.C
16+
#elseif os(Windows)
17+
import MSVCRT
18+
import WinSDK
19+
#elseif canImport(Glibc)
20+
import Glibc
21+
#else
22+
#error("Missing libc or equivalent")
23+
#endif
24+
1425
/// Delegate for printing execution information on the command-line.
1526
public struct ToolExecutionDelegate: JobExecutorDelegate {
1627
public enum Mode {
@@ -58,18 +69,20 @@ public struct ToolExecutionDelegate: JobExecutorDelegate {
5869
}
5970

6071
case .parsableOutput:
72+
let output = (try? result.utf8Output() + result.utf8stderrOutput()).flatMap { $0.isEmpty ? nil : $0 }
73+
let message: ParsableMessage
74+
6175
switch result.exitStatus {
6276
case .terminated(let code):
63-
let output = (try? result.utf8Output() + result.utf8stderrOutput()) ?? ""
64-
let finishedMessage = FinishedMessage(exitStatus: Int(code), pid: pid, output: output.isEmpty ? nil : output)
65-
let message = ParsableMessage.finishedMessage(name: job.kind.rawValue, msg: finishedMessage)
66-
emit(message)
77+
let finishedMessage = FinishedMessage(exitStatus: Int(code), pid: pid, output: output)
78+
message = ParsableMessage.finishedMessage(name: job.kind.rawValue, msg: finishedMessage)
6779

68-
case .signalled:
69-
// FIXME: Implement this.
70-
break
80+
case .signalled(let signal):
81+
let errorMessage = strsignal(signal).map { String(cString: $0) } ?? ""
82+
let signalledMessage = SignalledMessage(pid: pid, output: output, errorMessage: errorMessage, signal: Int(signal))
83+
message = ParsableMessage.signalledMessage(name: job.kind.rawValue, msg: signalledMessage)
7184
}
72-
85+
emit(message)
7386
}
7487
}
7588

Sources/SwiftDriver/Execution/ParsableOutput.swift

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public struct ParsableMessage {
1717
public enum Kind {
1818
case began(BeganMessage)
1919
case finished(FinishedMessage)
20-
case signalled
20+
case signalled(SignalledMessage)
2121
case skipped
2222
}
2323

@@ -38,6 +38,13 @@ public struct ParsableMessage {
3838
return ParsableMessage(name: name, kind: .finished(msg))
3939
}
4040

41+
public static func signalledMessage(
42+
name: String,
43+
msg: SignalledMessage
44+
) -> ParsableMessage {
45+
return ParsableMessage(name: name, kind: .signalled(msg))
46+
}
47+
4148
public func toJSON() throws -> Data {
4249
let encoder = JSONEncoder()
4350
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
@@ -109,6 +116,27 @@ public struct FinishedMessage: Encodable {
109116
}
110117
}
111118

119+
public struct SignalledMessage: Encodable {
120+
let pid: Int
121+
let output: String?
122+
let errorMessage: String
123+
let signal: Int
124+
125+
public init(pid: Int, output: String?, errorMessage: String, signal: Int) {
126+
self.pid = pid
127+
self.output = output
128+
self.errorMessage = errorMessage
129+
self.signal = signal
130+
}
131+
132+
private enum CodingKeys: String, CodingKey {
133+
case pid
134+
case output
135+
case errorMessage = "error-message"
136+
case signal
137+
}
138+
}
139+
112140
extension ParsableMessage: Encodable {
113141
enum CodingKeys: CodingKey {
114142
case name
@@ -126,8 +154,9 @@ extension ParsableMessage: Encodable {
126154
case .finished(let msg):
127155
try container.encode("finished", forKey: .kind)
128156
try msg.encode(to: encoder)
129-
case .signalled:
130-
break
157+
case .signalled(let msg):
158+
try container.encode("signalled", forKey: .kind)
159+
try msg.encode(to: encoder)
131160
case .skipped:
132161
break
133162
}

Tests/SwiftDriverTests/ParsableMessageTests.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,22 @@ final class ParsableMessageTests: XCTestCase {
7171
}
7272
""")
7373
}
74+
75+
func testSignalledMessage() throws {
76+
let msg = SignalledMessage(pid: 2, output: "sig", errorMessage: "err", signal: 3)
77+
let signalledMessage = ParsableMessage.signalledMessage(name: "compile", msg: msg)
78+
let encoded = try signalledMessage.toJSON()
79+
let string = String(data: encoded, encoding: .utf8)!
80+
81+
XCTAssertEqual(string, """
82+
{
83+
"error-message" : "err",
84+
"kind" : "signalled",
85+
"name" : "compile",
86+
"output" : "sig",
87+
"pid" : 2,
88+
"signal" : 3
89+
}
90+
""")
91+
}
7492
}

0 commit comments

Comments
 (0)