summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Nemerson <evan@coeus-group.com>2012-08-13 11:41:01 -0700
committerEvan Nemerson <evan@coeus-group.com>2012-08-16 12:12:52 -0700
commitefae1d332ee6fdd12ad3a4b5e5e55acdc668aa86 (patch)
tree43708b202df5099c4aaa6b1e3c8a2bf433c12f69
parent22ec8fe6c183fce66917136787dd6b9e28c49419 (diff)
downloadvala-efae1d332ee6fdd12ad3a4b5e5e55acdc668aa86.tar.gz
girparser: support symbol_type and instance_idx in metadata
-rw-r--r--vala/valagirparser.vala31
1 files changed, 25 insertions, 6 deletions
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 7f32257f5..3e42d5425 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -72,7 +72,9 @@ public class Vala.GirParser : CodeVisitor {
ERRORDOMAIN,
DESTROYS_INSTANCE,
BASE_TYPE,
- FINISH_NAME;
+ FINISH_NAME,
+ SYMBOL_TYPE,
+ INSTANCE_IDX;
public static ArgumentType? from_string (string name) {
var enum_class = (EnumClass) typeof(ArgumentType).class_ref ();
@@ -2740,6 +2742,13 @@ public class Vala.GirParser : CodeVisitor {
start_element (element_name);
push_node (element_get_name (reader.get_attribute ("invoker")).replace ("-", "_"), false);
+ string symbol_type;
+ if (metadata.has_argument (ArgumentType.SYMBOL_TYPE)) {
+ symbol_type = metadata.get_string (ArgumentType.SYMBOL_TYPE);
+ } else {
+ symbol_type = element_name;
+ }
+
string name = current.name;
string throws_string = reader.get_attribute ("throws");
string invoker = reader.get_attribute ("invoker");
@@ -2768,10 +2777,10 @@ public class Vala.GirParser : CodeVisitor {
Symbol s;
- if (element_name == "callback") {
+ if (symbol_type == "callback") {
s = new Delegate (name, return_type, current.source_reference);
((Delegate) s).has_target = false;
- } else if (element_name == "constructor") {
+ } else if (symbol_type == "constructor") {
if (name == "new") {
name = null;
} else if (name.has_prefix ("new_")) {
@@ -2788,7 +2797,7 @@ public class Vala.GirParser : CodeVisitor {
m.set_attribute_string ("CCode", "type", return_ctype);
}
s = m;
- } else if (element_name == "glib:signal") {
+ } else if (symbol_type == "glib:signal") {
s = new Signal (name, return_type, current.source_reference);
} else {
s = new Method (name, return_type, current.source_reference);
@@ -2800,7 +2809,7 @@ public class Vala.GirParser : CodeVisitor {
if (s is Method) {
var m = (Method) s;
- if (element_name == "virtual-method" || element_name == "callback") {
+ if (symbol_type == "virtual-method" || symbol_type == "callback") {
if (current.parent.symbol is Interface) {
m.is_abstract = true;
} else {
@@ -2811,7 +2820,7 @@ public class Vala.GirParser : CodeVisitor {
} if (current.girdata["name"] != name) {
m.set_attribute_string ("CCode", "vfunc_name", current.girdata["name"]);
}
- } else if (element_name == "function") {
+ } else if (symbol_type == "function") {
m.binding = MemberBinding.STATIC;
}
}
@@ -2936,6 +2945,16 @@ 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);
}