summaryrefslogtreecommitdiff
path: root/vala/valagirparser.vala
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-01-14 17:55:34 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2021-01-14 17:55:34 +0100
commit34e96b785871497249a705260b8c694f7180a256 (patch)
tree87a548a523aa97f0cb8e5ce85c9bd2c7fad78d0b /vala/valagirparser.vala
parent5db0ee14afe1f9ece272a56745864e81aafa294a (diff)
downloadvala-34e96b785871497249a705260b8c694f7180a256.tar.gz
girparser: Handle anonymous delegate not backed by virtual-method or signal
Diffstat (limited to 'vala/valagirparser.vala')
-rw-r--r--vala/valagirparser.vala22
1 files changed, 22 insertions, 0 deletions
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 65de9ea85..cdea30f2a 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -1136,6 +1136,17 @@ public class Vala.GirParser : CodeVisitor {
var d = ((DelegateType) field.variable_type).delegate_symbol;
parser.process_virtual_method_field (this, d, parent.gtype_struct_for);
merged = true;
+ } else if (field.variable_type is DelegateType) {
+ // anonymous delegate
+ var d = ((DelegateType) field.variable_type).delegate_symbol;
+ if (this.lookup (d.name).parent == this) {
+ d.set_attribute_bool ("CCode", "has_typedef", false);
+ if (d.has_target && !metadata.has_argument (ArgumentType.DELEGATE_TARGET)) {
+ field.set_attribute_bool ("CCode", "delegate_target", false);
+ }
+ d.name = "%s%sFunc".printf (parent.symbol.name, Symbol.lower_case_to_camel_case (d.name));
+ get_parent_namespace (this).add_delegate (d);
+ }
} else if (field.variable_type is ArrayType) {
Node array_length;
if (metadata.has_argument (ArgumentType.ARRAY_LENGTH_FIELD)) {
@@ -1598,6 +1609,17 @@ public class Vala.GirParser : CodeVisitor {
return sym is ObjectTypeSymbol || sym is Struct || sym is Namespace || sym is ErrorDomain || sym is Enum;
}
+ static unowned Namespace get_parent_namespace (Node node) {
+ unowned Node? n = node.parent;
+ while (n != null) {
+ if (n.symbol is Namespace) {
+ return (Namespace) n.symbol;
+ }
+ n = n.parent;
+ }
+ assert_not_reached ();
+ }
+
UnresolvedSymbol? parse_symbol_from_string (string symbol_string, SourceReference? source_reference = null) {
UnresolvedSymbol? sym = null;
foreach (unowned string s in symbol_string.split (".")) {