Created
March 14, 2020 17:43
-
-
Save Azoy/f55b466aae70e14efe9a3bd1cee7315b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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