Skip to content

Commit 92e6773

Browse files
authored
Merge pull request #30 from sjavora/signalled-message
[Parseable output] Implement SignalledMessage
2 parents 827b0a4 + 17b3a2c commit 92e6773

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
@@ -16,7 +16,7 @@ public struct ParsableMessage {
1616
public enum Kind {
1717
case began(BeganMessage)
1818
case finished(FinishedMessage)
19-
case signalled
19+
case signalled(SignalledMessage)
2020
case skipped
2121
}
2222

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

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

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

Tests/SwiftDriverTests/ParsableMessageTests.swift

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

0 commit comments

Comments
 (0)