Skip to content

Commit a465d93

Browse files
committed
[Build] Handle unparsable messages during message size parsing
<rdar://problem/49235252> Looks like swift compiler can emit a non-parsable message in some cases. (cherry picked from commit 29f731b)
1 parent 8deef33 commit a465d93

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

Sources/Build/BuildDelegate.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ fileprivate struct CommandTaskTracker {
430430
}
431431

432432
finishedCount += 1
433-
case .signalled, .skipped:
433+
case .unparsableOutput, .signalled, .skipped:
434434
break
435435
}
436436
}
@@ -480,9 +480,10 @@ fileprivate struct CommandTaskTracker {
480480

481481
extension SwiftCompilerMessage {
482482
fileprivate var verboseProgressText: String? {
483-
if case .began(let info) = kind {
483+
switch kind {
484+
case .began(let info):
484485
return ([info.commandExecutable] + info.commandArguments).joined(separator: " ")
485-
} else {
486+
case .skipped, .finished, .signalled, .unparsableOutput:
486487
return nil
487488
}
488489
}
@@ -492,7 +493,9 @@ extension SwiftCompilerMessage {
492493
case .finished(let info),
493494
.signalled(let info):
494495
return info.output
495-
default:
496+
case .unparsableOutput(let output):
497+
return output
498+
case .skipped, .began:
496499
return nil
497500
}
498501
}

Sources/Build/SwiftCompilerOutputParser.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct SwiftCompilerMessage {
4141
case skipped(SkippedInfo)
4242
case finished(OutputInfo)
4343
case signalled(OutputInfo)
44+
case unparsableOutput(String)
4445
}
4546

4647
let name: String
@@ -166,7 +167,12 @@ private extension SwiftCompilerOutputParser {
166167
}
167168

168169
guard let messageSize = Int(string) else {
169-
throw ParsingError(reason: "invalid message size")
170+
// Non-parseable chunks are *assumed* to be output. E.g., you get
171+
// a "remark" if you build with SWIFTC_MAXIMUM_DETERMINISM env variable.
172+
let message = SwiftCompilerMessage(name: "unknown", kind: .unparsableOutput(string))
173+
delegate?.swiftCompilerOutputParser(self, didParse: message)
174+
buffer.removeAll()
175+
return
170176
}
171177

172178
buffer.removeAll()

Tests/BuildTests/SwiftCompilerOutputParserTests.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,9 @@ class SwiftCompilerOutputParserTests: XCTestCase {
211211
2A
212212
213213
""".utf8)
214-
delegate.assert(messages: [], errorDescription: "invalid message size")
214+
delegate.assert(messages: [
215+
SwiftCompilerMessage(name: "unknown", kind: .unparsableOutput("2A"))
216+
], errorDescription: nil)
215217

216218
parser.parse(bytes: """
217219
119
@@ -223,7 +225,9 @@ class SwiftCompilerOutputParserTests: XCTestCase {
223225
"signal": 4
224226
}
225227
""".utf8)
226-
delegate.assert(messages: [], errorDescription: nil)
228+
delegate.assert(messages: [
229+
SwiftCompilerMessage(name: "link", kind: .signalled(.init(pid: 22699, output: nil)))
230+
], errorDescription: nil)
227231
}
228232

229233
func testInvalidMessageBytes() {

0 commit comments

Comments
 (0)