diff --git a/Sources/OpenAttributeGraphShims/Metadata+Debug.swift b/Sources/OpenAttributeGraphShims/Metadata+Debug.swift index 3686b22f..f1e38bfd 100644 --- a/Sources/OpenAttributeGraphShims/Metadata+Debug.swift +++ b/Sources/OpenAttributeGraphShims/Metadata+Debug.swift @@ -42,7 +42,7 @@ extension Metadata { switch kind { case .enum: write(&result, string: "enum \(type) {", level: level) - _ = forEachField(options: [.enumerateEnumCases]) { name, offset, type in // anything contains ._4 will work here + _ = forEachField(options: [.enumerateEnumCases]) { name, offset, type in let fieldName = String(cString: name) write(&result, string: "case \(fieldName)(\(type)) // offset = \(offset.hex)", level: level+1) if recursive { @@ -52,7 +52,7 @@ extension Metadata { } write(&result, string: "}", level: level) case .optional: - _ = forEachField(options: [.enumerateEnumCases]) { name, offset, type in // anything contains ._4 will work here + _ = forEachField(options: [.enumerateEnumCases]) { name, offset, type in let fieldName = String(cString: name) write(&result, string: "case \(fieldName)(\(type)) // offset = \(offset.hex)", level: level+1) if recursive { @@ -62,7 +62,7 @@ extension Metadata { } case .struct: write(&result, string: "struct \(type) {", level: level) - _ = forEachField(options: []) { name, offset, type in // only [] and [._2] will work here + _ = forEachField(options: [.continueAfterUnknownField]) { name, offset, type in let fieldName = String(cString: name) write(&result, string: "var \(fieldName): \(type) // offset = \(offset.hex)", level: level+1) if recursive { @@ -74,7 +74,7 @@ extension Metadata { case .tuple: break case .class: write(&result, string: "class \(type) {", level: level) - _ = forEachField(options: [.enumerateClassFields]) { name, offset, type in // anything contains ._1 will work here + _ = forEachField(options: [.enumerateClassFields, .continueAfterUnknownField]) { name, offset, type in let fieldName = String(cString: name) write(&result, string: "var \(fieldName): \(type) // offset = \(offset.hex)", level: level+1) diff --git a/Tests/OpenAttributeGraphShimsTests/MetadataDebugTests.swift b/Tests/OpenAttributeGraphShimsTests/MetadataDebugTests.swift index 99e50f6a..13eba849 100644 --- a/Tests/OpenAttributeGraphShimsTests/MetadataDebugTests.swift +++ b/Tests/OpenAttributeGraphShimsTests/MetadataDebugTests.swift @@ -5,6 +5,14 @@ @_spi(Debug) import OpenAttributeGraphShims import Testing +#if canImport(UIKit) +import UIKit +private typealias PlatformView = UIView +#elseif canImport(AppKit) +import AppKit +private typealias PlatformView = NSView +#endif + @Suite(.disabled(if: !attributeGraphEnabled, "forEachField is not implemented for OAG")) struct MetadataDebugTests { struct Demo1 { @@ -16,7 +24,7 @@ struct MetadataDebugTests { var a: Int = .zero var b: Double = .zero } - + @Test func layout() { #expect(Metadata(Demo1.self).layoutDescription == #""" @@ -35,5 +43,25 @@ struct MetadataDebugTests { """#) } - + + #if canImport(UIKit) || canImport(AppKit) + @Test + func unknownFields() { + class DemoView: PlatformView { + var a: Int = .zero + var b: Double = .zero + } + let layoutDescription = Metadata(DemoView.self).layoutDescription.split(separator: "\n").map(String.init) + #expect(layoutDescription[0] == "class DemoView {") + #expect(layoutDescription[1].contains("var a: Int // offset = ")) + #expect(layoutDescription[2].contains("var b: Double // offset = ")) + #expect(layoutDescription[3] == "}") + } + #endif +} + +extension Int { + fileprivate var hex: String { + "0x\(String(format:"%X", self))" + } }