in Sources/SwiftDriver/IncrementalCompilation/SourceFileDependencyGraph.swift [234:290]
mutating func visit(record: BitcodeElement.Record) throws {
guard let kind = RecordKind(rawValue: record.id) else { throw ReadError.unknownRecord }
switch kind {
case .metadata:
// If we've already read metadata, this is an unexpected duplicate.
guard majorVersion == nil, minorVersion == nil, compilerVersionString == nil else {
throw ReadError.unexpectedMetadataRecord
}
guard record.fields.count == 2,
case .blob(let compilerVersionBlob) = record.payload
else { throw ReadError.malformedMetadataRecord }
self.majorVersion = record.fields[0]
self.minorVersion = record.fields[1]
self.compilerVersionString = String(decoding: compilerVersionBlob, as: UTF8.self)
case .sourceFileDepGraphNode:
try finalizeNode()
let kindCode = record.fields[0]
guard record.fields.count == 5,
let declAspect = DependencyKey.DeclAspect(record.fields[1]),
record.fields[2] < identifiers.count,
record.fields[3] < identifiers.count else {
throw ReadError.malformedSourceFileDepGraphNodeRecord
}
let context = identifiers[Int(record.fields[2])]
let identifier = identifiers[Int(record.fields[3])]
self.definitionVsUse = .deserializing(record.fields[4])
let designator = try DependencyKey.Designator(
kindCode: kindCode, context: context, name: identifier,
internedStringTable: internedStringTable)
self.key = DependencyKey(aspect: declAspect, designator: designator)
self.fingerprint = nil
self.nodeSequenceNumber = nextSequenceNumber
self.defsNodeDependUpon.removeAll(keepingCapacity: true)
nextSequenceNumber += 1
case .fingerprintNode:
guard key != nil,
record.fields.count == 0,
case .blob(let fingerprintBlob) = record.payload
else {
throw ReadError.malformedFingerprintRecord
}
self.fingerprint = String(decoding: fingerprintBlob, as: UTF8.self)
case .dependsOnDefinitionNode:
guard key != nil,
record.fields.count == 1 else { throw ReadError.malformedDependsOnDefinitionRecord }
self.defsNodeDependUpon.append(Int(record.fields[0]))
case .identifierNode:
guard record.fields.count == 0,
case .blob(let identifierBlob) = record.payload
else {
throw ReadError.malformedIdentifierRecord
}
identifiers.append(String(decoding: identifierBlob, as: UTF8.self).intern(in: internedStringTable))
}
}