mirror of
https://github.com/pointfreeco/swift-composable-architecture.git
synced 2025-12-20 09:11:33 +01:00
44 lines
1.5 KiB
Swift
44 lines
1.5 KiB
Swift
#if DEBUG
|
|
import os
|
|
import XCTestDynamicOverlay
|
|
|
|
// NB: Xcode runtime warnings offer a much better experience than traditional assertions and
|
|
// breakpoints, but Apple provides no means of creating custom runtime warnings ourselves.
|
|
// To work around this, we hook into SwiftUI's runtime issue delivery mechanism, instead.
|
|
//
|
|
// Feedback filed: https://gist.github.com/stephencelis/a8d06383ed6ccde3e5ef5d1b3ad52bbc
|
|
private let rw = (
|
|
dso: { () -> UnsafeMutableRawPointer in
|
|
let count = _dyld_image_count()
|
|
for i in 0..<count {
|
|
if let name = _dyld_get_image_name(i) {
|
|
let swiftString = String(cString: name)
|
|
if swiftString.hasSuffix("/SwiftUI") {
|
|
if let header = _dyld_get_image_header(i) {
|
|
return UnsafeMutableRawPointer(mutating: UnsafeRawPointer(header))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return UnsafeMutableRawPointer(mutating: #dsohandle)
|
|
}(),
|
|
log: OSLog(subsystem: "com.apple.runtime-issues", category: "ComposableArchitecture")
|
|
)
|
|
#endif
|
|
|
|
@_transparent
|
|
@inline(__always)
|
|
func runtimeWarning(
|
|
_ message: @autoclosure () -> StaticString,
|
|
_ args: @autoclosure () -> [CVarArg] = []
|
|
) {
|
|
#if DEBUG
|
|
let message = message()
|
|
unsafeBitCast(
|
|
os_log as (OSLogType, UnsafeRawPointer, OSLog, StaticString, CVarArg...) -> Void,
|
|
to: ((OSLogType, UnsafeRawPointer, OSLog, StaticString, [CVarArg]) -> Void).self
|
|
)(.fault, rw.dso, rw.log, message, args())
|
|
XCTFail(String(format: "\(message)", arguments: args()))
|
|
#endif
|
|
}
|