init?()

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)
  }