1
0
Fork 0

Fix signal @convention(c) missing -> Void return type

This commit is contained in:
Brendan Szymanski 2026-07-01 17:28:36 -04:00
parent 27edea19af
commit 39f0d97269
2 changed files with 21 additions and 2 deletions

View file

@ -27,7 +27,7 @@ extension CodeGenerator {
let detailClause = signal.isDetailed ? ", \"\(signal.name)\"" : ""
if signal.parameters.isEmpty {
let callbackReturn = inhibit ? " -> gboolean" : ""
let callbackReturn = inhibit ? " -> gboolean" : " -> Void"
let handlerCall = inhibit ? "let result = stored(); return result ? 1 : 0" : "stored()"
return """
public func connect\(signalName)(_ handler: @escaping () -> \(handlerReturnType)) -> Int {
@ -48,7 +48,7 @@ extension CodeGenerator {
let extractionExprs = signal.parameters.enumerated().map { i, p in
cSignalParameterExtraction(index: i, type: p.type)
}.joined(separator: ", ")
let callbackReturn = inhibit ? " -> gboolean" : ""
let callbackReturn = inhibit ? " -> gboolean" : " -> Void"
let handlerCall = inhibit
? "let result = stored(\(extractionExprs)); return result ? 1 : 0"
: "stored(\(extractionExprs))"

View file

@ -20,3 +20,22 @@ func testSignalWithParams() {
#expect(connection.contains("_: Int32"))
#expect(connection.contains("g_signal_connect_data"))
}
@Test("Non-inhibit signal generates correct @convention(c) with -> Void")
func testNonInhibitSignalConnection() {
let signal = Signal(name: "clicked", parameters: [], returnType: .void)
let code = CodeGenerator.generateSignalConnection(signal: signal, inhibit: false)
#expect(code.contains("-> Void"))
#expect(code.contains("@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void"))
}
@Test("Parameterized non-inhibit signal generates correct @convention(c)")
func testParameterizedNonInhibitSignalConnection() {
let signal = Signal(name: "size-allocate", parameters: [
Parameter(name: "width", type: .int32),
Parameter(name: "height", type: .int32),
], returnType: .void)
let code = CodeGenerator.generateSignalConnection(signal: signal, inhibit: false)
#expect(code.contains("-> Void"))
#expect(code.contains("@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void"))
}