diff options
author | Princeton Ferro <princetonferro@gmail.com> | 2021-07-15 02:32:00 -0400 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-08-18 13:47:50 +0200 |
commit | cf3a4087bcc5dd443f1eb99b893fe8cb2c536ab8 (patch) | |
tree | 173b0285b376ea8a34f75d87dce453273faa8df1 /vala/valagirparser.vala | |
parent | 9471ab001c713598702c0a35ac9c93d01b6233ef (diff) | |
download | vala-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.vala | 25 |
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; } } |