Skip to content

Instantly share code, notes, and snippets.

@Azoy
Created March 14, 2020 17:43
Show Gist options
  • Save Azoy/f55b466aae70e14efe9a3bd1cee7315b to your computer and use it in GitHub Desktop.
Save Azoy/f55b466aae70e14efe9a3bd1cee7315b to your computer and use it in GitHub Desktop.
extension KeyPathObject: CustomStringConvertible {
public var description: String {
let components = self.components
assert(heapObject.metadata.kind == .class,
"KeyPath class object that's not a class?")
let classMetadata = heapObject.metadata as! ClassMetadata
assert(classMetadata.genericTypes.count == 2,
"KeyPath type without 2 generic types? Root and Leaf?")
let root = classMetadata.genericTypes[0]
guard components.allSatisfy({ $0.kind == .struct ||
$0.kind == .class }) else {
return "\(classMetadata.type)"
}
var currentRoot = reflect(root) as! TypeMetadata
var fields = currentRoot.contextDescriptor.fields
var fieldOffsets = currentRoot.fieldOffsets
var result = "\(root)."
for component in components {
for (i, fieldOffset) in fieldOffsets.enumerated() {
if component.storedOffset == fieldOffset {
let field = fields.records[i]
let fieldName = field.name
result += "\(fieldName)."
let fieldType = currentRoot.type(of: field.mangledTypeName)!
currentRoot = reflect(fieldType) as! TypeMetadata
fields = currentRoot.contextDescriptor.fields
fieldOffsets = currentRoot.fieldOffsets
}
}
}
result.removeLast()
return result
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment