diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-08-03 18:11:06 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-08-05 15:30:34 +0200 |
commit | 484c97c237a0291a593cd8b3694e999c8582cf44 (patch) | |
tree | a74c71714f2c7e9e69efc055226eb0878a00410b /vala/valagirparser.vala | |
parent | f00ba57991b3068b5ba0d7391bbf9b0d3522deeb (diff) | |
download | vala-484c97c237a0291a593cd8b3694e999c8582cf44.tar.gz |
girparser: Improve instance method detection
See https://gitlab.gnome.org/GNOME/vala/issues/1210
Diffstat (limited to 'vala/valagirparser.vala')
-rw-r--r-- | vala/valagirparser.vala | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala index ee28f8350..7203a88aa 100644 --- a/vala/valagirparser.vala +++ b/vala/valagirparser.vala @@ -1326,7 +1326,9 @@ public class Vala.GirParser : CodeVisitor { } if (node.new_symbol && !node.merged && !metadata.get_bool (ArgumentType.HIDDEN)) { - add_symbol_to_container (symbol, node.symbol); + if (symbol.name == null || node.lookup (symbol.name) == null) { + add_symbol_to_container (symbol, node.symbol); + } } } @@ -2570,7 +2572,7 @@ public class Vala.GirParser : CodeVisitor { return type; } - Parameter parse_parameter (out int array_length_idx = null, out int closure_idx = null, out int destroy_idx = null, out string? scope = null, out Comment? comment = null, string? default_name = null) { + Parameter parse_parameter (out bool caller_allocates, out int array_length_idx = null, out int closure_idx = null, out int destroy_idx = null, out string? scope = null, out Comment? comment = null, string? default_name = null) { var begin = this.begin; Parameter param; @@ -2609,6 +2611,7 @@ public class Vala.GirParser : CodeVisitor { string nullable = reader.get_attribute ("nullable"); string allow_none = reader.get_attribute ("allow-none"); + caller_allocates = reader.get_attribute ("caller-allocates") == "1"; scope = element_get_string ("scope", ArgumentType.SCOPE); string closure = reader.get_attribute ("closure"); @@ -3223,6 +3226,7 @@ public class Vala.GirParser : CodeVisitor { public bool is_async; public bool is_async_result; public bool is_error; + public bool caller_allocates; } void parse_function (string element_name) { @@ -3454,12 +3458,13 @@ public class Vala.GirParser : CodeVisitor { continue; } + bool caller_allocates; int array_length_idx, closure_idx, destroy_idx; string scope; string default_param_name = null; Comment? param_comment; default_param_name = "arg%d".printf (parameters.size); - var param = parse_parameter (out array_length_idx, out closure_idx, out destroy_idx, out scope, out param_comment, default_param_name); + var param = parse_parameter (out caller_allocates, out array_length_idx, out closure_idx, out destroy_idx, out scope, out param_comment, default_param_name); if (is_instance_parameter) { unowned Method? m = s as Method; @@ -3509,6 +3514,7 @@ public class Vala.GirParser : CodeVisitor { } var info = new ParameterInfo (param, array_length_idx, closure_idx, destroy_idx, scope == "async"); + info.caller_allocates = caller_allocates; parameters.add (info); pop_metadata (); } @@ -3995,6 +4001,7 @@ public class Vala.GirParser : CodeVisitor { } } + bool first_param = true; foreach (ParameterInfo info in parameters) { unowned DataType type = info.param.variable_type; @@ -4045,6 +4052,25 @@ public class Vala.GirParser : CodeVisitor { info.keep = false; } } + + // Try to transform static function to instance method + if (first_param && info.keep && type != null && s is Method && ((Method) s).binding == MemberBinding.STATIC) { + Symbol? sym; + if (type is UnresolvedType) { + sym = resolve_symbol (node.parent, ((UnresolvedType) type).unresolved_symbol); + } else { + sym = type.type_symbol; + } + if (sym == node.parent.symbol && !type.nullable + && ((sym is TypeSymbol && info.param.direction == ParameterDirection.IN) + || (info.caller_allocates && info.param.direction == ParameterDirection.OUT + && (sym is Struct || (sym is Class && ((Class) sym).is_compact))))) { + ((Method) s).binding = MemberBinding.INSTANCE; + info.keep = false; + } + } + + first_param = false; } // Add null-literal as default-value for trailing GLib.Cancellable parameters |