diff --git a/Sources/CustomDump/Dump.swift b/Sources/CustomDump/Dump.swift index b98ae73..d413431 100644 --- a/Sources/CustomDump/Dump.swift +++ b/Sources/CustomDump/Dump.swift @@ -57,6 +57,8 @@ public func customDump( maxDepth: Int = .max ) -> T where TargetStream: TextOutputStream { + var idPerItem: [ObjectIdentifier: UInt] = [:] + var occurencePerType: [String: UInt] = [:] var visitedItems: Set = [] func customDumpHelp( @@ -134,10 +136,21 @@ public func customDump( case let (value as AnyObject, .class?): let item = ObjectIdentifier(value) + var occurence = occurencePerType[typeName(mirror.subjectType), default: 0] { + didSet { occurencePerType[typeName(mirror.subjectType)] = occurence } + } + + var id: String { + let id = idPerItem[item, default: occurence] + idPerItem[item] = id + + return id > 1 ? "#\(id)" : "" + } if visitedItems.contains(item) { - out.write("\(typeName(mirror.subjectType))(↩︎)") + out.write("\(typeName(mirror.subjectType))\(id)(↩︎)") } else { visitedItems.insert(item) + occurence += 1 var children = Array(mirror.children) var superclassMirror = mirror.superclassMirror @@ -147,7 +160,7 @@ public func customDump( } dumpChildren( of: Mirror(value, children: children), - prefix: "\(typeName(mirror.subjectType))(", + prefix: "\(typeName(mirror.subjectType))\(id)(", suffix: ")" ) } diff --git a/Tests/CustomDumpTests/DumpTests.swift b/Tests/CustomDumpTests/DumpTests.swift index 0649c49..a3a5444 100644 --- a/Tests/CustomDumpTests/DumpTests.swift +++ b/Tests/CustomDumpTests/DumpTests.swift @@ -824,23 +824,23 @@ final class DumpTests: XCTestCase { name: "Virginia", parent: DumpTests.Parent(↩︎) ), - [1]: DumpTests.Child( + [1]: DumpTests.Child#2( name: "Ronald", parent: DumpTests.Parent(↩︎) ), - [2]: DumpTests.Child( + [2]: DumpTests.Child#3( name: "Fred", parent: DumpTests.Parent(↩︎) ), - [3]: DumpTests.Child( + [3]: DumpTests.Child#4( name: "George", parent: DumpTests.Parent(↩︎) ), - [4]: DumpTests.Child( + [4]: DumpTests.Child#5( name: "Percy", parent: DumpTests.Parent(↩︎) ), - [5]: DumpTests.Child( + [5]: DumpTests.Child#6( name: "Charles", parent: DumpTests.Parent(↩︎) ) @@ -853,40 +853,70 @@ final class DumpTests: XCTestCase { func testRepeatition() { class Human { let name = "John" + } + + class User: Human { let email = "john@me.com" let age = 97 + + let human: Human + + init(human: Human) { + self.human = human + } } let human = Human() let human2 = Human() + let user = User(human: human) + let user2 = User(human: human2) + var dump = "" customDump( - [ - human, - human, - human2, - human2, - ], to: &dump) - - XCTAssertNoDifference( - dump, - """ - [ - [0]: DumpTests.Human( - name: "John", - email: "john@me.com", - age: 97 - ), - [1]: DumpTests.Human(↩︎), - [2]: DumpTests.Human( - name: "John", - email: "john@me.com", - age: 97 - ), - [3]: DumpTests.Human(↩︎) - ] - """ + [ + human, + human, + human, + human2, + human2, + human2, + user, + user, + user, + user2, + user2, + user2, + ], to: &dump) + + XCTAssertNoDifference( + dump, + """ + [ + [0]: DumpTests.Human(name: "John"), + [1]: DumpTests.Human(↩︎), + [2]: DumpTests.Human(↩︎), + [3]: DumpTests.Human#2(name: "John"), + [4]: DumpTests.Human#2(↩︎), + [5]: DumpTests.Human#2(↩︎), + [6]: DumpTests.User( + name: "John", + email: "john@me.com", + age: 97, + human: DumpTests.Human(↩︎) + ), + [7]: DumpTests.User(↩︎), + [8]: DumpTests.User(↩︎), + [9]: DumpTests.User#2( + name: "John", + email: "john@me.com", + age: 97, + human: DumpTests.Human#2(↩︎) + ), + [10]: DumpTests.User#2(↩︎), + [11]: DumpTests.User#2(↩︎) + ] + """ ) }