1
0
Fork 0

Generate typed public constructors for nullable string and borrowing cases

This commit is contained in:
Brendan Szymanski 2026-07-21 17:49:38 -04:00
parent 4f1016f682
commit d6fabd56ed
12 changed files with 601 additions and 1280 deletions

View file

@ -40,6 +40,8 @@ public enum MarshalIn: Equatable, Sendable {
case boolToGboolean
/// Convert `String` to a C string (`withCString` / `utf8` pointer).
case stringToC
/// Convert `[String]` to a NULL-terminated C `char **`.
case stringArrayToC
/// Access the underlying pointer of an object or interface wrapper.
case objectPointer
/// Access the underlying pointer of an interface-typed wrapper (a
@ -811,13 +813,24 @@ public struct ParameterPlan: Equatable, Sendable {
/// For callback-box params: the C arg index of the separate DestroyNotify
/// parameter. `nil` when none.
public let destroyIndex: Int?
/// When set, this C param is a synthesized array length (argc); its value is
/// `<name>.count` and it is omitted from the Swift signature.
public let synthesizedLengthOf: String?
public init(swiftName: String, cArgIndex: Int, mapping: Mapping,
isInstanceParameter: Bool = false, isOutParameter: Bool = false,
closureIndex: Int? = nil, destroyIndex: Int? = nil) {
closureIndex: Int? = nil, destroyIndex: Int? = nil,
synthesizedLengthOf: String? = nil) {
self.swiftName = swiftName; self.cArgIndex = cArgIndex
self.mapping = mapping; self.isInstanceParameter = isInstanceParameter
self.isOutParameter = isOutParameter
self.closureIndex = closureIndex; self.destroyIndex = destroyIndex
self.synthesizedLengthOf = synthesizedLengthOf
}
}
extension Mapping {
/// Maps a `[String]` parameter to a NULL-terminated C `char **` array.
static let stringArrayMapping = Mapping(
swiftType: "[String]", cSwiftType: "UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>?",
marshalIn: .stringArrayToC, marshalOut: .unsupported(reason: "C array return not yet bridged"))
}

View file

@ -347,6 +347,37 @@ private func renderSupport(moduleName: String, dependencyModules: [String] = [],
func _rawPointer(_ p: OpaquePointer) -> UnsafeMutableRawPointer {
UnsafeMutableRawPointer(p)
}
/// Copies a transfer-full C string into a Swift `String` and frees the source.
@inline(__always)
func _takeString(_ p: UnsafeMutablePointer<CChar>!) -> String {
defer { g_free(p) }
return String(cString: p)
}
/// Copies a nullable transfer-full C string, freeing the source; `nil` in `nil` out.
@inline(__always)
func _takeStringIfPresent(_ p: UnsafeMutablePointer<CChar>?) -> String? {
guard let p else { return nil }
defer { g_free(p) }
return String(cString: p)
}
/// Bridges an optional `String?` to a C `const char *`, passing `nil` when absent.
@inline(__always)
func _withOptionalCString<R>(_ s: String?, _ body: (UnsafePointer<CChar>?) throws -> R) rethrows -> R {
guard let s else { return try body(nil) }
return try s.withCString(body)
}
/// Bridges a `[String]` to a NULL-terminated C `char **`, freeing the copies after `body`.
@inline(__always)
func _withStringArray<R>(_ strings: [String], _ body: (UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>?) throws -> R) rethrows -> R {
var cStrings: [UnsafeMutablePointer<CChar>?] = strings.map { g_strdup($0) }
cStrings.append(nil)
defer { for p in cStrings { g_free(p) } }
return try cStrings.withUnsafeMutableBufferPointer { try body($0.baseAddress) }
}
\(glibError)\(gtypeConstants)\(closureBoxSupport)\(signalSupport)\(primitiveShims)
"""
}
@ -523,7 +554,7 @@ private func renderRecord(_ plan: RecordPlan) -> String {
if let doc = plan.doc {
lines.append(contentsOf: renderDocComment(doc))
}
lines.append("public final class \(plan.name) {")
lines.append("@MainActor public final class \(plan.name) {")
lines.append(" @_spi(SGTKInternal) public let pointer: UnsafeMutableRawPointer")
lines.append("")
if plan.freeFunction != nil {
@ -635,10 +666,10 @@ private func renderInterface(_ plan: InterfacePlan) -> String {
// `Self: \(classPrereq)` (a class-typed prerequisite), so the Ref
// must literally subclass it inheriting its pointer storage,
// inits, and deinit rather than declaring its own.
lines.append("public final class \(plan.name)Ref: \(classPrereq), @MainActor \(plan.name) {")
lines.append("@MainActor public final class \(plan.name)Ref: \(classPrereq), @MainActor \(plan.name) {")
lines.append("}")
} else {
lines.append("public final class \(plan.name)Ref: @MainActor \(plan.name) {")
lines.append("@MainActor public final class \(plan.name)Ref: @MainActor \(plan.name) {")
lines.append(" @_spi(SGTKInternal) public let pointer: UnsafeMutableRawPointer")
lines.append("")
lines.append(" @_spi(SGTKInternal) public init(retaining pointer: UnsafeMutableRawPointer) {")
@ -685,7 +716,7 @@ private func renderClass(_ plan: ClassPlan) -> String {
} else {
parentDecl = ""
}
lines.append("\(access) class \(plan.name)\(parentDecl) {")
lines.append("@MainActor \(access) class \(plan.name)\(parentDecl) {")
let isRoot = plan.parent == nil
@ -700,7 +731,7 @@ private func renderClass(_ plan: ClassPlan) -> String {
let needsInits = isRoot || !plan.isAbstract
if needsInits {
let initModifier = isRoot ? "" : "@_spi(SGTKInternal) public override "
let initModifier = isRoot ? "" : "@_spi(SGTKInternal) public "
// takingOwnership init
if isRoot {
@ -938,7 +969,7 @@ private func renderSignalConnect(_ plan: SignalPlan, className: String) -> [Stri
return lines
}
private func swiftSignature(_ plan: CallablePlan) -> String {
plan.parameters.filter { !$0.isInstanceParameter && !$0.isOutParameter }.map { param in
plan.parameters.filter { !$0.isInstanceParameter && !$0.isOutParameter && $0.synthesizedLengthOf == nil }.map { param in
let typeStr: String
if param.mapping.category == .callback {
typeStr = "@escaping \(param.mapping.swiftType)"
@ -949,6 +980,19 @@ private func swiftSignature(_ plan: CallablePlan) -> String {
}.joined(separator: ", ")
}
/// How a string/array parameter is wrapped for the C call.
private enum CWrapKind { case plain, optional, array }
/// Generates the closure opener for a string/array parameter: `withCString`,
/// `_withOptionalCString`, or `_withStringArray`.
private func cWrapOpener(_ cName: String, _ swiftName: String, _ kind: CWrapKind) -> String {
switch kind {
case .plain: return "\(swiftName).withCString { \(cName) in"
case .optional: return "_withOptionalCString(\(swiftName)) { \(cName) in"
case .array: return "_withStringArray(\(swiftName)) { \(cName) in"
}
}
/// Builds the C call: the C-function-call string with each argument marshalled,
/// plus the string parameters that must be wrapped in `withCString`. The
/// instance parameter if any is passed as `self.pointer`.
@ -956,13 +1000,11 @@ private func swiftSignature(_ plan: CallablePlan) -> String {
/// Callback-box parameters: the data pointer replaces the closure arg at the
/// callback's cArgIndex, and also replaces any separate user-data slot
/// identified by `closureIndex`.
private func cArguments(_ plan: CallablePlan, error: Bool = false) -> (cCall: String, stringParams: [(cName: String, swiftName: String)]) {
var stringParams: [(cName: String, swiftName: String)] = []
private func cArguments(_ plan: CallablePlan, error: Bool = false) -> (cCall: String, stringParams: [(cName: String, swiftName: String, kind: CWrapKind)]) {
var stringParams: [(cName: String, swiftName: String, kind: CWrapKind)] = []
var cArgExprs: [String] = []
var outIndex = 0
// Build map: closureIndex -> callback data ptr name, so separate user-data
// params get replaced with the box pointer.
var closureDataMap: [Int: String] = [:]
for p in plan.parameters {
if case .callbackBox(_, _) = p.mapping.marshalIn, let ci = p.closureIndex {
@ -977,9 +1019,16 @@ private func cArguments(_ plan: CallablePlan, error: Bool = false) -> (cCall: St
outIndex += 1
} else if param.isInstanceParameter {
cArgExprs.append("_instancePointer(self.pointer)")
} else if let arrName = param.synthesizedLengthOf {
cArgExprs.append("numericCast(\(arrName).count)")
} else if param.mapping.marshalIn == .stringToC {
let cName = "cString\(stringParams.count)"
stringParams.append((cName: cName, swiftName: param.swiftName))
let kind: CWrapKind = param.mapping.swiftType.hasSuffix("?") ? .optional : .plain
stringParams.append((cName: cName, swiftName: param.swiftName, kind: kind))
cArgExprs.append(cName)
} else if param.mapping.marshalIn == .stringArrayToC {
let cName = "cArray\(stringParams.count)"
stringParams.append((cName: cName, swiftName: param.swiftName, kind: .array))
cArgExprs.append(cName)
} else if let dataPtrName = closureDataMap[param.cArgIndex], !isCallbackBox(param) {
cArgExprs.append(dataPtrName)
@ -1071,11 +1120,10 @@ private func outParamInitValue(_ param: ParameterPlan) -> String {
case .enumRaw, .bitfieldRaw:
return ".init(rawValue: 0)"
default:
return "nil"
return "UnsafeMutablePointer<Int8>?"
}
}
/// Generates the expression that converts an out-param's C value to Swift.
/// `varName` is the local variable after the C call filled it in.
private func outParamValueExpr(_ param: ParameterPlan, varName: String) -> String {
switch param.mapping.marshalOut {
@ -1086,11 +1134,10 @@ private func outParamValueExpr(_ param: ParameterPlan, varName: String) -> Strin
case .gbooleanToBool:
return "\(varName) != 0"
case .stringCopy(let free, _):
let note = ""
if param.mapping.swiftType.hasSuffix("?") {
return "\(varName).map { String(cString: $0) }\(note)"
return free ? "_takeStringIfPresent(\(varName))" : "\(varName).map { String(cString: $0) }"
}
return "String(cString: \(varName)!)\(note)"
return free ? "_takeString(\(varName))" : "String(cString: \(varName)!)"
case .enumFromRaw(let swiftType):
return "\(swiftType)(rawValue: numericCast(\(varName).rawValue))!"
case .bitfieldFromRaw(let swiftType):
@ -1189,7 +1236,7 @@ private func renderMultiStatementBody(_ plan: CallablePlan, indent: String) -> [
var scope = indent
for sp in stringParams {
let openerPrefix = plan.throwsError ? "return try " : "return "
lines.append("\(scope)\(openerPrefix)\(sp.swiftName).withCString { \(sp.cName) in")
lines.append("\(scope)\(openerPrefix)\(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " "
}
for ld in localDecls {
@ -1219,7 +1266,7 @@ private func renderCallExpression(_ plan: CallablePlan) -> String {
let (cCall, stringParams) = cArguments(plan)
var expr = cCall
for sp in stringParams.reversed() {
expr = "\(sp.swiftName).withCString { \(sp.cName) in \(expr) }"
expr = "\(cWrapOpener(sp.cName, sp.swiftName, sp.kind)) \(expr) }"
}
return expr
}
@ -1269,7 +1316,7 @@ private func renderCallBody(_ plan: CallablePlan, indent: String) -> [String] {
var scope = indent
let openerPrefix = hasReturn ? "return " : ""
for sp in stringParams {
lines.append("\(scope)\(openerPrefix)\(sp.swiftName).withCString { \(sp.cName) in")
lines.append("\(scope)\(openerPrefix)\(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " "
}
for stmt in setupStmts {
@ -1331,7 +1378,7 @@ private func renderThrowingBody(_ plan: CallablePlan, indent: String) -> [String
var lines: [String] = []
var scope = indent
for sp in stringParams {
lines.append("\(scope)return try \(sp.swiftName).withCString { \(sp.cName) in")
lines.append("\(scope)return try \(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " "
}
for stmt in setupStmts {
@ -1419,8 +1466,9 @@ private func renderStaticFunction(_ plan: CallablePlan) -> [String] {
}
/// Renders a constructor as a `convenience init`. The C constructor's returned
/// instance pointer is adopted through the designated `init(takingOwnership:)`,
/// which sinks a floating reference for `InitiallyUnowned` descendants.
/// instance pointer is adopted through the designated `init(takingOwnership:)`
/// or `init(retaining:)`, depending on the GIR `transfer-ownership` annotation
/// on the constructor's return value.
private func renderConstructor(_ plan: CallablePlan) -> [String] {
var lines: [String] = []
if let doc = plan.doc { lines.append(contentsOf: renderDocComment(doc).map { " \($0)" }) }
@ -1441,14 +1489,14 @@ private func renderConstructor(_ plan: CallablePlan) -> [String] {
lines.append("\(indent)var error: UnsafeMutablePointer<GError>? = nil")
lines.append("\(indent)let _ptr = \(cCall)")
lines.append(contentsOf: errorCheck)
lines.append("\(indent)self.init(takingOwnership: _rawPointer(_ptr!))")
lines.append("\(indent)\(ownInitCall(plan, "_rawPointer(_ptr!)"))")
} else {
lines.append("\(indent)var error: UnsafeMutablePointer<GError>? = nil")
var scope = indent
for i in stringParams.indices {
let sp = stringParams[i]
let prefix = i == 0 ? "let _result = " : ""
lines.append("\(scope)\(prefix)\(sp.swiftName).withCString { \(sp.cName) in")
lines.append("\(scope)\(prefix)\(cWrapOpener(sp.cName, sp.swiftName, sp.kind))")
scope += " "
}
// `self.init` (a delegating initializer call) cannot be nested
@ -1465,17 +1513,31 @@ private func renderConstructor(_ plan: CallablePlan) -> [String] {
lines.append("\(scope)}")
}
lines += errorCheck
lines.append("\(indent)self.init(takingOwnership: _rawPointer(_result!))")
lines.append("\(indent)\(ownInitCall(plan, "_rawPointer(_result!)"))")
}
} else {
let expr = renderCallExpression(plan)
lines.append(" self.init(takingOwnership: _rawPointer(\(expr)))")
lines.append(" \(ownInitCall(plan, "_rawPointer(\(expr))"))")
}
lines.append(" }")
return lines
}
/// Selects `init(takingOwnership:)` or `init(retaining:)` based on the
/// constructor's ownership annotation from GIR.
private func ownInitCall(_ plan: CallablePlan, _ pointerExpr: String) -> String {
// ownershipInit is nil for non-constructor callables; default to takingOwnership.
switch plan.ownershipInit {
case .takingOwnership?, .sinkingRef?:
return "self.init(takingOwnership: \(pointerExpr))"
case .retaining?:
return "self.init(retaining: \(pointerExpr))"
case nil:
return "self.init(takingOwnership: \(pointerExpr))"
}
}
/// Generates the argument expression for a callable parameter.
private func marshalCallArg(_ param: ParameterPlan) -> String {
switch param.mapping.marshalIn {
@ -1498,6 +1560,8 @@ private func marshalCallArg(_ param: ParameterPlan) -> String {
return "\(param.swiftName) ? 1 : 0"
case .stringToC:
return param.swiftName
case .stringArrayToC:
return param.swiftName
case .objectPointer, .interfacePointer:
return pointerArg(param)
case .boxedPointer:
@ -1533,11 +1597,14 @@ private func marshalReturn(_ cCall: String, mapping: Mapping) -> String {
return "numericCast(\(cCall))"
case .gbooleanToBool:
return "\(cCall) != 0"
case .stringCopy(_, _):
if mapping.swiftType.hasSuffix("?") {
return "\(cCall).map { String(cString: $0) }"
case .stringCopy(let free, _):
let optional = mapping.swiftType.hasSuffix("?")
switch (free, optional) {
case (true, false): return "_takeString(\(cCall))"
case (true, true): return "_takeStringIfPresent(\(cCall))"
case (false, false): return "String(cString: \(cCall))"
case (false, true): return "\(cCall).map { String(cString: $0) }"
}
return "String(cString: \(cCall))"
case .objectWrap:
let isOptional = mapping.swiftType.hasSuffix("?")
let baseType = isOptional ? String(mapping.swiftType.dropLast()) : mapping.swiftType
@ -1724,8 +1791,24 @@ private func gvalueSetterBody(swiftType: String, girName: String,
"g_value_unset(&gvalue)",
]
}
private func renderDocComment(_ text: String) -> [String] {
text.components(separatedBy: "\n").map { "/// \($0)" }
convertGtkDocToDocC(text).components(separatedBy: "\n").map { "/// \($0)" }
}
/// Converts raw gtk-doc markup to DocC-compatible Markdown:
/// - `|[<!-- language="C" -->` fences code blocks
/// - `#Type`, `%CONST`, `@param` `` `backtick` `` references
/// - `%TRUE`, `%FALSE`, `%NULL` `` `true` ``, `` `false` ``, `` `nil` ``
private func convertGtkDocToDocC(_ text: String) -> String {
var s = text
s = s.replacing(/\|\[(<!--.*?-->)?/, with: "```")
s = s.replacing(/\]\|/, with: "```")
s = s.replacingOccurrences(of: "%TRUE", with: "`true`")
s = s.replacingOccurrences(of: "%FALSE", with: "`false`")
s = s.replacingOccurrences(of: "%NULL", with: "`nil`")
s = s.replacing(/[#%@]([A-Za-z_][A-Za-z0-9_]*)/) { "`\($0.1)`" }
return s
}
/// Converts a raw GIR bitfield value string to a Swift `UInt32` literal.

View file

@ -77,7 +77,7 @@ public func planModules(
// labels AND types, a different selector, no relation to include).
func methodSignature(_ m: CallablePlan) -> String {
let params = m.parameters
.filter { !$0.isInstanceParameter && !$0.isOutParameter }
.filter { !$0.isInstanceParameter && !$0.isOutParameter && $0.synthesizedLengthOf == nil }
.map { "\($0.swiftName):\($0.mapping.swiftType)" }
.joined(separator: ",")
return "\(m.name)|throws:\(m.throwsError)|(\(params))"
@ -350,7 +350,7 @@ private func planNamespace(_ ns: Namespace, context: MapContext) -> ModulePlan {
private func signatureKey(_ plan: CallablePlan) -> String {
let retType = plan.returnMapping?.swiftType ?? "Void"
let params = plan.parameters
.filter { !$0.isInstanceParameter && !$0.isOutParameter }
.filter { !$0.isInstanceParameter && !$0.isOutParameter && $0.synthesizedLengthOf == nil }
.map { "\($0.swiftName):\($0.mapping.swiftType)" }
.joined(separator: ",")
return "throws:\(plan.throwsError)|ret:\(retType)|(\(params))"
@ -606,7 +606,7 @@ private let knownMissingCFunctions: Set<String> = [
"g_settings_backend_changed", "g_settings_backend_changed_tree",
"g_settings_backend_get_default", "g_settings_backend_path_changed",
"g_settings_backend_path_writable_changed", "g_settings_backend_writable_changed",
"g_null_settings_backend_new", "g_memory_settings_backend_new",
"g_null_settings_backend_new", "g_memory_settings_backend_new", "g_keyfile_settings_backend_new",
// Declared in <gio/gnetworking.h>, likewise excluded from <gio/gio.h>.
"g_networking_init",
// Declared in the GdkPixbuf GIR but not exported through the public
@ -1438,11 +1438,29 @@ func planConstructor(_ ctor: Constructor, className: String, descendsIU: Bool, c
reason: .constructorOutParams,
detail: "out-param constructors are not expressible as Swift init"))
}
// Derive ownership from the GIR return's transfer-ownership annotation.
// Most GObject _new constructors return transfer-ownership="full"
// (or a floating reference for InitiallyUnowned descendants). A
// transfer-ownership="none" return indicates a borrowed reference,
// which the convenience init must wrap via init(retaining:) instead
// of init(takingOwnership:).
//
// CRITICAL: descendsIU takes precedence over the GIR annotation because
// most widget constructors declare transfer-ownership="none" even though
// they return a *floating* reference that must be sunk, not borrowed.
let ownership: OwnershipInit
if descendsIU {
ownership = .sinkingRef
} else if ctor.returnValue.transferOwnership == .none {
ownership = .retaining
} else {
ownership = .takingOwnership
}
return .success(CallablePlan(
name: swiftFunctionName(ctor.name), cIdentifier: ctor.cIdentifier,
parameters: paramPlans, returnMapping: nil,
isStatic: false, isConstructor: true,
ownershipInit: descendsIU ? .sinkingRef : .takingOwnership,
ownershipInit: ownership,
throwsError: ctor.throwsGError, doc: ctor.doc))
}
@ -1456,6 +1474,17 @@ func planParameters(
// These are plain gpointer params that would otherwise fail the pointer
// check the callback-box mechanism handles them.
let closureTargets = Set(parameters.compactMap(\.closureIndex))
// Pre-scan length parameters for C arrays of strings (e.g. argc for argv).
// Map the length param's position to the array's Swift name.
let hasInstance = parameters.contains(where: \.isInstanceParameter)
var lengthElision: [Int: String] = [:]
for p in parameters {
if case .cArray(let el, let info) = p.type,
el == .string || el == .filename,
let li = info.lengthParameterIndex {
lengthElision[li + (hasInstance ? 1 : 0)] = swiftParameterName(p.name)
}
}
for (index, param) in parameters.enumerated() {
// The instance parameter is always `self` passed as `self.pointer`,
// never type-checked (its type is the enclosing class, which is a
@ -1532,6 +1561,23 @@ func planParameters(
return .skip(SkipEntry(symbol: "", cIdentifier: nil,
reason: .inoutParameter, detail: "'\(param.name)' has direction=inout"))
}
// Intercept length params (argc) synthesize from array's count.
if let arrName = lengthElision[index] {
plans.append(ParameterPlan(
swiftName: swiftParameterName(param.name), cArgIndex: index,
mapping: Mapping(swiftType: "Int", cSwiftType: "", marshalIn: .direct, marshalOut: .direct),
synthesizedLengthOf: arrName))
continue
}
// Intercept C arrays of strings with a known length param [String].
if case .cArray(let el, let info) = param.type,
el == .string || el == .filename, info.lengthParameterIndex != nil {
plans.append(ParameterPlan(
swiftName: swiftParameterName(param.name), cArgIndex: index,
mapping: .stringArrayMapping))
continue
}
// Map the type
let mappingResult = Result { try map(param.type, nullable: param.isNullable,
@ -1550,11 +1596,6 @@ func planParameters(
}
let isString = paramMapping.marshalIn == .stringToC
// A nullable string needs an optional-aware bridge; deferred.
if isString && paramMapping.swiftType.hasSuffix("?") {
return .skip(SkipEntry(symbol: "", cIdentifier: nil,
reason: .unknownType, detail: "parameter '\(param.name)' is a nullable string"))
}
// Only a single-level `const gchar*` input string can be bridged
// from an immutable Swift `String` via `withCString`. A mutable
// `gchar*` is a caller-allocated output buffer, and a `gchar**`

View file

@ -62,8 +62,8 @@ struct InterfaceSignalGenerationTests {
// pattern as class signals) this is the D4.2 regression check:
// the previous implementation planned interface signals but the
// renderer silently dropped them.
#expect(source.contains("@_cdecl(\"_trampoline_GObject_Clickable_clicked\")"))
#expect(source.contains("nonisolated func _trampoline_GObject_Clickable_clicked("))
#expect(source.contains("@_cdecl(\"_trampolineGObjectClickableClicked\")"))
#expect(source.contains("nonisolated func _trampolineGObjectClickableClicked("))
#expect(source.contains("MainActor.assumeIsolated"))
}

View file

@ -107,7 +107,7 @@ struct PropertyGenerationTests {
#expect(skips.isEmpty)
#expect(plan.properties.count == 1)
#expect(source.contains("public var length: Int32"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_INT)"))
#expect(source.contains("g_value_init(&gvalue, gTypeInt)"))
#expect(source.contains("g_value_get_int(&gvalue)"))
#expect(source.contains("g_object_get_property(_instancePointer(pointer), \"length\", &gvalue)"))
// Read-only: no setter.
@ -186,7 +186,7 @@ struct PropertyGenerationTests {
#expect(skips.isEmpty)
#expect(plan.properties.count == 1)
#expect(source.contains("public var orientation: Orientation"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_ENUM)"))
#expect(source.contains("g_value_init(&gvalue, gTypeEnum)"))
// `g_value_get_enum` returns Int32; the enum's raw value is Int, so the
// result MUST be numericCast a bare cast would not compile.
#expect(source.contains("Orientation(rawValue: numericCast(g_value_get_enum(&gvalue)))!"))
@ -201,7 +201,7 @@ struct PropertyGenerationTests {
let (source, _, skips) = renderClass(named: "Widget", properties: [prop])
#expect(skips.isEmpty)
#expect(source.contains("public var stateFlags: StateFlags"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_FLAGS)"))
#expect(source.contains("g_value_init(&gvalue, gTypeFlags)"))
#expect(source.contains("StateFlags(rawValue: numericCast(g_value_get_flags(&gvalue)))"))
}
@ -215,7 +215,7 @@ struct PropertyGenerationTests {
let (source, _, skips) = renderClass(named: "Bin", properties: [prop])
#expect(skips.isEmpty)
#expect(source.contains("public var child: Object"))
#expect(source.contains("g_value_init(&gvalue, G_TYPE_OBJECT)"))
#expect(source.contains("g_value_init(&gvalue, gTypeObject)"))
#expect(source.contains("Object(retaining: g_value_get_object(&gvalue))"))
}
@ -379,7 +379,7 @@ struct PropertyGenerationTests {
if case .gvalue = plan.properties[0].getter {} else {
Issue.record("expected GValue fallback, got \(plan.properties[0].getter)")
}
#expect(source.contains("g_value_init(&gvalue, G_TYPE_ENUM)"))
#expect(source.contains("g_value_init(&gvalue, gTypeEnum)"))
#expect(source.contains("numericCast(g_value_get_enum(&gvalue))"))
}

View file

@ -367,4 +367,106 @@ struct RendererCallableTests {
#expect(!content.contains("import Foundation"), "\(name) unexpectedly imports Foundation")
}
}
// MARK: - E3: nullable string constructor params
@Test("Constructor with nullable string parameter generates String? and _withOptionalCString")
func nullableStringConstructorParam() throws {
let klass = Class(
name: "Alert", cType: "GAlert", parent: "Object",
getTypeFunction: "g_alert_get_type",
constructors: [
Constructor(name: "new", cIdentifier: "g_alert_new",
parameters: [
Parameter(name: "message", type: .string,
cType: "const char*", isNullable: true),
],
returnValue: ReturnValue(transferOwnership: .full)),
]
)
let (plan, _) = planClass(klass, context: makeContext())
let module = ModulePlan(module: "GObject", types: [.class(plan)], skips: [],
coverage: CoverageStats())
let src = renderModule(module)["Alert.swift"] ?? ""
// The signature must show String? for the nullable string parameter.
#expect(src.contains("convenience init(message: String?)"))
// The body wraps the nullable param with _withOptionalCString.
#expect(src.contains("_withOptionalCString(message)"))
// The convenience init must NOT be SPI-gated (check the init line is not preceded by @_spi).
let initLines = src.components(separatedBy: "\n")
let convenienceLines = initLines.filter { $0.contains("convenience init") }
#expect(!convenienceLines.isEmpty, "expected a convenience init line")
for line in convenienceLines {
#expect(!line.contains("@_spi"), "convenience init should not be SPI-gated, got: \(line)")
}
// Uses takingOwnership for transfer-ownership="full".
if !src.contains("self.init(takingOwnership:") {
Issue.record("expected self.init(takingOwnership:) for transfer-ownership=full")
}
}
@Test("Constructor with mixed nullable and required string params generates correct bridging")
func constructorWithMixedNullableAndRequiredParams() throws {
let klass = Class(
name: "Dialog", cType: "GAlertDialog", parent: "Object",
getTypeFunction: "g_alert_dialog_get_type",
constructors: [
Constructor(name: "new", cIdentifier: "g_alert_dialog_new",
parameters: [
Parameter(name: "heading", type: .string,
cType: "const char*", isNullable: true),
Parameter(name: "body", type: .string,
cType: "const char*"),
],
returnValue: ReturnValue(transferOwnership: .full)),
]
)
let (plan, _) = planClass(klass, context: makeContext())
let module = ModulePlan(module: "GObject", types: [.class(plan)], skips: [],
coverage: CoverageStats())
let src = renderModule(module)["Dialog.swift"] ?? ""
// The signature must show String? for the nullable param and String for the required param.
#expect(src.contains("convenience init(heading: String?, body: String)"))
// The nullable param gets _withOptionalCString, the required param gets .withCString.
#expect(src.contains("_withOptionalCString(heading)"))
#expect(src.contains("body.withCString"))
// The convenience init line must NOT be SPI-gated (the class file has SPI-gated
// designated inits, but the convenience init itself is public).
let initLines2 = src.components(separatedBy: "\n")
let convenienceLines2 = initLines2.filter { $0.contains("convenience init") }
#expect(!convenienceLines2.isEmpty, "expected a convenience init line")
for line in convenienceLines2 {
#expect(!line.contains("@_spi"), "convenience init should not be SPI-gated, got: \(line)")
}
}
// MARK: - E3: constructor borrowing ownership
@Test("Constructor with ownership .none return generates convenience init calling self.init(retaining:)")
func constructorBorrowedReturnUsesRetaining() throws {
let klass = Class(
name: "Borrowed", cType: "GBorrowed", parent: "Object",
getTypeFunction: "g_borrowed_get_type",
constructors: [
Constructor(name: "new", cIdentifier: "g_borrowed_new",
parameters: [
Parameter(name: "name", type: .string,
cType: "const char*"),
],
returnValue: ReturnValue(transferOwnership: .none)),
]
)
let (plan, _) = planClass(klass, context: makeContext())
let module3 = ModulePlan(module: "GObject", types: [.class(plan)], skips: [],
coverage: CoverageStats())
let src = renderModule(module3)["Borrowed.swift"] ?? ""
#expect(src.contains("self.init(retaining:"), "expected self.init(retaining:) for transfer-ownership=none, got: \(src)")
#expect(!src.contains("self.init(takingOwnership:"), "should NOT use init(takingOwnership:) for transfer-ownership=none")
// The convenience init line must NOT be SPI-gated.
let initLines3 = src.components(separatedBy: "\n")
let convenienceLines3 = initLines3.filter { $0.contains("convenience init") }
for line in convenienceLines3 {
#expect(!line.contains("@_spi"), "convenience init should not be SPI-gated, got: \(line)")
}
}
}

View file

@ -80,8 +80,8 @@ struct SignalGenerationTests {
let (source, plan, skips) = renderClass(named: "Object", signals: [notify])
#expect(skips.isEmpty)
#expect(plan.signals.count == 1)
#expect(source.contains("@_cdecl(\"_trampoline_GObject_Object_notify\")"))
#expect(source.contains("nonisolated func _trampoline_GObject_Object_notify("))
#expect(source.contains("@_cdecl(\"_trampolineGObjectObjectNotify\")"))
#expect(source.contains("nonisolated func _trampolineGObjectObjectNotify("))
#expect(source.contains("_ instance: UnsafeMutableRawPointer"))
#expect(source.contains("_ data: UnsafeMutableRawPointer?"))
// Body re-enters MainActor before touching the raw pointers.
@ -123,12 +123,12 @@ struct SignalGenerationTests {
// The destroy closure matches GClosureNotify's 2-arg C signature
// (gpointer data, GClosure *closure) not GDestroyNotify's 1-arg form.
#expect(source.contains("@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void"))
#expect(source.contains("_sgtk_destroy_notify_impl(data, nil)"))
#expect(source.contains("_sgtkDestroyNotifyImpl(data, nil)"))
// The wired destroy arg is passed (non-nil) to the connect call
// the D3 leak regression this test guards against.
#expect(source.contains("unsafeBitCast(destroyFn as (@convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Void), to: UnsafeRawPointer.self)"))
#expect(source.contains("_sgtk_signal_connect_data("))
#expect(!source.contains("_sgtk_signal_connect_data(ptr, cName, unsafeBitCast(\\(plan.trampolineCName)"))
#expect(source.contains("_sgtkSignalConnectData("))
#expect(!source.contains("_sgtkSignalConnectData(ptr, cName, unsafeBitCast(\\(plan.trampolineCName)"))
}
@Test("Support.swift hides GLibError.init(consuming:), SignalHandle.instance/init, and _sgtk_* helpers behind @_spi(SGTKInternal)")
@ -143,9 +143,9 @@ struct SignalGenerationTests {
let support = renderModule(module)["Support.swift"] ?? ""
#expect(support.contains("@_spi(SGTKInternal) public let instance: UnsafeMutableRawPointer"))
#expect(support.contains("@_spi(SGTKInternal) public init(id: UInt, instance: UnsafeMutableRawPointer)"))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtk_destroy_notify_impl("))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtk_signal_connect_data("))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtk_signal_handler_disconnect("))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtkDestroyNotifyImpl("))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtkSignalConnectData("))
#expect(support.contains("@_spi(SGTKInternal) public nonisolated func _sgtkSignalHandlerDisconnect("))
// SignalHandle itself and its id/disconnect() stay plain public only
// the raw-pointer members are hidden.
#expect(support.contains("public struct SignalHandle {"))

View file

@ -900,12 +900,6 @@
"reason" : "deprecatedRemoved",
"symbol" : "GLib.byte_array_unref"
},
{
"cIdentifier" : "g_canonicalize_filename",
"detail" : "parameter 'relative_to' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.canonicalize_filename"
},
{
"cIdentifier" : "g_chdir",
"detail" : "C symbol 'g_chdir' is not exported by the system library",
@ -1182,42 +1176,12 @@
"reason" : "deprecatedRemoved",
"symbol" : "GLib.date_valid_year"
},
{
"cIdentifier" : "g_dcgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dcgettext"
},
{
"cIdentifier" : "g_dgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dgettext"
},
{
"cIdentifier" : "g_dir_make_tmp",
"detail" : "deprecatedRemoved",
"reason" : "deprecatedRemoved",
"symbol" : "GLib.dir_make_tmp"
},
{
"cIdentifier" : "g_dngettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dngettext"
},
{
"cIdentifier" : "g_dpgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext"
},
{
"cIdentifier" : "g_dpgettext2",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext2"
},
{
"cIdentifier" : "g_environ_getenv",
"detail" : "parameter 'envp': C array bridging not yet implemented",
@ -1254,12 +1218,6 @@
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_get_contents"
},
{
"cIdentifier" : "g_file_open_tmp",
"detail" : "parameter 'tmpl' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.file_open_tmp"
},
{
"cIdentifier" : "g_file_set_contents",
"detail" : "parameter 'contents': C array bridging not yet implemented",
@ -1272,12 +1230,6 @@
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_set_contents_full"
},
{
"cIdentifier" : "g_filename_to_uri",
"detail" : "parameter 'hostname' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.filename_to_uri"
},
{
"cIdentifier" : "g_fopen",
"detail" : "C symbol 'g_fopen' is not exported by the system library",
@ -1584,18 +1536,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.idle_add_once"
},
{
"cIdentifier" : "g_intern_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_static_string"
},
{
"cIdentifier" : "g_intern_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_string"
},
{
"cIdentifier" : "g_io_add_watch",
"detail" : "shadowedSymbol",
@ -1662,12 +1602,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.log"
},
{
"cIdentifier" : "g_log_default_handler",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_default_handler"
},
{
"cIdentifier" : "g_log_set_default_handler",
"detail" : "notIntrospectable",
@ -1682,8 +1616,8 @@
},
{
"cIdentifier" : "g_log_set_handler_full",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"detail" : "callback param 'log_func' deferred to Phase D4.3",
"reason" : "callbackWithoutUserData",
"symbol" : "GLib.log_set_handler_full"
},
{
@ -1710,12 +1644,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.log_structured_standard"
},
{
"cIdentifier" : "g_log_variant",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_variant"
},
{
"cIdentifier" : "g_log_writer_default",
"detail" : "parameter 'fields': C array bridging not yet implemented",
@ -1724,16 +1652,10 @@
},
{
"cIdentifier" : "g_log_writer_default_set_debug_domains",
"detail" : "parameter 'domains' is a nullable string",
"detail" : "parameter 'domains' is not a single const input string ('const gchar* const*')",
"reason" : "unknownType",
"symbol" : "GLib.log_writer_default_set_debug_domains"
},
{
"cIdentifier" : "g_log_writer_default_would_drop",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_writer_default_would_drop"
},
{
"cIdentifier" : "g_log_writer_format_fields",
"detail" : "parameter 'fields': C array bridging not yet implemented",
@ -1872,12 +1794,6 @@
"reason" : "unknownType",
"symbol" : "GLib.nullify_pointer"
},
{
"cIdentifier" : "g_on_error_stack_trace",
"detail" : "parameter 'prg_name' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.on_error_stack_trace"
},
{
"cIdentifier" : "g_once_init_enter",
"detail" : "deprecatedRemoved",
@ -1916,8 +1832,8 @@
},
{
"cIdentifier" : "g_parse_debug_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'keys': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.parse_debug_string"
},
{
@ -2058,24 +1974,6 @@
"reason" : "callbackWithoutUserData",
"symbol" : "GLib.qsort_with_data"
},
{
"cIdentifier" : "g_quark_from_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_static_string"
},
{
"cIdentifier" : "g_quark_from_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_string"
},
{
"cIdentifier" : "g_quark_try_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_try_string"
},
{
"cIdentifier" : "g_rc_box_release_full",
"detail" : "callback param 'clear_func' deferred to Phase D4.3",
@ -2336,26 +2234,26 @@
},
{
"cIdentifier" : "g_spawn_async",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async"
},
{
"cIdentifier" : "g_spawn_async_with_fds",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_fds"
},
{
"cIdentifier" : "g_spawn_async_with_pipes",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes"
},
{
"cIdentifier" : "g_spawn_async_with_pipes_and_fds",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes_and_fds"
},
{
@ -2366,8 +2264,8 @@
},
{
"cIdentifier" : "g_spawn_sync",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_sync"
},
{
@ -2388,16 +2286,10 @@
"reason" : "unknownType",
"symbol" : "GLib.stpcpy"
},
{
"cIdentifier" : "g_str_to_ascii",
"detail" : "parameter 'from_locale' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.str_to_ascii"
},
{
"cIdentifier" : "g_str_tokenize_and_fold",
"detail" : "parameter 'translit_locale' is a nullable string",
"reason" : "unknownType",
"detail" : "out-param 'ascii_alternates': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.str_tokenize_and_fold"
},
{
@ -2418,12 +2310,6 @@
"reason" : "unknownType",
"symbol" : "GLib.strchug"
},
{
"cIdentifier" : "g_strcmp0",
"detail" : "parameter 'str1' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strcmp0"
},
{
"cIdentifier" : "g_strconcat",
"detail" : "notIntrospectable",
@ -2442,12 +2328,6 @@
"reason" : "unknownType",
"symbol" : "GLib.strdown"
},
{
"cIdentifier" : "g_strdup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strdup"
},
{
"cIdentifier" : "g_strdup_printf",
"detail" : "notIntrospectable",
@ -2466,12 +2346,6 @@
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strdupv"
},
{
"cIdentifier" : "g_strescape",
"detail" : "parameter 'exceptions' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strescape"
},
{
"cIdentifier" : "g_strfreev",
"detail" : "parameter 'str_array': C array bridging not yet implemented",
@ -2486,8 +2360,8 @@
},
{
"cIdentifier" : "g_strjoinv",
"detail" : "parameter 'separator' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strjoinv"
},
{
@ -2502,12 +2376,6 @@
"reason" : "unknownType",
"symbol" : "GLib.strlcpy"
},
{
"cIdentifier" : "g_strndup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strndup"
},
{
"cIdentifier" : "g_strreverse",
"detail" : "parameter 'string' is not a single const input string ('gchar*')",
@ -2598,12 +2466,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.test_create_suite"
},
{
"cIdentifier" : "g_test_expect_message",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_expect_message"
},
{
"cIdentifier" : "g_test_fail_printf",
"detail" : "notIntrospectable",
@ -2622,12 +2484,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.test_get_root"
},
{
"cIdentifier" : "g_test_incomplete",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_incomplete"
},
{
"cIdentifier" : "g_test_incomplete_printf",
"detail" : "notIntrospectable",
@ -2676,28 +2532,16 @@
"reason" : "plainRecord",
"symbol" : "GLib.test_run_suite"
},
{
"cIdentifier" : "g_test_skip",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_skip"
},
{
"cIdentifier" : "g_test_skip_printf",
"detail" : "notIntrospectable",
"reason" : "notIntrospectable",
"symbol" : "GLib.test_skip_printf"
},
{
"cIdentifier" : "g_test_trap_subprocess",
"detail" : "parameter 'test_path' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_trap_subprocess"
},
{
"cIdentifier" : "g_test_trap_subprocess_with_envp",
"detail" : "parameter 'test_path' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.test_trap_subprocess_with_envp"
},
{
@ -3048,12 +2892,6 @@
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf16_to_utf8"
},
{
"cIdentifier" : "g_utf8_find_next_char",
"detail" : "parameter 'end' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.utf8_find_next_char"
},
{
"cIdentifier" : "g_utf8_strncpy",
"detail" : "parameter 'dest' is not a single const input string ('gchar*')",
@ -3201,7 +3039,7 @@
],
"module" : "GLib",
"stats" : {
"boundCallables" : 271,
"boundCallables" : 298,
"boundCallbacks" : 61,
"boundSignals" : 0,
"boundTypes" : 287,

View file

@ -554,7 +554,7 @@
},
{
"cIdentifier" : "g_object_getv",
"detail" : "parameter 'names': C array bridging not yet implemented",
"detail" : "parameter 'values': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.getv"
},
@ -576,144 +576,18 @@
"reason" : "plainRecord",
"symbol" : "GObject.interface_list_properties"
},
{
"cIdentifier" : "g_param_spec_boolean",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boolean"
},
{
"cIdentifier" : "g_param_spec_boxed",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boxed"
},
{
"cIdentifier" : "g_param_spec_char",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_char"
},
{
"cIdentifier" : "g_param_spec_double",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_double"
},
{
"cIdentifier" : "g_param_spec_enum",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_enum"
},
{
"cIdentifier" : "g_param_spec_flags",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_flags"
},
{
"cIdentifier" : "g_param_spec_float",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_float"
},
{
"cIdentifier" : "g_param_spec_gtype",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_gtype"
},
{
"cIdentifier" : "g_param_spec_int",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int"
},
{
"cIdentifier" : "g_param_spec_int64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int64"
},
{
"cIdentifier" : "g_param_spec_long",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_long"
},
{
"cIdentifier" : "g_param_spec_object",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_object"
},
{
"cIdentifier" : "g_param_spec_override",
"detail" : "notIntrospectable",
"reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_override"
},
{
"cIdentifier" : "g_param_spec_param",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_param"
},
{
"cIdentifier" : "g_param_spec_pointer",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_pointer"
},
{
"cIdentifier" : "g_param_spec_string",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_string"
},
{
"cIdentifier" : "g_param_spec_uchar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uchar"
},
{
"cIdentifier" : "g_param_spec_uint",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint"
},
{
"cIdentifier" : "g_param_spec_uint64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint64"
},
{
"cIdentifier" : "g_param_spec_ulong",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_ulong"
},
{
"cIdentifier" : "g_param_spec_unichar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_unichar"
},
{
"cIdentifier" : "g_param_spec_value_array",
"detail" : "notIntrospectable",
"reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_value_array"
},
{
"cIdentifier" : "g_param_spec_variant",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_variant"
},
{
"cIdentifier" : "g_param_type_register_static",
"detail" : "parameter 'pspec_info': 'GObject.ParamSpecTypeInfo' has no GType registration or lifetime functions",
@ -1113,7 +987,7 @@
],
"module" : "GObject",
"stats" : {
"boundCallables" : 113,
"boundCallables" : 134,
"boundCallbacks" : 32,
"boundSignals" : 3,
"boundTypes" : 76,

View file

@ -705,7 +705,7 @@
{
"cIdentifier" : "g_base64_decode",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.base64_decode"
},
{
@ -723,7 +723,7 @@
{
"cIdentifier" : "g_base64_encode",
"detail" : "parameter 'data': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.base64_encode"
},
{
@ -735,7 +735,7 @@
{
"cIdentifier" : "g_base64_encode_step",
"detail" : "parameter 'in': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.base64_encode_step"
},
{
@ -788,8 +788,8 @@
},
{
"cIdentifier" : "g_build_filenamev",
"detail" : "parameter 'args': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'args': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.build_filenamev"
},
{
@ -800,8 +800,8 @@
},
{
"cIdentifier" : "g_build_pathv",
"detail" : "parameter 'args': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'args': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.build_pathv"
},
{
@ -900,12 +900,6 @@
"reason" : "deprecatedRemoved",
"symbol" : "GLib.byte_array_unref"
},
{
"cIdentifier" : "g_canonicalize_filename",
"detail" : "parameter 'relative_to' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.canonicalize_filename"
},
{
"cIdentifier" : "g_chdir",
"detail" : "C symbol 'g_chdir' is not exported by the system library",
@ -969,19 +963,19 @@
{
"cIdentifier" : "g_compute_checksum_for_data",
"detail" : "parameter 'data': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.compute_checksum_for_data"
},
{
"cIdentifier" : "g_compute_hmac_for_data",
"detail" : "parameter 'key': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.compute_hmac_for_data"
},
{
"cIdentifier" : "g_compute_hmac_for_string",
"detail" : "parameter 'key': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.compute_hmac_for_string"
},
{
@ -993,13 +987,13 @@
{
"cIdentifier" : "g_convert",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.convert"
},
{
"cIdentifier" : "g_convert_with_fallback",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.convert_with_fallback"
},
{
@ -1182,58 +1176,28 @@
"reason" : "deprecatedRemoved",
"symbol" : "GLib.date_valid_year"
},
{
"cIdentifier" : "g_dcgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dcgettext"
},
{
"cIdentifier" : "g_dgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dgettext"
},
{
"cIdentifier" : "g_dir_make_tmp",
"detail" : "deprecatedRemoved",
"reason" : "deprecatedRemoved",
"symbol" : "GLib.dir_make_tmp"
},
{
"cIdentifier" : "g_dngettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dngettext"
},
{
"cIdentifier" : "g_dpgettext",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext"
},
{
"cIdentifier" : "g_dpgettext2",
"detail" : "parameter 'domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.dpgettext2"
},
{
"cIdentifier" : "g_environ_getenv",
"detail" : "parameter 'envp': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.environ_getenv"
},
{
"cIdentifier" : "g_environ_setenv",
"detail" : "parameter 'envp': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.environ_setenv"
},
{
"cIdentifier" : "g_environ_unsetenv",
"detail" : "parameter 'envp': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.environ_unsetenv"
},
{
@ -1251,33 +1215,21 @@
{
"cIdentifier" : "g_file_get_contents",
"detail" : "out-param 'contents': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_get_contents"
},
{
"cIdentifier" : "g_file_open_tmp",
"detail" : "parameter 'tmpl' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.file_open_tmp"
},
{
"cIdentifier" : "g_file_set_contents",
"detail" : "parameter 'contents': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_set_contents"
},
{
"cIdentifier" : "g_file_set_contents_full",
"detail" : "parameter 'contents': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.file_set_contents_full"
},
{
"cIdentifier" : "g_filename_to_uri",
"detail" : "parameter 'hostname' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.filename_to_uri"
},
{
"cIdentifier" : "g_fopen",
"detail" : "C symbol 'g_fopen' is not exported by the system library",
@ -1322,32 +1274,32 @@
},
{
"cIdentifier" : "g_get_environ",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_environ"
},
{
"cIdentifier" : "g_get_filename_charsets",
"detail" : "out-param 'filename_charsets': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "out-param 'filename_charsets': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_filename_charsets"
},
{
"cIdentifier" : "g_get_language_names",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_language_names"
},
{
"cIdentifier" : "g_get_language_names_with_category",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_language_names_with_category"
},
{
"cIdentifier" : "g_get_locale_variants",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_locale_variants"
},
{
@ -1358,14 +1310,14 @@
},
{
"cIdentifier" : "g_get_system_config_dirs",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_system_config_dirs"
},
{
"cIdentifier" : "g_get_system_data_dirs",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.get_system_data_dirs"
},
{
@ -1584,18 +1536,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.idle_add_once"
},
{
"cIdentifier" : "g_intern_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_static_string"
},
{
"cIdentifier" : "g_intern_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.intern_string"
},
{
"cIdentifier" : "g_io_add_watch",
"detail" : "shadowedSymbol",
@ -1640,20 +1580,20 @@
},
{
"cIdentifier" : "g_listenv",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.listenv"
},
{
"cIdentifier" : "g_locale_from_utf8",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.locale_from_utf8"
},
{
"cIdentifier" : "g_locale_to_utf8",
"detail" : "parameter 'opsysstring': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.locale_to_utf8"
},
{
@ -1662,12 +1602,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.log"
},
{
"cIdentifier" : "g_log_default_handler",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_default_handler"
},
{
"cIdentifier" : "g_log_set_default_handler",
"detail" : "notIntrospectable",
@ -1682,8 +1616,8 @@
},
{
"cIdentifier" : "g_log_set_handler_full",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"detail" : "callback param 'log_func' deferred to Phase D4.3",
"reason" : "callbackWithoutUserData",
"symbol" : "GLib.log_set_handler_full"
},
{
@ -1701,7 +1635,7 @@
{
"cIdentifier" : "g_log_structured_array",
"detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_structured_array"
},
{
@ -1710,52 +1644,40 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.log_structured_standard"
},
{
"cIdentifier" : "g_log_variant",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_variant"
},
{
"cIdentifier" : "g_log_writer_default",
"detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_default"
},
{
"cIdentifier" : "g_log_writer_default_set_debug_domains",
"detail" : "parameter 'domains' is a nullable string",
"detail" : "parameter 'domains' is not a single const input string ('const gchar* const*')",
"reason" : "unknownType",
"symbol" : "GLib.log_writer_default_set_debug_domains"
},
{
"cIdentifier" : "g_log_writer_default_would_drop",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.log_writer_default_would_drop"
},
{
"cIdentifier" : "g_log_writer_format_fields",
"detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_format_fields"
},
{
"cIdentifier" : "g_log_writer_journald",
"detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_journald"
},
{
"cIdentifier" : "g_log_writer_standard_streams",
"detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_standard_streams"
},
{
"cIdentifier" : "g_log_writer_syslog",
"detail" : "parameter 'fields': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.log_writer_syslog"
},
{
@ -1872,12 +1794,6 @@
"reason" : "unknownType",
"symbol" : "GLib.nullify_pointer"
},
{
"cIdentifier" : "g_on_error_stack_trace",
"detail" : "parameter 'prg_name' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.on_error_stack_trace"
},
{
"cIdentifier" : "g_once_init_enter",
"detail" : "deprecatedRemoved",
@ -1916,8 +1832,8 @@
},
{
"cIdentifier" : "g_parse_debug_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'keys': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.parse_debug_string"
},
{
@ -2058,24 +1974,6 @@
"reason" : "callbackWithoutUserData",
"symbol" : "GLib.qsort_with_data"
},
{
"cIdentifier" : "g_quark_from_static_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_static_string"
},
{
"cIdentifier" : "g_quark_from_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_from_string"
},
{
"cIdentifier" : "g_quark_try_string",
"detail" : "parameter 'string' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.quark_try_string"
},
{
"cIdentifier" : "g_rc_box_release_full",
"detail" : "callback param 'clear_func' deferred to Phase D4.3",
@ -2277,7 +2175,7 @@
{
"cIdentifier" : "g_shell_parse_argv",
"detail" : "out-param 'argvp': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.shell_parse_argv"
},
{
@ -2336,38 +2234,38 @@
},
{
"cIdentifier" : "g_spawn_async",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async"
},
{
"cIdentifier" : "g_spawn_async_with_fds",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_fds"
},
{
"cIdentifier" : "g_spawn_async_with_pipes",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes"
},
{
"cIdentifier" : "g_spawn_async_with_pipes_and_fds",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_async_with_pipes_and_fds"
},
{
"cIdentifier" : "g_spawn_command_line_sync",
"detail" : "out-param 'standard_output': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "out-param 'standard_output': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_command_line_sync"
},
{
"cIdentifier" : "g_spawn_sync",
"detail" : "parameter 'working_directory' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'argv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.spawn_sync"
},
{
@ -2388,16 +2286,10 @@
"reason" : "unknownType",
"symbol" : "GLib.stpcpy"
},
{
"cIdentifier" : "g_str_to_ascii",
"detail" : "parameter 'from_locale' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.str_to_ascii"
},
{
"cIdentifier" : "g_str_tokenize_and_fold",
"detail" : "parameter 'translit_locale' is a nullable string",
"reason" : "unknownType",
"detail" : "out-param 'ascii_alternates': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.str_tokenize_and_fold"
},
{
@ -2418,12 +2310,6 @@
"reason" : "unknownType",
"symbol" : "GLib.strchug"
},
{
"cIdentifier" : "g_strcmp0",
"detail" : "parameter 'str1' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strcmp0"
},
{
"cIdentifier" : "g_strconcat",
"detail" : "notIntrospectable",
@ -2442,12 +2328,6 @@
"reason" : "unknownType",
"symbol" : "GLib.strdown"
},
{
"cIdentifier" : "g_strdup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strdup"
},
{
"cIdentifier" : "g_strdup_printf",
"detail" : "notIntrospectable",
@ -2462,20 +2342,14 @@
},
{
"cIdentifier" : "g_strdupv",
"detail" : "parameter 'str_array': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strdupv"
},
{
"cIdentifier" : "g_strescape",
"detail" : "parameter 'exceptions' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strescape"
},
{
"cIdentifier" : "g_strfreev",
"detail" : "parameter 'str_array': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strfreev"
},
{
@ -2486,8 +2360,8 @@
},
{
"cIdentifier" : "g_strjoinv",
"detail" : "parameter 'separator' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strjoinv"
},
{
@ -2502,12 +2376,6 @@
"reason" : "unknownType",
"symbol" : "GLib.strlcpy"
},
{
"cIdentifier" : "g_strndup",
"detail" : "parameter 'str' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.strndup"
},
{
"cIdentifier" : "g_strreverse",
"detail" : "parameter 'string' is not a single const input string ('gchar*')",
@ -2516,14 +2384,14 @@
},
{
"cIdentifier" : "g_strsplit",
"detail" : "C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strsplit"
},
{
"cIdentifier" : "g_strsplit_set",
"detail" : "parameter 'delimiters': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'delimiters': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strsplit_set"
},
{
@ -2534,14 +2402,14 @@
},
{
"cIdentifier" : "g_strv_contains",
"detail" : "parameter 'strv': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'strv': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strv_contains"
},
{
"cIdentifier" : "g_strv_equal",
"detail" : "parameter 'strv1': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'strv1': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strv_equal"
},
{
@ -2552,8 +2420,8 @@
},
{
"cIdentifier" : "g_strv_length",
"detail" : "parameter 'str_array': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'str_array': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.strv_length"
},
{
@ -2598,12 +2466,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.test_create_suite"
},
{
"cIdentifier" : "g_test_expect_message",
"detail" : "parameter 'log_domain' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_expect_message"
},
{
"cIdentifier" : "g_test_fail_printf",
"detail" : "notIntrospectable",
@ -2622,12 +2484,6 @@
"reason" : "notIntrospectable",
"symbol" : "GLib.test_get_root"
},
{
"cIdentifier" : "g_test_incomplete",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_incomplete"
},
{
"cIdentifier" : "g_test_incomplete_printf",
"detail" : "notIntrospectable",
@ -2676,28 +2532,16 @@
"reason" : "plainRecord",
"symbol" : "GLib.test_run_suite"
},
{
"cIdentifier" : "g_test_skip",
"detail" : "parameter 'msg' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_skip"
},
{
"cIdentifier" : "g_test_skip_printf",
"detail" : "notIntrospectable",
"reason" : "notIntrospectable",
"symbol" : "GLib.test_skip_printf"
},
{
"cIdentifier" : "g_test_trap_subprocess",
"detail" : "parameter 'test_path' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.test_trap_subprocess"
},
{
"cIdentifier" : "g_test_trap_subprocess_with_envp",
"detail" : "parameter 'test_path' is a nullable string",
"reason" : "unknownType",
"detail" : "parameter 'envp': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.test_trap_subprocess_with_envp"
},
{
@ -2865,13 +2709,13 @@
{
"cIdentifier" : "g_ucs4_to_utf16",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.ucs4_to_utf16"
},
{
"cIdentifier" : "g_ucs4_to_utf8",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.ucs4_to_utf8"
},
{
@ -2895,7 +2739,7 @@
{
"cIdentifier" : "g_unicode_canonical_ordering",
"detail" : "parameter 'string': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.unicode_canonical_ordering"
},
{
@ -3039,21 +2883,15 @@
{
"cIdentifier" : "g_utf16_to_ucs4",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf16_to_ucs4"
},
{
"cIdentifier" : "g_utf16_to_utf8",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf16_to_utf8"
},
{
"cIdentifier" : "g_utf8_find_next_char",
"detail" : "parameter 'end' is a nullable string",
"reason" : "unknownType",
"symbol" : "GLib.utf8_find_next_char"
},
{
"cIdentifier" : "g_utf8_strncpy",
"detail" : "parameter 'dest' is not a single const input string ('gchar*')",
@ -3081,13 +2919,13 @@
{
"cIdentifier" : "g_utf8_validate",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf8_validate"
},
{
"cIdentifier" : "g_utf8_validate_len",
"detail" : "parameter 'str': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GLib.utf8_validate_len"
},
{
@ -3201,7 +3039,7 @@
],
"module" : "GLib",
"stats" : {
"boundCallables" : 271,
"boundCallables" : 298,
"boundCallbacks" : 61,
"boundSignals" : 0,
"boundTypes" : 287,

View file

@ -105,7 +105,7 @@
{
"cIdentifier" : "g_object_newv",
"detail" : "parameter 'parameters': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.Object.newv"
},
{
@ -518,8 +518,8 @@
},
{
"cIdentifier" : "g_enum_register_static",
"detail" : "parameter 'const_static_values': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.enum_register_static"
},
{
@ -548,14 +548,14 @@
},
{
"cIdentifier" : "g_flags_register_static",
"detail" : "parameter 'const_static_values': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.flags_register_static"
},
{
"cIdentifier" : "g_object_getv",
"detail" : "parameter 'names': C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'values': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.getv"
},
{
@ -576,144 +576,18 @@
"reason" : "plainRecord",
"symbol" : "GObject.interface_list_properties"
},
{
"cIdentifier" : "g_param_spec_boolean",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boolean"
},
{
"cIdentifier" : "g_param_spec_boxed",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_boxed"
},
{
"cIdentifier" : "g_param_spec_char",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_char"
},
{
"cIdentifier" : "g_param_spec_double",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_double"
},
{
"cIdentifier" : "g_param_spec_enum",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_enum"
},
{
"cIdentifier" : "g_param_spec_flags",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_flags"
},
{
"cIdentifier" : "g_param_spec_float",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_float"
},
{
"cIdentifier" : "g_param_spec_gtype",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_gtype"
},
{
"cIdentifier" : "g_param_spec_int",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int"
},
{
"cIdentifier" : "g_param_spec_int64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_int64"
},
{
"cIdentifier" : "g_param_spec_long",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_long"
},
{
"cIdentifier" : "g_param_spec_object",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_object"
},
{
"cIdentifier" : "g_param_spec_override",
"detail" : "notIntrospectable",
"reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_override"
},
{
"cIdentifier" : "g_param_spec_param",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_param"
},
{
"cIdentifier" : "g_param_spec_pointer",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_pointer"
},
{
"cIdentifier" : "g_param_spec_string",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_string"
},
{
"cIdentifier" : "g_param_spec_uchar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uchar"
},
{
"cIdentifier" : "g_param_spec_uint",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint"
},
{
"cIdentifier" : "g_param_spec_uint64",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_uint64"
},
{
"cIdentifier" : "g_param_spec_ulong",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_ulong"
},
{
"cIdentifier" : "g_param_spec_unichar",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_unichar"
},
{
"cIdentifier" : "g_param_spec_value_array",
"detail" : "notIntrospectable",
"reason" : "notIntrospectable",
"symbol" : "GObject.param_spec_value_array"
},
{
"cIdentifier" : "g_param_spec_variant",
"detail" : "parameter 'nick' is a nullable string",
"reason" : "unknownType",
"symbol" : "GObject.param_spec_variant"
},
{
"cIdentifier" : "g_param_type_register_static",
"detail" : "parameter 'pspec_info': 'GObject.ParamSpecTypeInfo' has no GType registration or lifetime functions",
@ -722,14 +596,14 @@
},
{
"cIdentifier" : "g_type_module_register_enum",
"detail" : "parameter 'const_static_values': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.register_enum"
},
{
"cIdentifier" : "g_type_module_register_flags",
"detail" : "parameter 'const_static_values': C array has no length annotation",
"reason" : "arrayWithoutLength",
"detail" : "parameter 'const_static_values': C array bridging not yet implemented",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.register_flags"
},
{
@ -813,7 +687,7 @@
{
"cIdentifier" : "g_signal_list_ids",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.signal_list_ids"
},
{
@ -927,7 +801,7 @@
{
"cIdentifier" : "g_type_children",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.type_children"
},
{
@ -1029,7 +903,7 @@
{
"cIdentifier" : "g_type_interfaces",
"detail" : "C array bridging not yet implemented",
"reason" : "arrayWithoutLength",
"reason" : "arrayBridgingUnimplemented",
"symbol" : "GObject.type_interfaces"
},
{
@ -1113,7 +987,7 @@
],
"module" : "GObject",
"stats" : {
"boundCallables" : 113,
"boundCallables" : 134,
"boundCallbacks" : 32,
"boundSignals" : 3,
"boundTypes" : 76,

File diff suppressed because it is too large Load diff