summaryrefslogtreecommitdiff
path: root/vala/valagirparser.vala
diff options
context:
space:
mode:
authorPrinceton Ferro <princetonferro@gmail.com>2021-07-15 02:32:00 -0400
committerRico Tzschichholz <ricotz@ubuntu.com>2021-08-18 13:47:50 +0200
commitcf3a4087bcc5dd443f1eb99b893fe8cb2c536ab8 (patch)
tree173b0285b376ea8a34f75d87dce453273faa8df1 /vala/valagirparser.vala
parent9471ab001c713598702c0a35ac9c93d01b6233ef (diff)
downloadvala-cf3a4087bcc5dd443f1eb99b893fe8cb2c536ab8.tar.gz
girwriter: Improve struct creation method binding
Struct creation methods are supposed to have `void` return type and take an implicit `self` as the first instance parameter.
Diffstat (limited to 'vala/valagirparser.vala')
-rw-r--r--vala/valagirparser.vala25
1 files changed, 22 insertions, 3 deletions
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 9db320a72..a005efdb0 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -3475,10 +3475,29 @@ public class Vala.GirParser : CodeVisitor {
}
pop_metadata ();
continue;
- } else {
- //TODO can more be done here?
- m.binding = MemberBinding.STATIC;
+ } else if (current.parent.symbol is Struct
+ && caller_allocates && param.direction == ParameterDirection.OUT) {
+ // struct methods that have instance parameters with 'out' direction are usually creation methods
+ string? cm_name = m.name;
+ if (cm_name != null && (cm_name == "init" || cm_name.has_prefix ("init_"))) {
+ if (cm_name == "init") {
+ cm_name = null;
+ } else if (cm_name.has_prefix ("init_")) {
+ cm_name = cm_name.substring ("init_".length);
+ }
+ s = new CreationMethod (null, cm_name, m.source_reference, m.comment);
+ s.access = SymbolAccessibility.PUBLIC;
+ current.symbol = s;
+ pop_metadata ();
+ continue;
+ }
+ } else if (current.parent.symbol is Class && ((Class) current.parent.symbol).is_compact
+ && caller_allocates && param.direction == ParameterDirection.OUT) {
+ pop_metadata ();
+ continue;
}
+ //TODO can more be done here?
+ m.binding = MemberBinding.STATIC;
}
}