/// A complete GIR repository, containing one or more namespaces. /// /// Corresponds to the root `` element in a GIR XML file. A single /// `.gir` file produces one `Repository` holding all namespaces defined within it. public struct Repository { /// The namespaces contained in this repository. public var namespaces: [Namespace] /// The C header include path from `` (e.g. `"gtk/gtk.h"`). public var cHeaderPath: String /// Link names for GIR dependencies derived from `` elements. /// Derived at parse time from the library name and version (e.g. `"Gdk-4.0"` becomes `"gdk-4"`). public var includedLibraryLinks: [String] /// Package name from `` element (e.g. `"gtk4"`). public var packageName: String /// Package entries from `` elements for Swift dependency resolution. /// Each entry records the included GIR namespace name and version (e.g. `"Gdk"`, `"4.0"`). public var includedPackages: [IncludeEntry] /// Creates a new repository. /// - Parameter namespaces: The namespaces contained in this repository. public init(namespaces: [Namespace] = [], cHeaderPath: String = "", includedLibraryLinks: [String] = [], packageName: String = "", includedPackages: [IncludeEntry] = []) { self.namespaces = namespaces self.cHeaderPath = cHeaderPath self.includedLibraryLinks = includedLibraryLinks self.packageName = packageName self.includedPackages = includedPackages } } /// A GIR namespace, grouping related type definitions within a repository. /// /// Corresponds to the `` element in a GIR XML file. A namespace /// holds all type definitions — classes, interfaces, records, enumerations, /// bitfields, callbacks, global functions, constants, and type aliases — that /// belong to a single GIR namespace such as `Gtk` or `GObject`. public struct Namespace { /// The namespace name, e.g. `"Gtk"`. public let name: String /// The namespace version string, e.g. `"4.0"`. public let version: String /// The shared library name from the GIR file (e.g. "libgtk-4.so.1"). public var cSharedLibrary: String /// The C identifier prefix (e.g. "Gtk", "G"). public var cIdentifierPrefix: String /// The GObject classes defined in this namespace. public var classes: [Class] /// The GObject interfaces defined in this namespace. public var interfaces: [Interface] /// The plain C records (structs) defined in this namespace. public var records: [Record] /// The enumerations defined in this namespace. public var enumerations: [Enumeration] /// The bitfield (flags) types defined in this namespace. public var bitfields: [Bitfield] /// The callback function types defined in this namespace. public var callbacks: [Callback] /// The global (namespace-level) functions defined in this namespace. public var functions: [GlobalFunction] /// The constants defined in this namespace. public var constants: [Constant] /// The type aliases defined in this namespace. public var aliases: [Alias] /// Creates a new namespace. /// - Parameters: /// - name: The namespace name, e.g. `"Gtk"`. /// - version: The namespace version string, e.g. `"4.0"`. /// - cSharedLibrary: The shared library name (e.g. "libgtk-4.so.1"). /// - cIdentifierPrefix: The C identifier prefix (e.g. "Gtk", "G"). /// - classes: The GObject classes in the namespace. /// - interfaces: The GObject interfaces in the namespace. /// - records: The plain C records in the namespace. /// - enumerations: The enumerations in the namespace. /// - bitfields: The bitfield types in the namespace. /// - callbacks: The callback types in the namespace. /// - functions: The global functions in the namespace. /// - constants: The constants in the namespace. /// - aliases: The type aliases in the namespace. public init(name: String, version: String, cSharedLibrary: String = "", cIdentifierPrefix: String = "", classes: [Class] = [], interfaces: [Interface] = [], records: [Record] = [], enumerations: [Enumeration] = [], bitfields: [Bitfield] = [], callbacks: [Callback] = [], functions: [GlobalFunction] = [], constants: [Constant] = [], aliases: [Alias] = []) { self.name = name; self.version = version self.cSharedLibrary = cSharedLibrary; self.cIdentifierPrefix = cIdentifierPrefix self.classes = classes; self.interfaces = interfaces; self.records = records self.enumerations = enumerations; self.bitfields = bitfields; self.callbacks = callbacks self.functions = functions; self.constants = constants; self.aliases = aliases } } /// A GObject class definition. /// /// Corresponds to the `` element in a GIR XML file. Models a GObject /// class with its parent class, implemented interfaces, constructors, methods, /// properties, signals, and associated functions. public struct Class { /// The class name, e.g. `"Widget"`. public let name: String /// The corresponding C type name, e.g. `"GtkWidget"`. public let cType: String /// The name of the parent class, or `nil` for the root `GObject` class. public let parent: String? /// Whether this class is abstract and cannot be instantiated directly. /// /// Abstract classes are emitted without constructors: the C library /// provides no way to instantiate them directly. public var isAbstract: Bool /// Whether GIR marks the class final (`final="1"`), forbidding subclassing. public var isFinal: Bool /// The `glib:get-type` function registering this class's GType, /// e.g. `"gtk_widget_get_type"`. public var getTypeFunction: String? /// The registered GType name from `glib:type-name`, e.g. `"GtkWidget"`. public var typeName: String? /// GIR metadata governing whether this class should be bound at all. public var symbolInfo: SymbolInfo /// The names of interfaces this class implements. public var implements: [String] /// The constructors for this class. /// Documentation comment from the GIR XML `` element. public var doc: String? public var constructors: [Constructor] /// The methods of this class. public var methods: [Method] /// The GObject properties of this class. public var properties: [Property] /// The signals emitted by this class. public var signals: [Signal] /// The functions associated with this class. public var functions: [GlobalFunction] /// The GIR `glib:ref-func` attribute, present only on the root class of a /// non-`GObject` fundamental type hierarchy (e.g. `GParamSpec`'s /// `g_param_spec_ref_sink`). `nil` for ordinary `GObject`-derived classes, /// which use `g_object_ref`/`g_object_ref_sink` instead. public var refFunc: String? /// The GIR `glib:unref-func` attribute — see `refFunc`. `nil` for ordinary /// `GObject`-derived classes, which use `g_object_unref` instead. public var unrefFunc: String? /// Creates a new class definition. /// - Parameters: /// - name: The class name, e.g. `"Widget"`. /// - cType: The corresponding C type name, e.g. `"GtkWidget"`. /// - parent: The name of the parent class, or `nil` if root. /// - isAbstract: Whether the class is abstract. Defaults to `false`. /// - isFinal: Whether GIR marks the class final. Defaults to `false`. /// - getTypeFunction: The `glib:get-type` function name, if any. /// - typeName: The registered GType name, if any. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - implements: The names of implemented interfaces. Defaults to empty. /// - constructors: The constructors. Defaults to empty. /// - methods: The methods. Defaults to empty. /// - properties: The properties. Defaults to empty. /// - signals: The signals. Defaults to empty. /// - functions: The associated functions. Defaults to empty. /// - doc: Documentation comment from the GIR XML. /// - refFunc: The GIR `glib:ref-func` override, if any. /// - unrefFunc: The GIR `glib:unref-func` override, if any. public init(name: String, cType: String, parent: String?, isAbstract: Bool = false, isFinal: Bool = false, getTypeFunction: String? = nil, typeName: String? = nil, symbolInfo: SymbolInfo = SymbolInfo(), implements: [String] = [], constructors: [Constructor] = [], methods: [Method] = [], properties: [Property] = [], signals: [Signal] = [], functions: [GlobalFunction] = [], doc: String? = nil, refFunc: String? = nil, unrefFunc: String? = nil) { self.name = name; self.cType = cType; self.parent = parent self.isAbstract = isAbstract; self.isFinal = isFinal self.getTypeFunction = getTypeFunction; self.typeName = typeName self.symbolInfo = symbolInfo; self.implements = implements self.constructors = constructors; self.methods = methods self.properties = properties; self.signals = signals; self.functions = functions self.doc = doc self.refFunc = refFunc; self.unrefFunc = unrefFunc } } /// A GObject interface definition. /// /// Corresponds to the `` element in a GIR XML file. An interface /// declares methods, properties, and signals that implementing classes must /// provide, along with prerequisite types that must be satisfied first. public struct Interface { /// The interface name, e.g. `"Buildable"`. public let name: String /// The corresponding C type name, e.g. `"GtkBuildable"`. public let cType: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// The methods declared by this interface. public var methods: [Method] /// The properties declared by this interface. public var properties: [Property] /// The signals declared by this interface. public var signals: [Signal] /// The functions associated with this interface (namespace-level `` /// elements that reference the interface's type). public var functions: [GlobalFunction] /// The prerequisite types a class must satisfy to implement this interface. public var prereqs: [String] /// The `glib:get-type` function registering this interface's GType. public var getTypeFunction: String? /// The registered GType name from `glib:type-name`, e.g. `"GtkBuildable"`. public var typeName: String? /// GIR metadata governing whether this interface should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new interface definition. /// - Parameters: /// - name: The interface name. /// - cType: The corresponding C type name. /// - methods: The methods declared by the interface. Defaults to empty. /// - properties: The properties declared by the interface. Defaults to empty. /// - signals: The signals declared by the interface. Defaults to empty. /// - functions: The functions associated with this interface. Defaults to empty. /// - prereqs: The prerequisite types. Defaults to empty. /// - getTypeFunction: The `glib:get-type` function name, if any. /// - typeName: The registered GType name, if any. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, cType: String, methods: [Method] = [], properties: [Property] = [], signals: [Signal] = [], functions: [GlobalFunction] = [], prereqs: [String] = [], getTypeFunction: String? = nil, typeName: String? = nil, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.cType = cType; self.methods = methods self.properties = properties; self.signals = signals; self.functions = functions; self.prereqs = prereqs self.getTypeFunction = getTypeFunction; self.typeName = typeName self.symbolInfo = symbolInfo; self.doc = doc } } /// A plain C record (struct) definition. /// /// Corresponds to the `` element in a GIR XML file. Records are /// value types in C and may be opaque (no fields exposed), disguised /// (typedef'd without `struct` keyword), or have fully accessible fields. public struct Record { /// The record name. public let name: String /// The corresponding C type name. public let cType: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// Whether the record is opaque (fields are not introspectable). public var isOpaque: Bool /// Whether the record is disguised (typedef'd without the `struct` keyword). public var isDisguised: Bool /// The class or interface whose GObject type struct this record is /// (`glib:is-gtype-struct-for`), e.g. `"Widget"` for `GtkWidgetClass`. /// /// Type structs are implementation details of the GObject type system and /// are never bound. public var isGTypeStructFor: String? /// The `glib:get-type` function registering this record's boxed GType. /// /// Its presence is what makes a record a *boxed* type — safely copyable /// and freeable via `g_boxed_copy`/`g_boxed_free`, and therefore bindable /// as an opaque pointer wrapper. Records without it are skipped. public var getTypeFunction: String? /// The registered GType name from `glib:type-name`, e.g. `"GdkRGBA"`. public var typeName: String? /// An explicit copy function from `copy-function`, if the GIR states one. public var copyFunction: String? /// An explicit free function from `free-function`, if the GIR states one. public var freeFunction: String? /// GIR metadata governing whether this record should be bound at all. public var symbolInfo: SymbolInfo /// The fields of the record, if introspectable. public var fields: [Field] /// The methods operating on this record. public var methods: [Method] /// The constructors for this record. public var constructors: [Constructor] /// The functions associated with this record. public var functions: [GlobalFunction] /// Creates a new record definition. /// - Parameters: /// - name: The record name. /// - cType: The corresponding C type name. /// - isOpaque: Whether the record is opaque. Defaults to `false`. /// - isDisguised: Whether the record is disguised. Defaults to `false`. /// - isGTypeStructFor: The type this record is the GObject type struct for, if any. /// - getTypeFunction: The `glib:get-type` function name, if any. /// - typeName: The registered GType name, if any. /// - copyFunction: An explicit copy function, if stated. /// - freeFunction: An explicit free function, if stated. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - fields: The fields of the record. Defaults to empty. /// - methods: The record methods. Defaults to empty. /// - constructors: The record constructors. Defaults to empty. /// - functions: The associated functions. Defaults to empty. /// - doc: Documentation comment from the GIR XML. public init(name: String, cType: String, isOpaque: Bool = false, isDisguised: Bool = false, isGTypeStructFor: String? = nil, getTypeFunction: String? = nil, typeName: String? = nil, copyFunction: String? = nil, freeFunction: String? = nil, symbolInfo: SymbolInfo = SymbolInfo(), fields: [Field] = [], methods: [Method] = [], constructors: [Constructor] = [], functions: [GlobalFunction] = [], doc: String? = nil) { self.name = name; self.cType = cType; self.isOpaque = isOpaque self.isDisguised = isDisguised; self.isGTypeStructFor = isGTypeStructFor self.getTypeFunction = getTypeFunction; self.typeName = typeName self.copyFunction = copyFunction; self.freeFunction = freeFunction self.symbolInfo = symbolInfo self.fields = fields; self.methods = methods self.constructors = constructors; self.functions = functions; self.doc = doc } /// Whether this record is a boxed type with a registered GType. /// /// Boxed records can be wrapped as opaque pointer classes with /// `g_boxed_copy`/`g_boxed_free` lifetimes. Non-boxed records are skipped /// with ``SkipReason/plainRecord``. public var isBoxed: Bool { getTypeFunction != nil } } /// A field within a C record. /// /// Corresponds to the `` element in a GIR XML file. Describes a named /// member of a C struct, including its type and read/write permissions. public struct Field { /// The field name. public let name: String /// The GIR type of the field. public let type: GIRType /// Documentation comment from the GIR XML `` element. public var doc: String? /// Whether the field is readable (accessible for reading). public let isReadable: Bool /// Whether the field is writable (accessible for writing). public let isWritable: Bool /// Creates a new field. /// - Parameters: /// - name: The field name. /// - type: The GIR type of the field. /// - isReadable: Whether the field is readable. Defaults to `true`. /// - isWritable: Whether the field is writable. Defaults to `false`. /// - doc: Documentation comment from the GIR XML. public init(name: String, type: GIRType, isReadable: Bool = true, isWritable: Bool = false, doc: String? = nil) { self.name = name; self.type = type; self.isReadable = isReadable; self.isWritable = isWritable; self.doc = doc } } /// A GObject enumeration type. /// /// Corresponds to the `` element in a GIR XML file. Defines a /// set of named integer constants with their C identifiers and numeric values. public struct Enumeration { /// The enumeration name. public let name: String /// The corresponding C type name. public let cType: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// The members (enum values) of this enumeration. public var members: [EnumMember] /// The `glib:get-type` function registering this enum's GType, if any. /// /// Its presence selects `g_value_get_enum`/`g_value_set_enum` for /// property access; plain C enums without a GType cannot go through GValue. public var getTypeFunction: String? /// The registered GType name from `glib:type-name`, e.g. `"GtkAlign"`. public var typeName: String? /// The GLib error domain this enumeration defines, if it is an error enum. public var errorDomain: String? /// GIR metadata governing whether this enumeration should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new enumeration. /// - Parameters: /// - name: The enumeration name. /// - cType: The corresponding C type name. /// - members: The enum members. Defaults to empty. /// - getTypeFunction: The `glib:get-type` function name, if any. /// - typeName: The registered GType name, if any. /// - errorDomain: The GLib error domain, if this is an error enum. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, cType: String, members: [EnumMember] = [], getTypeFunction: String? = nil, typeName: String? = nil, errorDomain: String? = nil, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.cType = cType; self.members = members self.getTypeFunction = getTypeFunction; self.typeName = typeName self.errorDomain = errorDomain; self.symbolInfo = symbolInfo; self.doc = doc } } /// A single member (value) of an enumeration or bitfield. /// /// Corresponds to the `` element in a GIR XML file. Each member /// has a name, its associated numeric value, and the full C identifier. public struct EnumMember { /// The member name, e.g. `"visible"`. public let name: String /// The numeric value as a string, e.g. `"1"`. public let value: String /// The full C identifier, e.g. `"GTK_WIDGET_VISIBLE"`. public let cIdentifier: String /// Creates a new enum member. /// - Parameters: /// - name: The member name. /// - value: The numeric value as a string. /// - cIdentifier: The full C identifier. public init(name: String, value: String, cIdentifier: String) { self.name = name; self.value = value; self.cIdentifier = cIdentifier } } /// A GObject bitfield (flags) type. /// /// Corresponds to the `` element in a GIR XML file. Defines a set /// of named flags that can be combined with bitwise operations. Each member /// represents a single bit in the flags value. public struct Bitfield { /// The bitfield type name. public let name: String /// The corresponding C type name. public let cType: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// The individual flag members. /// /// Member values are the flag's actual numeric value (e.g. `4`), not a bit /// position — they are used verbatim as `OptionSet` raw values. public var members: [EnumMember] /// The `glib:get-type` function registering this bitfield's GType, if any. /// /// Its presence selects `g_value_get_flags`/`g_value_set_flags` for /// property access. public var getTypeFunction: String? /// The registered GType name from `glib:type-name`, e.g. `"GtkStateFlags"`. public var typeName: String? /// GIR metadata governing whether this bitfield should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new bitfield type. /// - Parameters: /// - name: The bitfield type name. /// - cType: The corresponding C type name. /// - members: The flag members. Defaults to empty. /// - getTypeFunction: The `glib:get-type` function name, if any. /// - typeName: The registered GType name, if any. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, cType: String, members: [EnumMember] = [], getTypeFunction: String? = nil, typeName: String? = nil, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.cType = cType; self.members = members self.getTypeFunction = getTypeFunction; self.typeName = typeName self.symbolInfo = symbolInfo; self.doc = doc } } /// A callback function type. /// /// Corresponds to the `` element in a GIR XML file. Describes the /// function signature — parameters and return type — for a C callback used /// in signal handlers, virtual functions, or asynchronous operations. public struct Callback { /// The callback type name. public let name: String /// The corresponding C type name. public let cType: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// The parameters of the callback function. public var parameters: [Parameter] /// The return value of the callback function. public var returnValue: ReturnValue /// Whether the callback takes a trailing `GError**`. public var throwsGError: Bool /// GIR metadata governing whether this callback should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new callback type. /// - Parameters: /// - name: The callback type name. /// - cType: The corresponding C type name. /// - parameters: The callback parameters. Defaults to empty. /// - returnValue: The return value. Defaults to a `void`, non-transferring return. /// - throwsGError: Whether the callback takes a `GError**`. Defaults to `false`. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, cType: String, parameters: [Parameter] = [], returnValue: ReturnValue = ReturnValue(), throwsGError: Bool = false, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.cType = cType; self.parameters = parameters self.returnValue = returnValue; self.throwsGError = throwsGError self.symbolInfo = symbolInfo; self.doc = doc } /// The index of the parameter carrying user data, if the callback has one. /// /// Conventionally the trailing `gpointer user_data`. A callback without /// such a slot cannot carry a Swift closure. public var userDataParameterIndex: Int? { parameters.lastIndex { $0.type == .pointer && $0.name.contains("data") } } } /// A constructor for a GObject class. /// /// Corresponds to the `` element in a GIR XML file. Constructors /// are special methods that create new instances of a GObject type, typically /// wrapping C functions like `gtk_widget_new()`. public struct Constructor { /// The constructor name. public let name: String /// The corresponding C function identifier. public let cIdentifier: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// The parameters accepted by the constructor. public var parameters: [Parameter] /// The return value — typically the constructed object type. /// /// Note that GIR declares most widget constructors `transfer-ownership="none"` /// even though they return a *floating* reference. The planner therefore /// derives sinking from the class's `InitiallyUnowned` ancestry rather than /// from this transfer annotation alone. public var returnValue: ReturnValue /// Whether the constructor takes a trailing `GError**` and can fail. public var throwsGError: Bool /// GIR metadata governing whether this constructor should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new constructor definition. /// - Parameters: /// - name: The constructor name. /// - cIdentifier: The corresponding C function identifier. /// - parameters: The constructor parameters. Defaults to empty. /// - returnValue: The return value. Defaults to a `void`, non-transferring return. /// - throwsGError: Whether the constructor takes a `GError**`. Defaults to `false`. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, cIdentifier: String, parameters: [Parameter] = [], returnValue: ReturnValue = ReturnValue(), throwsGError: Bool = false, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.cIdentifier = cIdentifier self.parameters = parameters; self.returnValue = returnValue self.throwsGError = throwsGError; self.symbolInfo = symbolInfo; self.doc = doc } } /// A method of a GObject class, interface, or record. /// /// Corresponds to the `` element in a GIR XML file. Methods are /// instance functions that operate on a particular type, identified by their /// C function name. public struct Method { /// The method name, e.g. `"set_visible"`. public let name: String /// The corresponding C function identifier, e.g. `"gtk_widget_set_visible"`. public let cIdentifier: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// The parameters of the method, typically excluding the instance parameter. public var parameters: [Parameter] /// The return value of the method, with its ownership and nullability. public var returnValue: ReturnValue /// Whether the method takes a trailing `GError**` and can fail. public var throwsGError: Bool /// GIR metadata governing whether this method should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new method definition. /// - Parameters: /// - name: The method name. /// - cIdentifier: The corresponding C function identifier. /// - parameters: The method parameters. Defaults to empty. /// - returnValue: The return value. Defaults to a `void`, non-transferring return. /// - throwsGError: Whether the method takes a `GError**`. Defaults to `false`. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, cIdentifier: String, parameters: [Parameter] = [], returnValue: ReturnValue = ReturnValue(), throwsGError: Bool = false, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.cIdentifier = cIdentifier self.parameters = parameters; self.returnValue = returnValue self.throwsGError = throwsGError; self.symbolInfo = symbolInfo; self.doc = doc } } /// A GObject property definition. /// /// Corresponds to the `` element in a GIR XML file. Properties are /// named, typed attributes on GObject classes with configurable read/write /// access and construct-time-only semantics. public struct Property { /// The property name, e.g. `"label"`. public let name: String /// The GIR type of the property. public var type: GIRType /// Documentation comment from the GIR XML `` element. public var doc: String? /// Whether the property is readable (has a getter). public var isReadable: Bool /// Whether the property is writable (has a setter). public var isWritable: Bool /// Whether the property can only be set during object construction. public var isConstructOnly: Bool /// Whether the property may hold `NULL`. public var isNullable: Bool /// How ownership transfers when reading or writing the property. public var transferOwnership: TransferOwnership /// The name of the method implementing this property's getter, if GIR /// states one via the `getter` attribute (e.g. `"get_label"`). /// /// When present, the accessor delegates to that already-planned method /// instead of going through the GValue machinery — simpler and correct by /// construction. public var getter: String? /// The name of the method implementing this property's setter, if GIR /// states one via the `setter` attribute (e.g. `"set_label"`). public var setter: String? /// GIR metadata governing whether this property should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new property definition. /// - Parameters: /// - name: The property name. /// - type: The GIR type of the property. /// - isReadable: Whether the property is readable. Defaults to `true`. /// - isWritable: Whether the property is writable. Defaults to `false`. /// - isConstructOnly: Whether the property is construct-only. Defaults to `false`. /// - isNullable: Whether the property may be `NULL`. Defaults to `false`. /// - transferOwnership: Ownership transfer semantics. Defaults to `.none`. /// - getter: The name of the getter method, if stated. /// - setter: The name of the setter method, if stated. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, type: GIRType, isReadable: Bool = true, isWritable: Bool = false, isConstructOnly: Bool = false, isNullable: Bool = false, transferOwnership: TransferOwnership = .none, getter: String? = nil, setter: String? = nil, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.type = type self.isReadable = isReadable; self.isWritable = isWritable self.isConstructOnly = isConstructOnly; self.isNullable = isNullable self.transferOwnership = transferOwnership self.getter = getter; self.setter = setter self.symbolInfo = symbolInfo; self.doc = doc } } /// A GObject signal definition. /// /// Corresponds to the `` element in a GIR XML file. Signals are /// typed event emitters on GObject classes. Each signal has a parameter list, /// a return value, and may support detailed (string-parameterized) connections. public struct Signal { /// The signal name, e.g. `"clicked"`. public let name: String /// The parameters emitted with the signal. public var parameters: [Parameter] /// The return value of the signal handler. public var returnValue: ReturnValue /// Whether the signal supports detail strings (e.g. `"notify::label"`). public var isDetailed: Bool /// GIR metadata governing whether this signal should be bound at all. public var symbolInfo: SymbolInfo /// Documentation comment from the GIR XML `` element. public var doc: String? /// Creates a new signal definition. /// - Parameters: /// - name: The signal name. /// - parameters: The signal parameters. Defaults to empty. /// - returnValue: The handler return value. Defaults to a `void`, non-transferring return. /// - isDetailed: Whether the signal supports detail strings. Defaults to `false`. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, parameters: [Parameter] = [], returnValue: ReturnValue = ReturnValue(), isDetailed: Bool = false, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.parameters = parameters; self.returnValue = returnValue self.isDetailed = isDetailed; self.symbolInfo = symbolInfo; self.doc = doc } } /// A global (namespace-level) function. /// /// Corresponds to the `` element at the namespace level in a GIR /// XML file. These are free functions not associated with any particular /// type, such as utility or factory functions. public struct GlobalFunction { /// The function name. public let name: String /// The corresponding C function identifier. public let cIdentifier: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// The parameters of the function. public var parameters: [Parameter] /// The return value of the function, with its ownership and nullability. public var returnValue: ReturnValue /// Whether the function takes a trailing `GError**` and can fail. public var throwsGError: Bool /// GIR metadata governing whether this function should be bound at all. public var symbolInfo: SymbolInfo /// Creates a new global function definition. /// - Parameters: /// - name: The function name. /// - cIdentifier: The corresponding C function identifier. /// - parameters: The function parameters. Defaults to empty. /// - returnValue: The return value. Defaults to a `void`, non-transferring return. /// - throwsGError: Whether the function takes a `GError**`. Defaults to `false`. /// - symbolInfo: GIR binding metadata. Defaults to introspectable and bindable. /// - doc: Documentation comment from the GIR XML. public init(name: String, cIdentifier: String, parameters: [Parameter] = [], returnValue: ReturnValue = ReturnValue(), throwsGError: Bool = false, symbolInfo: SymbolInfo = SymbolInfo(), doc: String? = nil) { self.name = name; self.cIdentifier = cIdentifier self.parameters = parameters; self.returnValue = returnValue self.throwsGError = throwsGError; self.symbolInfo = symbolInfo; self.doc = doc } } /// A constant value definition. /// /// Corresponds to the `` element in a GIR XML file. Constants are /// named immutable values with a specific GIR type, such as enum defaults or /// version numbers. public struct Constant { /// The constant name. public let name: String /// The constant value as a string representation. public let value: String /// The GIR type of the constant. public var type: GIRType /// Documentation comment from the GIR XML `` element. public var doc: String? /// Creates a new constant definition. /// - Parameters: /// - name: The constant name. /// - value: The constant value as a string representation. /// - type: The GIR type of the constant. /// - doc: Documentation comment from the GIR XML. public init(name: String, value: String, type: GIRType, doc: String? = nil) { self.name = name; self.value = value; self.type = type; self.doc = doc } } /// A type alias definition. /// /// Corresponds to the `` element in a GIR XML file. Provides an /// alternative name (with an optional C type) for an existing GIR type, /// useful for platform-specific or convenience typedefs. public struct Alias { /// The alias name. public let name: String /// The corresponding C type name. public let cType: String /// The underlying GIR type this alias refers to. public var target: GIRType /// Documentation comment from the GIR XML `` element. public var doc: String? /// Creates a new type alias. /// - Parameters: /// - name: The alias name. /// - cType: The corresponding C type name. /// - target: The underlying GIR type to alias. /// - doc: Documentation comment from the GIR XML. public init(name: String, cType: String, target: GIRType, doc: String? = nil) { self.name = name; self.cType = cType; self.target = target; self.doc = doc } } // MARK: - Shared Types /// A parameter of a function, method, constructor, callback, or signal. /// /// Corresponds to the `` element in a GIR XML file. Describes the /// parameter's name, type, C type name, nullability, optionality, ownership /// transfer rules, and whether it is the implicit instance parameter /// (equivalent to `self`). public struct Parameter { /// The parameter name. public let name: String /// The GIR type of the parameter. public var type: GIRType /// The C type name (e.g. "GtkWidget", "GObject"). Empty string if not available. public var cType: String /// Documentation comment from the GIR XML `` element. public var doc: String? /// Whether the parameter may be `nil` (NULL). public var isNullable: Bool /// Whether the parameter is optional (may be omitted at the call site). public var isOptional: Bool /// How ownership is transferred for this parameter. public var transferOwnership: TransferOwnership /// Whether this is the implicit instance parameter (self) of a method. public var isInstanceParameter: Bool /// The direction of data flow for this parameter. public var direction: ParameterDirection /// Whether the caller allocates the storage an out parameter writes into. /// /// Only meaningful when ``direction`` is `.out`. Caller-allocated out /// parameters take a pointer to existing storage; callee-allocated ones /// take a pointer to a pointer the callee fills in. public var callerAllocates: Bool /// The lifetime of this parameter's callback, when it is a callback. public var scope: CallbackScope? /// Index of the parameter carrying this callback's user data, if any. /// /// From the GIR `closure` attribute. A callback without a user-data slot /// cannot carry a Swift closure and forces its callable to be skipped. public var closureIndex: Int? /// Index of the parameter carrying this callback's `DestroyNotify`, if any. /// /// From the GIR `destroy` attribute. public var destroyIndex: Int? /// Creates a new parameter definition. /// - Parameters: /// - name: The parameter name. /// - type: The GIR type of the parameter. /// - cType: The corresponding C type name. Defaults to `""`. /// - isNullable: Whether the parameter may be nil. Defaults to `false`. /// - isOptional: Whether the parameter is optional. Defaults to `false`. /// - transferOwnership: How ownership is transferred. Defaults to `.none`. /// - isInstanceParameter: Whether this is the instance parameter. Defaults to `false`. /// - direction: The direction of data flow. Defaults to `.in`. /// - callerAllocates: Whether the caller allocates out-parameter storage. /// Defaults to `false`. /// - scope: The callback lifetime, when this parameter is a callback. /// - closureIndex: Index of the user-data parameter, if any. /// - destroyIndex: Index of the `DestroyNotify` parameter, if any. /// - doc: Documentation comment from the GIR XML. public init(name: String, type: GIRType, cType: String = "", isNullable: Bool = false, isOptional: Bool = false, transferOwnership: TransferOwnership = .none, isInstanceParameter: Bool = false, direction: ParameterDirection = .in, callerAllocates: Bool = false, scope: CallbackScope? = nil, closureIndex: Int? = nil, destroyIndex: Int? = nil, doc: String? = nil) { self.name = name; self.type = type; self.cType = cType; self.isNullable = isNullable self.isOptional = isOptional; self.transferOwnership = transferOwnership self.isInstanceParameter = isInstanceParameter self.direction = direction; self.callerAllocates = callerAllocates self.scope = scope; self.closureIndex = closureIndex; self.destroyIndex = destroyIndex self.doc = doc } } /// Describes how ownership of a value is transferred between caller and callee. /// /// Maps to the `transfer-ownership` attribute in GIR XML. Controls memory /// management semantics: whether the caller must free the returned value /// (`.full`), whether only the container is owned (`.container`), or whether /// no ownership transfer occurs (`.none`). public enum TransferOwnership: String, Sendable { /// No transfer; the caller does not own the value and must not free it. case none /// Full transfer; the caller owns the value and is responsible for freeing it. case full /// Container transfer; the caller owns the container but not its elements. case container } /// The direction of data flow for a parameter. /// /// Maps to the `direction` attribute in GIR XML. Out and in-out parameters are /// passed as pointers in C and require dedicated marshalling in Swift. public enum ParameterDirection: String, Sendable { /// The value flows from caller to callee (the default). case `in` /// The value flows from callee to caller via a pointer. case out /// The value flows in both directions via a pointer. case inout_ = "inout" } /// The lifetime of a callback parameter relative to the call it is passed to. /// /// Maps to the `scope` attribute in GIR XML. Determines how the generator must /// box and release the Swift closure backing a C callback. public enum CallbackScope: String, Sendable { /// The callback is only invoked during the call; no box retention needed. case call /// The callback is invoked exactly once, later; the box is consumed then. case async /// The callback lives until its `DestroyNotify` fires. case notified /// The callback lives forever; the box is never released. case forever } /// Metadata describing how a GIR `` determines its length. /// /// Derived from the `length`, `fixed-size`, and `zero-terminated` attributes on /// the GIR `` element. Without one of these, a C array cannot be safely /// bridged and the enclosing callable must be skipped. public struct ArrayInfo: Equatable, Sendable { /// Index of the parameter carrying the array length, if length-delimited. /// /// The index refers to the enclosing callable's GIR parameter list, /// excluding the instance parameter — matching GIR's own numbering. public var lengthParameterIndex: Int? /// The compile-time element count, if the array is fixed-size. public var fixedSize: Int? /// Whether the array is terminated by a `NULL`/zero element. public var isZeroTerminated: Bool /// The C type spelling of the array itself (e.g. `"char**"`), when present. public var cType: String /// The C type spelling of the array's *element* (e.g. `"AdwNavigationPage*"`, /// `"guint8"`), when the GIR ``'s child `` carries one. Empty /// when absent; callers then infer element depth from `cType` minus one. public var elementCType: String /// Creates array length metadata. /// /// - Parameters: /// - lengthParameterIndex: Index of the length parameter, if any. /// - fixedSize: The fixed element count, if any. /// - isZeroTerminated: Whether a zero/NULL terminator delimits the array. /// Defaults to `false`. /// - cType: The C type spelling of the array. Defaults to `""`. /// - elementCType: The C type spelling of the array's element. Defaults to `""`. public init(lengthParameterIndex: Int? = nil, fixedSize: Int? = nil, isZeroTerminated: Bool = false, cType: String = "", elementCType: String = "") { self.lengthParameterIndex = lengthParameterIndex self.fixedSize = fixedSize self.isZeroTerminated = isZeroTerminated self.cType = cType self.elementCType = elementCType } /// Whether the array's length can be determined at all. /// /// Arrays failing this check cannot be bridged and cause their enclosing /// callable to be skipped with ``SkipReason/arrayWithoutLength``. public var hasKnownLength: Bool { lengthParameterIndex != nil || fixedSize != nil || isZeroTerminated } } /// The return value of a callable, with its ownership and nullability. /// /// Corresponds to the `` element in GIR XML. Bundling the type /// with its `transfer-ownership` and `nullable` attributes keeps the semantics /// the binding planner needs attached to the type, rather than discarded. public struct ReturnValue: Equatable, Sendable { /// The GIR type of the returned value. public var type: GIRType /// Whether the callee may return `NULL`. public var isNullable: Bool /// How ownership of the returned value transfers to the caller. public var transferOwnership: TransferOwnership /// Documentation comment from the GIR XML `` element. public var doc: String? /// The raw GIR `c:type` attribute, e.g. `"const guint8*"`. Empty when /// the GIR omitted it. Used to detect scalar types returned through a /// pointer (no `` length) that the type name alone hides. public var cType: String /// Creates a return value description. /// /// - Parameters: /// - type: The GIR type returned. Defaults to `.void`. /// - isNullable: Whether `NULL` may be returned. Defaults to `false`. /// - transferOwnership: Ownership transfer to the caller. Defaults to `.none`. /// - doc: Documentation comment from the GIR XML. /// - cType: The raw GIR `c:type` attribute. Defaults to `""`. public init(type: GIRType = .void, isNullable: Bool = false, transferOwnership: TransferOwnership = .none, doc: String? = nil, cType: String = "") { self.type = type self.isNullable = isNullable self.transferOwnership = transferOwnership self.doc = doc self.cType = cType } } /// GIR metadata shared by every bindable symbol. /// /// Captures the attributes that determine whether a symbol should be bound at /// all, independent of its type signature. The binding planner consults these /// before attempting to plan a symbol. public struct SymbolInfo: Equatable, Sendable { /// Whether the symbol is introspectable (`introspectable="0"` means no). /// /// Non-introspectable symbols are outside the GIR ABI contract and are /// never bound. public var isIntrospectable: Bool /// Whether the symbol is marked deprecated. public var isDeprecated: Bool /// The version in which the symbol was deprecated, if stated. public var deprecatedVersion: String? /// The name of the symbol that shadows this one, if any. /// /// GIR marks the lower-fidelity of two overlapping symbols with /// `shadowed-by`; only the shadowing symbol should be bound. public var shadowedBy: String? /// The name this symbol shadows, if any. public var shadows: String? /// The symbol this one was renamed to (`moved-to`), if any. public var movedTo: String? /// Creates symbol metadata. /// /// - Parameters: /// - isIntrospectable: Whether the symbol is introspectable. Defaults to `true`. /// - isDeprecated: Whether the symbol is deprecated. Defaults to `false`. /// - deprecatedVersion: The deprecation version, if stated. /// - shadowedBy: The name of the shadowing symbol, if any. /// - shadows: The name of the shadowed symbol, if any. /// - movedTo: The rename target, if any. public init(isIntrospectable: Bool = true, isDeprecated: Bool = false, deprecatedVersion: String? = nil, shadowedBy: String? = nil, shadows: String? = nil, movedTo: String? = nil) { self.isIntrospectable = isIntrospectable self.isDeprecated = isDeprecated self.deprecatedVersion = deprecatedVersion self.shadowedBy = shadowedBy self.shadows = shadows self.movedTo = movedTo } /// Whether the symbol is a candidate for binding at all. /// /// False for non-introspectable symbols, symbols shadowed by a /// higher-fidelity variant, and symbols that have moved elsewhere. public var isBindable: Bool { isIntrospectable && shadowedBy == nil && movedTo == nil } } /// A GIR type reference, covering primitives, named type references, arrays, and optionals. /// /// Corresponds to the `` element in GIR XML. This recursive enum models /// the full GIR type system: scalar primitives, named type references pointing /// to other GIR types, arrays (both GArray and C-style fixed arrays), and /// nullable/optional wrappers. public indirect enum GIRType: Equatable, Sendable { /// No return value (void). case void /// A boolean value, mapped from `gboolean`. case boolean /// A signed 8-bit integer, mapped from `gint8`. case int8 /// A signed 16-bit integer, mapped from `gint16`. case int16 /// A signed 32-bit integer, mapped from `gint32`. case int32 /// A signed 64-bit integer, mapped from `gint64`. case int64 /// An unsigned 8-bit integer, mapped from `guint8`. case uint8 /// An unsigned 16-bit integer, mapped from `guint16`. case uint16 /// An unsigned 32-bit integer, mapped from `guint32`. case uint32 /// An unsigned 64-bit integer, mapped from `guint64`. case uint64 /// A platform-width signed integer, mapped from `glong`. case long /// A platform-width unsigned integer, mapped from `gulong`. case ulong /// A pointer-width unsigned size, mapped from `gsize`. case size /// A pointer-width signed size, mapped from `gssize`. case ssize /// A single C character, mapped from `gchar`. case char /// A single unsigned C character, mapped from `guchar`. case uchar /// A UCS-4 code point, mapped from `gunichar`. case unichar /// A GObject type identifier, mapped from `GType`. case gtype /// A single-precision floating-point value, mapped from `gfloat`. case float /// A double-precision floating-point value, mapped from `gdouble`. case double /// A null-terminated UTF-8 string, mapped from `utf8`. case string /// A filename string (platform-dependent encoding), mapped from `filename`. case filename /// An opaque pointer, mapped from `gpointer`. case pointer /// A variadic argument list, mapped from `va_list`. Never bindable. case vaList /// A reference to a named type, possibly from another namespace. /// - Parameters: /// - String: The type name, e.g. `"Widget"`. /// - namespace: The namespace qualifier, or `nil` for the current namespace. case typeRef(String, namespace: String?) /// A GLib container type (`GList`, `GSList`, `GHashTable`, …) with its /// element types, in GIR declaration order. /// /// Kept distinct from ``typeRef(_:namespace:)`` so the planner can reason /// about element bridging rather than treating a container as an opaque /// named type. case container(ContainerKind, elements: [GIRType]) /// A C array of the given element type, with its length metadata. case cArray(GIRType, ArrayInfo) /// An optional (nullable) value of the given type. case `optional`(GIRType) /// Creates a type reference in the current namespace. /// - Parameter name: The unqualified type name. /// - Returns: A `typeRef` with no namespace qualifier. public static func typeRef(_ name: String) -> GIRType { .typeRef(name, namespace: nil) } /// Creates a C array with no length metadata. /// /// Such arrays cannot be bridged; the planner skips callables using them /// with ``SkipReason/arrayWithoutLength``. /// /// - Parameter element: The array's element type. /// - Returns: A `cArray` with empty ``ArrayInfo``. public static func cArray(_ element: GIRType) -> GIRType { .cArray(element, ArrayInfo()) } } /// The kind of a GLib container type. /// /// Containers carry their elements' types separately from their own identity, /// which is what lets the planner decide whether the elements can be bridged. public enum ContainerKind: String, Equatable, Sendable { /// A doubly-linked `GList`. case list /// A singly-linked `GSList`. case slist /// A `GHashTable` mapping keys to values. case hashTable /// A `GArray` of elements. case array /// A `GPtrArray` of pointers. case ptrArray /// A `GByteArray` of bytes. case byteArray } extension GIRType { /// True for primitive types that don't need C enum/string/pointer bridging. /// These can be used in function parameters without the complex C type /// resolution that Phase C1 will provide. var isSimplePrimitive: Bool { switch self { case .void, .boolean, .int8, .int16, .int32, .int64, .uint8, .uint16, .uint32, .uint64, .long, .ulong, .size, .ssize, .float, .double: return true default: return false } } }