in Sources/SwiftDriver/IncrementalCompilation/BuildRecord.swift [60:135]
init?(contents: String, failedToReadOutOfDateMap: (String?) -> Void) {
guard let sections = try? Parser(yaml: contents, resolver: .basic, encoding: .utf8)
.singleRoot()?.mapping
else {
failedToReadOutOfDateMap(nil)
return nil
}
var argsHash: String?
var swiftVersion: String?
// Legacy driver does not disable incremental if no buildTime field.
var buildStartTime: Date = .distantPast
var buildEndTime: Date = .distantFuture
var inputInfos: [VirtualPath: InputInfo]?
for (key, value) in sections {
guard let k = key.string else {
failedToReadOutOfDateMap(nil)
return nil
}
switch k {
case SectionName.swiftVersion.serializedName:
// There's a test that uses "" for an illegal value
guard let s = value.string, s != "" else {
failedToReadOutOfDateMap("Malformed value for key '\(k)'")
return nil
}
swiftVersion = s
case SectionName.argsHash.serializedName:
guard let s = value.string, s != "" else {
failedToReadOutOfDateMap("no name node in build record")
return nil
}
argsHash = s
case SectionName.buildStartTime.serializedName,
SectionName.legacyBuildStartTime.serializedName:
guard let d = Self.decodeDate(value,
forInputInfo: false,
failedToReadOutOfDateMap)
else {
return nil
}
buildStartTime = d
case SectionName.buildEndTime.serializedName:
guard let d = Self.decodeDate(value,
forInputInfo: false,
failedToReadOutOfDateMap)
else {
return nil
}
buildEndTime = d
case SectionName.inputInfos.serializedName:
guard let ii = Self.decodeInputInfos(value, failedToReadOutOfDateMap) else {
return nil
}
inputInfos = ii
default:
failedToReadOutOfDateMap("Unexpected key '\(k)'")
return nil
}
}
// The legacy driver allows argHash to be absent to ease testing.
// Mimic the legacy driver for testing ease: If no `argsHash` section,
// record still matches.
guard let sv = swiftVersion else {
failedToReadOutOfDateMap("Malformed value for key '\(SectionName.swiftVersion.serializedName)'")
return nil
}
guard let iis = inputInfos else {
failedToReadOutOfDateMap("Malformed value for key '\(SectionName.inputInfos.serializedName)'")
return nil
}
self.init(argsHash: argsHash,
swiftVersion: sv,
buildStartTime: buildStartTime,
buildEndTime: buildEndTime,
inputInfos: iis)
}