From 4eaf735732561e4fbcc0739669d47a62e77a6fed Mon Sep 17 00:00:00 2001 From: James Westman Date: Thu, 6 Jul 2023 20:13:49 -0500 Subject: [PATCH] gir: Fix signatures for properties and signals Add arguments to signal signatures and fix property signatures --- blueprintcompiler/gir.py | 49 ++++++++++++++++++++++++++++-------- blueprintcompiler/typelib.py | 13 ++++++++++ 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/blueprintcompiler/gir.py b/blueprintcompiler/gir.py index 2986447..6e37626 100644 --- a/blueprintcompiler/gir.py +++ b/blueprintcompiler/gir.py @@ -318,7 +318,7 @@ class Property(GirNode): @cached_property def signature(self): - return f"{self.full_name} {self.container.name}.{self.name}" + return f"{self.type.full_name} {self.container.name}:{self.name}" @property def writable(self) -> bool: @@ -329,27 +329,56 @@ class Property(GirNode): return self.tl.PROP_CONSTRUCT_ONLY == 1 -class Parameter(GirNode): +class Argument(GirNode): def __init__(self, container: GirNode, tl: typelib.Typelib) -> None: super().__init__(container, tl) + @cached_property + def name(self) -> str: + return self.tl.ARG_NAME + + @cached_property + def type(self) -> GirType: + return self.get_containing(Repository)._resolve_type_id(self.tl.ARG_TYPE) + + +class Signature(GirNode): + def __init__(self, container: GirNode, tl: typelib.Typelib) -> None: + super().__init__(container, tl) + + @cached_property + def args(self) -> T.List[Argument]: + n_arguments = self.tl.SIGNATURE_N_ARGUMENTS + blob_size = self.tl.header.HEADER_ARG_BLOB_SIZE + result = [] + for i in range(n_arguments): + entry = self.tl.SIGNATURE_ARGUMENTS[i * blob_size] + result.append(Argument(self, entry)) + return result + + @cached_property + def return_type(self) -> GirType: + return self.get_containing(Repository)._resolve_type_id( + self.tl.SIGNATURE_RETURN_TYPE + ) + class Signal(GirNode): def __init__( self, klass: T.Union["Class", "Interface"], tl: typelib.Typelib ) -> None: super().__init__(klass, tl) - # if parameters := xml.get_elements('parameters'): - # self.params = [Parameter(self, child) for child in parameters[0].get_elements('parameter')] - # else: - # self.params = [] + + @cached_property + def gir_signature(self) -> Signature: + return Signature(self, self.tl.SIGNAL_SIGNATURE) @property def signature(self): - # TODO: fix - # args = ", ".join([f"{p.type_name} {p.name}" for p in self.params]) - args = "" - return f"signal {self.container.name}.{self.name} ({args})" + args = ", ".join( + [f"{a.type.full_name} {a.name}" for a in self.gir_signature.args] + ) + return f"signal {self.container.full_name}::{self.name} ({args})" class Interface(GirNode, GirType): diff --git a/blueprintcompiler/typelib.py b/blueprintcompiler/typelib.py index 8de06c5..2ce3e32 100644 --- a/blueprintcompiler/typelib.py +++ b/blueprintcompiler/typelib.py @@ -118,6 +118,7 @@ class Typelib: HEADER_FUNCTION_BLOB_SIZE = Field(0x3E, "u16") HEADER_CALLBACK_BLOB_SIZE = Field(0x40, "u16") HEADER_SIGNAL_BLOB_SIZE = Field(0x42, "u16") + HEADER_ARG_BLOB_SIZE = Field(0x46, "u16") HEADER_PROPERTY_BLOB_SIZE = Field(0x48, "u16") HEADER_FIELD_BLOB_SIZE = Field(0x4A, "u16") HEADER_VALUE_BLOB_SIZE = Field(0x4C, "u16") @@ -132,6 +133,13 @@ class Typelib: DIR_ENTRY_OFFSET = Field(0x8, "pointer") DIR_ENTRY_NAMESPACE = Field(0x8, "string") + ARG_NAME = Field(0x0, "string") + ARG_TYPE = Field(0xC, "u32") + + SIGNATURE_RETURN_TYPE = Field(0x0, "u32") + SIGNATURE_N_ARGUMENTS = Field(0x6, "u16") + SIGNATURE_ARGUMENTS = Field(0x8, "offset") + ATTR_OFFSET = Field(0x0, "u32") ATTR_NAME = Field(0x0, "string") ATTR_VALUE = Field(0x0, "string") @@ -180,6 +188,11 @@ class Typelib: PROP_CONSTRUCT_ONLY = Field(0x4, "u32", 4, 1) PROP_TYPE = Field(0xC, "u32") + SIGNAL_DEPRECATED = Field(0x0, "u16", 0, 1) + SIGNAL_DETAILED = Field(0x0, "u16", 5, 1) + SIGNAL_NAME = Field(0x4, "string") + SIGNAL_SIGNATURE = Field(0xC, "pointer") + VALUE_NAME = Field(0x4, "string") VALUE_VALUE = Field(0x8, "i32")