[vala] girparser: Fix support for boxed types
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] girparser: Fix support for boxed types
- Date: Thu, 8 Jul 2010 20:34:17 +0000 (UTC)
commit f4ee97b1b2d99915bff8c209c04731ed9dc53866
Author: Jürg Billeter <j bitron ch>
Date: Thu Jul 8 21:16:04 2010 +0200
girparser: Fix support for boxed types
Fixes bug 623254.
vala/valagirparser.vala | 38 +++++++++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 11 deletions(-)
---
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index e6445cb..3f77a15 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -232,7 +232,11 @@ public class Vala.GirParser : CodeVisitor {
} else if (reader.name == "callback") {
sym = parse_callback ();
} else if (reader.name == "record") {
- sym = parse_record ();
+ if (reader.get_attribute ("glib:get-type") != null) {
+ sym = parse_boxed ();
+ } else {
+ sym = parse_record ();
+ }
} else if (reader.name == "class") {
sym = parse_class ();
} else if (reader.name == "interface") {
@@ -1103,17 +1107,25 @@ public class Vala.GirParser : CodeVisitor {
return sig;
}
- Struct parse_boxed () {
- start_element ("glib:boxed");
- var st = new Struct (reader.get_attribute ("glib:name"));
- st.access = SymbolAccessibility.PUBLIC;
- st.external = true;
+ Class parse_boxed () {
+ string name = reader.get_attribute ("name");
+ if (name == null) {
+ name = reader.get_attribute ("glib:name");
+ }
+ var cl = new Class (name);
+ cl.access = SymbolAccessibility.PUBLIC;
+ cl.external = true;
+ cl.is_compact = true;
string cname = reader.get_attribute ("c:type");
if (cname != null) {
- st.set_cname (cname);
+ cl.set_cname (cname);
}
+ cl.set_type_id ("%s ()".printf (reader.get_attribute ("glib:get-type")));
+ cl.set_free_function ("g_boxed_free");
+ cl.set_dup_function ("g_boxed_copy");
+
next ();
while (current_token == MarkupTokenType.START_ELEMENT) {
@@ -1123,11 +1135,11 @@ public class Vala.GirParser : CodeVisitor {
}
if (reader.name == "field") {
- st.add_field (parse_field ());
+ cl.add_field (parse_field ());
} else if (reader.name == "constructor") {
parse_constructor ();
} else if (reader.name == "method") {
- st.add_method (parse_method ("method"));
+ cl.add_method (parse_method ("method"));
} else {
// error
Report.error (get_current_src (), "unknown child element `%s' in `class'".printf (reader.name));
@@ -1135,8 +1147,12 @@ public class Vala.GirParser : CodeVisitor {
}
}
- end_element ("glib:boxed");
- return st;
+ if (current_token != MarkupTokenType.END_ELEMENT) {
+ // error
+ Report.error (get_current_src (), "expected end element");
+ }
+ next ();
+ return cl;
}
Struct parse_union () {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]