Skip to content

Commit 8e64f1e

Browse files
authored
Add ids to second occurrence of a type within a dump (#60)
* Add ids to second occurrence of a type within a dump * Update logic * Cleanup * Update tests after rebase * Use # instead of <>
1 parent 8a93a47 commit 8e64f1e

File tree

2 files changed

+75
-32
lines changed

2 files changed

+75
-32
lines changed

Sources/CustomDump/Dump.swift

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public func customDump<T, TargetStream>(
5757
maxDepth: Int = .max
5858
) -> T where TargetStream: TextOutputStream {
5959

60+
var idPerItem: [ObjectIdentifier: UInt] = [:]
61+
var occurencePerType: [String: UInt] = [:]
6062
var visitedItems: Set<ObjectIdentifier> = []
6163

6264
func customDumpHelp<T, TargetStream>(
@@ -134,10 +136,21 @@ public func customDump<T, TargetStream>(
134136

135137
case let (value as AnyObject, .class?):
136138
let item = ObjectIdentifier(value)
139+
var occurence = occurencePerType[typeName(mirror.subjectType), default: 0] {
140+
didSet { occurencePerType[typeName(mirror.subjectType)] = occurence }
141+
}
142+
143+
var id: String {
144+
let id = idPerItem[item, default: occurence]
145+
idPerItem[item] = id
146+
147+
return id > 1 ? "#\(id)" : ""
148+
}
137149
if visitedItems.contains(item) {
138-
out.write("\(typeName(mirror.subjectType))(↩︎)")
150+
out.write("\(typeName(mirror.subjectType))\(id)(↩︎)")
139151
} else {
140152
visitedItems.insert(item)
153+
occurence += 1
141154
var children = Array(mirror.children)
142155

143156
var superclassMirror = mirror.superclassMirror
@@ -147,7 +160,7 @@ public func customDump<T, TargetStream>(
147160
}
148161
dumpChildren(
149162
of: Mirror(value, children: children),
150-
prefix: "\(typeName(mirror.subjectType))(",
163+
prefix: "\(typeName(mirror.subjectType))\(id)(",
151164
suffix: ")"
152165
)
153166
}

Tests/CustomDumpTests/DumpTests.swift

Lines changed: 60 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -824,23 +824,23 @@ final class DumpTests: XCTestCase {
824824
name: "Virginia",
825825
parent: DumpTests.Parent(↩︎)
826826
),
827-
[1]: DumpTests.Child(
827+
[1]: DumpTests.Child#2(
828828
name: "Ronald",
829829
parent: DumpTests.Parent(↩︎)
830830
),
831-
[2]: DumpTests.Child(
831+
[2]: DumpTests.Child#3(
832832
name: "Fred",
833833
parent: DumpTests.Parent(↩︎)
834834
),
835-
[3]: DumpTests.Child(
835+
[3]: DumpTests.Child#4(
836836
name: "George",
837837
parent: DumpTests.Parent(↩︎)
838838
),
839-
[4]: DumpTests.Child(
839+
[4]: DumpTests.Child#5(
840840
name: "Percy",
841841
parent: DumpTests.Parent(↩︎)
842842
),
843-
[5]: DumpTests.Child(
843+
[5]: DumpTests.Child#6(
844844
name: "Charles",
845845
parent: DumpTests.Parent(↩︎)
846846
)
@@ -853,40 +853,70 @@ final class DumpTests: XCTestCase {
853853
func testRepeatition() {
854854
class Human {
855855
let name = "John"
856+
}
857+
858+
class User: Human {
856859
let email = "[email protected]"
857860
let age = 97
861+
862+
let human: Human
863+
864+
init(human: Human) {
865+
self.human = human
866+
}
858867
}
859868

860869
let human = Human()
861870
let human2 = Human()
862871

872+
let user = User(human: human)
873+
let user2 = User(human: human2)
874+
863875
var dump = ""
864876
customDump(
865-
[
866-
human,
867-
human,
868-
human2,
869-
human2,
870-
], to: &dump)
871-
872-
XCTAssertNoDifference(
873-
dump,
874-
"""
875-
[
876-
[0]: DumpTests.Human(
877-
name: "John",
878-
879-
age: 97
880-
),
881-
[1]: DumpTests.Human(↩︎),
882-
[2]: DumpTests.Human(
883-
name: "John",
884-
885-
age: 97
886-
),
887-
[3]: DumpTests.Human(↩︎)
888-
]
889-
"""
877+
[
878+
human,
879+
human,
880+
human,
881+
human2,
882+
human2,
883+
human2,
884+
user,
885+
user,
886+
user,
887+
user2,
888+
user2,
889+
user2,
890+
], to: &dump)
891+
892+
XCTAssertNoDifference(
893+
dump,
894+
"""
895+
[
896+
[0]: DumpTests.Human(name: "John"),
897+
[1]: DumpTests.Human(↩︎),
898+
[2]: DumpTests.Human(↩︎),
899+
[3]: DumpTests.Human#2(name: "John"),
900+
[4]: DumpTests.Human#2(↩︎),
901+
[5]: DumpTests.Human#2(↩︎),
902+
[6]: DumpTests.User(
903+
name: "John",
904+
905+
age: 97,
906+
human: DumpTests.Human(↩︎)
907+
),
908+
[7]: DumpTests.User(↩︎),
909+
[8]: DumpTests.User(↩︎),
910+
[9]: DumpTests.User#2(
911+
name: "John",
912+
913+
age: 97,
914+
human: DumpTests.Human#2(↩︎)
915+
),
916+
[10]: DumpTests.User#2(↩︎),
917+
[11]: DumpTests.User#2(↩︎)
918+
]
919+
"""
890920
)
891921
}
892922

0 commit comments

Comments
 (0)