Skip to content

Commit b026a46

Browse files
committed
Update Testing
1 parent a63b6f6 commit b026a46

File tree

5 files changed

+72
-38
lines changed

5 files changed

+72
-38
lines changed

Sources/Demangle/Main/NodePrinter.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ package struct NodePrinter<Target: NodePrinterTarget>: Sendable {
199199
case .functionSignatureSpecialization: printSpecializationPrefix(name, description: "function signature specialization")
200200
case .functionSignatureSpecializationParam: printFunctionSignatureSpecializationParam(name)
201201
case .functionSignatureSpecializationParamKind: printFunctionSignatureSpecializationParamKind(name)
202-
case .functionSignatureSpecializationParamPayload: target.write((try? demangleAsNode(name.text ?? "").description) ?? (name.text ?? ""))
202+
case .functionSignatureSpecializationParamPayload: target.write((try? demangleAsNode(name.text ?? "").print(using: options)) ?? (name.text ?? ""))
203203
case .functionSignatureSpecializationReturn: printFunctionSignatureSpecializationParam(name)
204204
case .genericPartialSpecialization: printSpecializationPrefix(name, description: "generic partial specialization", paramPrefix: "Signature = ")
205205
case .genericPartialSpecializationNotReAbstracted: printSpecializationPrefix(name, description: "generic not-reabstracted partial specialization", paramPrefix: "Signature = ")
@@ -507,7 +507,7 @@ package struct NodePrinter<Target: NodePrinterTarget>: Sendable {
507507
}
508508

509509
private mutating func printMacro(name: Node, asPrefixContext: Bool, label: String) -> Node? {
510-
return printEntity(name, asPrefixContext: asPrefixContext, typePrinting: .noType, hasName: true, extraName: "\(label) macro @\(name.children.at(2)?.description ?? "") expansion #", extraIndex: (name.children.at(3)?.index ?? 0) + 1)
510+
return printEntity(name, asPrefixContext: asPrefixContext, typePrinting: .noType, hasName: true, extraName: "\(label) macro @\(name.children.at(2)?.print(using: options) ?? "") expansion #", extraIndex: (name.children.at(3)?.index ?? 0) + 1)
511511
}
512512

513513
private mutating func printAnonymousContext(_ name: Node) {
@@ -586,7 +586,7 @@ package struct NodePrinter<Target: NodePrinterTarget>: Sendable {
586586
.constantPropGlobal:
587587
_ = printOptional(name.children.at(idx), prefix: "[", suffix: " : ")
588588
guard let t = name.children.at(idx + 1)?.text else { return }
589-
let demangedName = (try? demangleAsNode(t))?.description ?? ""
589+
let demangedName = (try? demangleAsNode(t))?.print(using: options) ?? ""
590590
if demangedName.isEmpty {
591591
target.write(t)
592592
} else {

Sources/MachOExtensions/File+.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,13 @@ extension File {
99
}
1010
return try MachOKit.loadFromFile(url: url)
1111
}
12+
13+
package var machOFiles: [MachOFile] {
14+
switch self {
15+
case .machO(let machOFile):
16+
return [machOFile]
17+
case .fat(let fatFile):
18+
return (try? fatFile.machOFiles()) ?? []
19+
}
20+
}
1221
}

Sources/MachOTestingSupport/XcodeMachOFileName.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
package enum XcodeMachOFileName {
2-
package enum SharedFrameworks: String {
1+
package enum XcodeMachOFileName: CaseIterable {
2+
package enum SharedFrameworks: String, CaseIterable {
33
case AccessibilityAudit
44
case AccessibilitySupport
55
case AppResourceGeneration
@@ -226,7 +226,6 @@ package enum XcodeMachOFileName {
226226
case _CodeCompletionFoundation
227227
case kperfdataDT
228228
case ktraceDT
229-
case libXCTestSwiftSupport
230229
case llbuild
231230
package var pathComponent: String {
232231
"/SharedFrameworks/\(rawValue).framework"
@@ -245,4 +244,8 @@ package enum XcodeMachOFileName {
245244
return "\(contentsDirectory)\(framework.pathComponent)"
246245
}
247246
}
247+
248+
package static var allCases: [XcodeMachOFileName] {
249+
SharedFrameworks.allCases.map { .sharedFrameworks($0) }
250+
}
248251
}

Tests/MachOSwiftSectionTests/SymbolDemangleTests.swift

Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import MachOFoundation
88
@testable import MachOTestingSupport
99

1010
@Suite(.serialized)
11-
final class SymbolDemangleTests: DyldCacheTests {
11+
final class DyldCacheSymbolDemangleTests: DyldCacheTests {
1212
struct MachOSwiftSymbol {
1313
let imagePath: String
1414
let offset: Int
@@ -18,23 +18,23 @@ final class SymbolDemangleTests: DyldCacheTests {
1818
@MainActor
1919
@Test func symbols() throws {
2020
let allSwiftSymbols = try allSymbols()
21-
print("Total Swift Symbols: \(allSwiftSymbols.count)")
21+
"Total Swift Symbols: \(allSwiftSymbols.count)".print()
2222
for symbol in allSwiftSymbols {
2323
let swiftStdlibDemangledName = stdlib_demangleName(symbol.stringValue)
2424
do {
25-
guard !symbol.stringValue.hasSuffix("$delayInitStub") else { continue }
26-
var demangler = Demangler(scalars: symbol.stringValue.unicodeScalars)
27-
let node = try demangler.demangleSymbol()
25+
let node = try demangleAsNode(symbol.stringValue)
2826
let swiftSectionDemanlgedName = node.print()
2927
#expect(swiftStdlibDemangledName == swiftSectionDemanlgedName, "\(symbol.stringValue)")
3028
} catch {
3129
#expect(symbol.stringValue == swiftStdlibDemangledName)
30+
#if !SILENT_TEST
3231
print(symbol)
33-
print(error)
32+
#endif
33+
error.print()
3434
}
3535
}
3636
}
37-
37+
3838
#if !SILENT_TEST
3939
@Test func writeSwiftUISymbolsToDesktop() async throws {
4040
var string = ""
@@ -51,30 +51,13 @@ final class SymbolDemangleTests: DyldCacheTests {
5151
}
5252
try string.write(to: .desktopDirectory.appendingPathComponent("\(imageName.rawValue)-SwiftSymbols.txt"), atomically: true, encoding: .utf8)
5353
}
54-
#endif
55-
54+
5655
@Test func demangle() async throws {
5756
var demangler = Demangler(scalars: "_$s6Charts10ChartProxyV5value2at2asx_q_tSgSo7CGPointV_x_q_tmtAA9PlottableRzAaJR_r0_lF".unicodeScalars)
5857
let node = try demangler.demangleSymbol()
5958
node.print().print()
6059
}
61-
62-
@Test func swiftSymbols() async throws {
63-
let symbols = try symbols(for: .SwiftUI)
64-
for symbol in symbols {
65-
var demangler = Demangler(scalars: symbol.stringValue.unicodeScalars)
66-
let node = try demangler.demangleSymbol()
67-
if let functionNode = node.children.first, functionNode.kind == .function {
68-
if let structureNode = functionNode.children.first, structureNode.kind == .structure {
69-
node.print(using: .interface).print()
70-
let typeNode = Node(kind: .global) {
71-
Node(kind: .type, child: structureNode)
72-
}
73-
typeNode.print(using: .interface).print()
74-
}
75-
}
76-
}
77-
}
60+
#endif
7861

7962
private func symbols(for machOImageNames: MachOImageName...) throws -> [MachOSwiftSymbol] {
8063
var symbols: [MachOSwiftSymbol] = []
@@ -108,3 +91,48 @@ final class SymbolDemangleTests: DyldCacheTests {
10891
return symbols
10992
}
11093
}
94+
95+
@Suite(.serialized)
96+
final class XcodeMachOFilesSymbolDemangleTests {
97+
struct MachOSwiftSymbol {
98+
let imagePath: String
99+
let offset: Int
100+
let stringValue: String
101+
}
102+
103+
@MainActor
104+
@Test func symbols() throws {
105+
let allSwiftSymbols = try allSymbols()
106+
"Total Swift Symbols: \(allSwiftSymbols.count)".print()
107+
for symbol in allSwiftSymbols {
108+
let swiftStdlibDemangledName = stdlib_demangleName(symbol.stringValue)
109+
do {
110+
let node = try demangleAsNode(symbol.stringValue)
111+
let swiftSectionDemanlgedName = node.print()
112+
#expect(swiftStdlibDemangledName == swiftSectionDemanlgedName, "\(symbol.stringValue)")
113+
} catch {
114+
#expect(symbol.stringValue == swiftStdlibDemangledName)
115+
#if !SILENT_TEST
116+
print(symbol)
117+
#endif
118+
error.print()
119+
}
120+
}
121+
}
122+
123+
private func allSymbols() throws -> [MachOSwiftSymbol] {
124+
guard FileManager.default.fileExists(atPath: "/Applications/Xcode.app") else { return [] }
125+
var symbols: [MachOSwiftSymbol] = []
126+
for machOFile in try XcodeMachOFileName.allCases.compactMap({ try File.loadFromFile(url: .init(fileURLWithPath: $0.path)).machOFiles.first }) {
127+
for symbol in machOFile.symbols where symbol.name.isSwiftSymbol {
128+
symbols.append(MachOSwiftSymbol(imagePath: machOFile.imagePath, offset: symbol.offset, stringValue: symbol.name))
129+
}
130+
for symbol in machOFile.exportedSymbols where symbol.name.isSwiftSymbol {
131+
if let offset = symbol.offset {
132+
symbols.append(MachOSwiftSymbol(imagePath: machOFile.imagePath, offset: offset, stringValue: symbol.name))
133+
}
134+
}
135+
}
136+
return symbols
137+
}
138+
}

Tests/SwiftDumpTests/XcodeMachOFileDumpTests.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,4 @@ extension XcodeMachOFileDumpTests {
2626
@Test func associatedTypesInFile() async throws {
2727
try await dumpAssociatedTypes(for: machOFile)
2828
}
29-
30-
@Test func symbols() async throws {
31-
if let symbols: Symbols = try RelativeDirectPointer(relativeOffset: 2).resolve(from: 72870, in: machOFile) {
32-
print(symbols)
33-
}
34-
}
3529
}

0 commit comments

Comments
 (0)