[vala/staging] girparser: Improve instance method detection
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] girparser: Improve instance method detection
- Date: Thu, 5 Aug 2021 13:31:11 +0000 (UTC)
commit 2549173c70f2e072d439576a4153e182d6806d9b
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Tue Aug 3 18:11:06 2021 +0200
girparser: Improve instance method detection
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1210
vala/valagirparser.vala | 32 +++++++++++++++++++++++++++++---
1 file 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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]