Skip to content

Commit 29f731b

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.
1 parent 39a55bf commit 29f731b

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
@@ -432,7 +432,7 @@ fileprivate struct CommandTaskTracker {
432432
}
433433

434434
finishedCount += 1
435-
case .signalled, .skipped:
435+
case .unparsableOutput, .signalled, .skipped:
436436
break
437437
}
438438
}
@@ -482,9 +482,10 @@ fileprivate struct CommandTaskTracker {
482482

483483
extension SwiftCompilerMessage {
484484
fileprivate var verboseProgressText: String? {
485-
if case .began(let info) = kind {
485+
switch kind {
486+
case .began(let info):
486487
return ([info.commandExecutable] + info.commandArguments).joined(separator: " ")
487-
} else {
488+
case .skipped, .finished, .signalled, .unparsableOutput:
488489
return nil
489490
}
490491
}
@@ -494,7 +495,9 @@ extension SwiftCompilerMessage {
494495
case .finished(let info),
495496
.signalled(let info):
496497
return info.output
497-
default:
498+
case .unparsableOutput(let output):
499+
return output
500+
case .skipped, .began:
498501
return nil
499502
}
500503
}

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)