Skip to content

Commit 8b76c3c

Browse files
committed
Deserialize diagnostics with no location correctly
1 parent 907b747 commit 8b76c3c

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

Sources/TSCUtility/SerializedDiagnostics.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ extension SerializedDiagnostics {
185185

186186
public struct SourceLocation: Equatable {
187187
/// The filename associated with the diagnostic.
188-
public var filename: String
188+
public var filename: String?
189189
public var line: UInt64
190190
public var column: UInt64
191191
/// The byte offset in the source file of the diagnostic. Currently, only
@@ -194,10 +194,7 @@ extension SerializedDiagnostics {
194194

195195
fileprivate init(fields: ArraySlice<UInt64>,
196196
filenameMap: [UInt64: String]) throws {
197-
guard let name = filenameMap[fields[fields.startIndex]] else {
198-
throw Error.missingInformation
199-
}
200-
self.filename = name
197+
self.filename = filenameMap[fields[fields.startIndex]]
201198
self.line = fields[fields.startIndex + 1]
202199
self.column = fields[fields.startIndex + 2]
203200
self.offset = fields[fields.startIndex + 3]
336 Bytes
Binary file not shown.

Tests/TSCUtilityTests/SerializedDiagnosticsTests.swift

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ final class SerializedDiagnosticsTests: XCTestCase {
2626
let one = serializedDiags.diagnostics[5]
2727
XCTAssertEqual(one.text, "expected ',' separator")
2828
XCTAssertEqual(one.level, .error)
29-
XCTAssertTrue(one.location.filename.hasSuffix("/StoreSearchCoordinator.swift"))
29+
XCTAssertEqual(one.location.filename?.hasSuffix("/StoreSearchCoordinator.swift"), true)
3030
XCTAssertEqual(one.location.line, 21)
3131
XCTAssertEqual(one.location.column, 69)
3232
XCTAssertEqual(one.location.offset, 0)
@@ -36,32 +36,54 @@ final class SerializedDiagnosticsTests: XCTestCase {
3636
XCTAssertEqual(one.fixIts.count, 1)
3737
XCTAssertEqual(one.fixIts[0].text, ",")
3838
XCTAssertEqual(one.fixIts[0].start, one.fixIts[0].end)
39-
XCTAssertTrue(one.fixIts[0].start.filename.hasSuffix("/StoreSearchCoordinator.swift"))
39+
XCTAssertEqual(one.fixIts[0].start.filename?.hasSuffix("/StoreSearchCoordinator.swift"), true)
4040
XCTAssertEqual(one.fixIts[0].start.line, 21)
4141
XCTAssertEqual(one.fixIts[0].start.column, 69)
4242
XCTAssertEqual(one.fixIts[0].start.offset, 0)
4343

4444
let two = serializedDiags.diagnostics[16]
4545
XCTAssertEqual(two.text, "use of unresolved identifier 'DispatchQueue'")
4646
XCTAssertEqual(two.level, .error)
47-
XCTAssertTrue(two.location.filename.hasSuffix("/Observable.swift"))
47+
XCTAssertEqual(two.location.filename?.hasSuffix("/Observable.swift"), true)
4848
XCTAssertEqual(two.location.line, 34)
4949
XCTAssertEqual(two.location.column, 13)
5050
XCTAssertEqual(two.location.offset, 0)
5151
XCTAssertNil(two.category)
5252
XCTAssertNil(two.flag)
5353
XCTAssertEqual(two.ranges.count, 1)
54-
XCTAssertTrue(two.ranges[0].0.filename.hasSuffix("/Observable.swift"))
54+
XCTAssertEqual(two.ranges[0].0.filename?.hasSuffix("/Observable.swift"), true)
5555
XCTAssertEqual(two.ranges[0].0.line, 34)
5656
XCTAssertEqual(two.ranges[0].0.column, 13)
5757
XCTAssertEqual(two.ranges[0].0.offset, 0)
58-
XCTAssertTrue(two.ranges[0].1.filename.hasSuffix("/Observable.swift"))
58+
XCTAssertEqual(two.ranges[0].1.filename?.hasSuffix("/Observable.swift"), true)
5959
XCTAssertEqual(two.ranges[0].1.line, 34)
6060
XCTAssertEqual(two.ranges[0].1.column, 26)
6161
XCTAssertEqual(two.ranges[0].1.offset, 0)
6262
XCTAssertEqual(two.fixIts.count, 0)
6363
}
6464

65+
func testReadDiagsWithNoLocation() throws {
66+
let serializedDiagnosticsPath = AbsolutePath(#file).parentDirectory
67+
.appending(components: "Inputs", "no-location.dia")
68+
let contents = try localFileSystem.readFileContents(serializedDiagnosticsPath)
69+
let serializedDiags = try SerializedDiagnostics(bytes: contents)
70+
71+
XCTAssertEqual(serializedDiags.versionNumber, 2)
72+
XCTAssertEqual(serializedDiags.diagnostics.count, 1)
73+
74+
let diag = serializedDiags.diagnostics[0]
75+
XCTAssertEqual(diag.text, "API breakage: func foo() has been removed")
76+
XCTAssertEqual(diag.level, .error)
77+
XCTAssertNil(diag.location.filename)
78+
XCTAssertEqual(diag.location.line, 0)
79+
XCTAssertEqual(diag.location.column, 0)
80+
XCTAssertEqual(diag.location.offset, 0)
81+
XCTAssertEqual(diag.category, "api-digester-breaking-change")
82+
XCTAssertNil(diag.flag)
83+
XCTAssertEqual(diag.ranges.count, 0)
84+
XCTAssertEqual(diag.fixIts.count, 0)
85+
}
86+
6587
func testReadClangSerializedDiags() throws {
6688
let serializedDiagnosticsPath = AbsolutePath(#file).parentDirectory
6789
.appending(components: "Inputs", "clang.dia")

0 commit comments

Comments
 (0)