diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2016-12-10 20:02:46 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2017-01-04 15:00:44 +0100 |
commit | c47ec4cf93b8e60f2b30d667cb44cca7415e04bb (patch) | |
tree | 17d83d38f00ef473e6ecd242f21cd9eb33485e35 | |
parent | 4e3103bfd1928b080df77b68e6015fae609ad351 (diff) | |
download | vala-c47ec4cf93b8e60f2b30d667cb44cca7415e04bb.tar.gz |
girparser: Improve function to method conversion
Update the array-length, closure and destroy indexes if needed.
Drop instance_pos attribute if it refers to the first parameter which is
the default anyway.
-rw-r--r-- | vala/valagirparser.vala | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala index 892afb42f..a4150fd98 100644 --- a/vala/valagirparser.vala +++ b/vala/valagirparser.vala @@ -3145,6 +3145,18 @@ public class Vala.GirParser : CodeVisitor { s.set_attribute_string ("CCode", "finish_name", metadata.get_string (ArgumentType.FINISH_NAME)); } + int instance_idx = -2; + if (element_name == "function" && symbol_type == "method") { + if (metadata.has_argument (ArgumentType.INSTANCE_IDX)) { + instance_idx = metadata.get_integer (ArgumentType.INSTANCE_IDX); + if (instance_idx != 0) { + s.set_attribute_double ("CCode", "instance_pos", instance_idx + 0.5); + } + } else { + Report.error (get_current_src (), "instance_idx required when converting function to method"); + } + } + var parameters = new ArrayList<ParameterInfo> (); current.array_length_parameters = new ArrayList<int> (); current.closure_parameters = new ArrayList<int> (); @@ -3153,13 +3165,21 @@ public class Vala.GirParser : CodeVisitor { start_element ("parameters"); next (); + var current_parameter_idx = -1; while (current_token == MarkupTokenType.START_ELEMENT) { + current_parameter_idx++; + if (reader.name == "instance-parameter" && !(symbol_type == "function" || symbol_type == "constructor")) { skip_element (); continue; } + if (instance_idx > -2 && instance_idx == current_parameter_idx) { + skip_element (); + continue; + } + if (!push_metadata ()) { skip_element (); continue; @@ -3172,12 +3192,21 @@ public class Vala.GirParser : CodeVisitor { 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); if (array_length_idx != -1) { + if (instance_idx > -2 && instance_idx < array_length_idx) { + array_length_idx--; + } current.array_length_parameters.add (array_length_idx); } if (closure_idx != -1) { + if (instance_idx > -2 && instance_idx < closure_idx) { + closure_idx--; + } current.closure_parameters.add (closure_idx); } if (destroy_idx != -1) { + if (instance_idx > -2 && instance_idx < destroy_idx) { + destroy_idx--; + } current.destroy_parameters.add (destroy_idx); } if (param_comment != null) { @@ -3219,16 +3248,6 @@ public class Vala.GirParser : CodeVisitor { } } - if (element_name == "function" && symbol_type == "method") { - if (metadata.has_argument (ArgumentType.INSTANCE_IDX)) { - int instance_pos = metadata.get_integer (ArgumentType.INSTANCE_IDX); - s.set_attribute_double ("CCode", "instance_pos", instance_pos + 0.5); - parameters.remove_at (instance_pos); - } else { - Report.error (get_current_src (), "instance_idx required when converting function to method"); - } - } - pop_node (); end_element (element_name); } |